Python의 부분 최소 제곱(단계별)
기계 학습에서 직면하게 되는 가장 일반적인 문제 중 하나는 다중 공선성 입니다. 이는 데이터 세트에서 두 개 이상의 예측 변수가 높은 상관 관계를 가질 때 발생합니다.
이런 일이 발생하면 모델은 훈련 데이터 세트에 잘 맞을 수 있지만, 훈련 데이터 세트에 과적합되기 때문에 본 적이 없는 새로운 데이터 세트에서는 성능이 저하 될 수 있습니다. 트레이닝 세트.
이 문제를 해결하는 한 가지 방법은 다음과 같이 작동하는 부분 최소 제곱 법을 사용하는 것입니다.
- 예측 변수와 반응 변수를 표준화합니다.
- 반응 변수와 예측 변수 모두에서 상당한 양의 변동을 설명하는 p개의 원래 예측 변수 의 M개의 선형 조합(“PLS 구성 요소”라고 함)을 계산합니다 .
- PLS 구성요소를 예측 변수로 사용하여 선형 회귀 모델을 맞추려면 최소 제곱법을 사용합니다.
- k-겹 교차 검증을 사용하여 모델에 유지할 최적의 PLS 구성 요소 수를 찾습니다.
이 튜토리얼에서는 Python에서 부분 최소 제곱을 수행하는 방법에 대한 단계별 예를 제공합니다.
1단계: 필요한 패키지 가져오기
먼저 Python에서 부분 최소 제곱을 수행하는 데 필요한 패키지를 가져옵니다.
import numpy as np
import pandas as pd
import matplotlib. pyplot as plt
from sklearn. preprocessing import scale
from sklearn import model_selection
from sklearn. model_selection import RepeatedKFold
from sklearn. model_selection import train_test_split
from sklearn. cross_decomposition import PLSRegression
from sklearn . metrics import mean_squared_error
2단계: 데이터 로드
이 예에서는 33개의 서로 다른 자동차에 대한 정보가 포함된 mtcars 라는 데이터 세트를 사용합니다. hp를 반응 변수로 사용하고 다음 변수를 예측 변수로 사용합니다.
- mpg
- 표시하다
- 똥
- 무게
- q초
다음 코드는 이 데이터세트를 로드하고 표시하는 방법을 보여줍니다.
#define URL where data is located
url = "https://raw.githubusercontent.com/Statorials/Python-Guides/main/mtcars.csv"
#read in data
data_full = pd. read_csv (url)
#select subset of data
data = data_full[["mpg", "disp", "drat", "wt", "qsec", "hp"]]
#view first six rows of data
data[0:6]
mpg disp drat wt qsec hp
0 21.0 160.0 3.90 2.620 16.46 110
1 21.0 160.0 3.90 2.875 17.02 110
2 22.8 108.0 3.85 2.320 18.61 93
3 21.4 258.0 3.08 3.215 19.44 110
4 18.7 360.0 3.15 3.440 17.02 175
5 18.1 225.0 2.76 3.460 20.22 105
3단계: 부분 최소 제곱 모델 피팅
다음 코드는 PLS 모델을 이 데이터에 맞추는 방법을 보여줍니다.
cv = RepeatedKFold()는 Python에 k-겹 교차 검증을 사용하여 모델 성능을 평가하도록 지시합니다 . 이 예에서는 k = 10 접기를 선택하고 3번 반복합니다.
#define predictor and response variables
X = data[["mpg", "disp", "drat", "wt", "qsec"]]
y = data[["hp"]]
#define cross-validation method
cv = RepeatedKFold(n_splits= 10 , n_repeats= 3 , random_state= 1 )
mse = []
n = len (X)
# Calculate MSE with only the intercept
score = -1*model_selection. cross_val_score (PLSRegression(n_components=1),
n.p. ones ((n,1)), y, cv=cv, scoring=' neg_mean_squared_error '). mean ()
mse. append (score)
# Calculate MSE using cross-validation, adding one component at a time
for i in np. arange (1, 6):
pls = PLSRegression(n_components=i)
score = -1*model_selection. cross_val_score (pls, scale(X), y, cv=cv,
scoring=' neg_mean_squared_error '). mean ()
mse. append (score)
#plot test MSE vs. number of components
plt. plot (mse)
plt. xlabel (' Number of PLS Components ')
plt. ylabel (' MSE ')
plt. title (' hp ')
플롯은 x축을 따라 PLS 성분의 수를 표시하고 y축을 따라 MSE(평균 제곱 오차) 테스트를 표시합니다.
그래프에서 두 개의 PLS 구성요소를 추가하면 테스트의 MSE가 감소하지만, 두 개 이상의 PLS 구성요소를 추가하면 증가하기 시작하는 것을 볼 수 있습니다.
따라서 최적의 모델에는 처음 두 개의 PLS 구성요소만 포함됩니다.
4단계: 최종 모델을 사용하여 예측
두 개의 PLS 구성요소가 포함된 최종 PLS 모델을 사용하여 새로운 관측값에 대해 예측할 수 있습니다.
다음 코드는 원본 데이터 세트를 훈련 세트와 테스트 세트로 분할하고 두 개의 PLS 구성요소가 있는 PLS 모델을 사용하여 테스트 세트에 대해 예측하는 방법을 보여줍니다.
#split the dataset into training (70%) and testing (30%) sets
X_train , _
#calculate RMSE
pls = PLSRegression(n_components=2)
pls. fit (scale(X_train), y_train)
n.p. sqrt (mean_squared_error(y_test, pls. predict (scale(X_test))))
29.9094
테스트의 RMSE는 29.9094 로 나타났습니다. 이는 테스트 세트 관찰에 대해 예측된 HP 값과 관찰된 HP 값 사이의 평균 편차입니다.
이 예제에 사용된 전체 Python 코드는 여기에서 찾을 수 있습니다.
