Dimension Reduction Method(Principal Components Regression, Partial Least Squares)

2021. 2. 3. 00:55머신러닝

반응형

우리가 많은 Input 변수를 가지고 있을 때, Subset Selection, Shrinkage Method는 활용하는 Input 변수의 수를 줄여주는 역할을 하였습니다. 반면에 Dimension Reduction Method는 특정 Input 변수를 활용시 제거하는 것이 아니라, 우리가 가지고 있는 Input 변수의 차원을 압축하여 활용하는 방법입니다.

Dimension Reduction Method는 우리가 가지고 있는 input변수 $X$의 선형결합을 통해 새로운 변수 $Z$를 만들어냅니다. 대표적인 방법으로는 Principal Components Regression(PCR), Parital Least Squares(PLS)가 있습니다.

[Principa Components Regression(PCR)]

먼저 PCR은 차원 축소 방법 중에 대표적인 방법인 PCA를 활용하는 방안입니다. 즉 input 변수 $X$의 주성분을 활용하여 분산을 최대화하도록 새로운 $Z$를 선형결합을 통해 생성합니다. 그 다음 $Z$를 활용하여 종속변수 $y$에 대하여 ols 추정을 합니다. (PCA에 대해서는 ratsgo.github.io/machine%20learning/2017/04/24/PCA/를 참고하시면 좋을 것 같습니다.)

간단하게 PCR이 이루어지는 Step을 표현하면 아래와 같습니다..

Python을 활용하여 PCR을 구현해보도록 하겠습니다. 먼저 PCA를 수행하여 입력 Dimension을 줄입니다. 이 때 PCA로 줄어든 변수들이 기존 입력변수 $X$가 가지고 있는 분산의 60% 이상을 설명할 수 있도록 Dimension을 결정하였습니다.

여기서는 48개의 주성분을 선택하여 PCA를 수행한 후, PCA를 수행한 결과를 바탕으로 회귀분석을 수행하였습니다.

from sklearn.linear_model import LinearRegression
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_regression
import matplotlib.pyplot as plt
import pandas as pd


## Simulating data for regression
X, y = make_regression(n_samples=1000, n_features=100, n_informative=10, n_targets=1, random_state=10, noise=10)
print(X.shape, y.shape)

## Scaling
Xstd = StandardScaler().fit_transform(X)
ystd = StandardScaler().fit_transform(y)

## Selecting the number of components(above 60% of variance explained)
for i in range(30,50):
    pca = PCA(n_components = i)
    pca.fit_transform(Xstd)
    print("n_Components:",i,"explained_variance:", sum(pca.explained_variance_ratio_))
    
   
## PCA
pca = PCA(n_components = 48)
X_pca = pca.fit_transform(Xstd)

## Regression
reg_pca = LinearRegression() 
reg_pca.fit(X_pca, y) 
reg_pca.coef_

[Partial Least Squares(PLS)]

PLS는 PCR과 마찬가지로 input 변수 $X$의 선형결합을 활용하여 새로운 변수 $Z$를 만드는 것은 동일합니다. 다만 PCR이 $X$의 분산을 최대화하도록 $Z$를 만들었다면, PLS는 $X$의 분산뿐만 아니라 동시에 종속변수 $y$와의 공분산도 최대화 하도록 새로운 변수 $Z$를 만듭니다.

PCR과 PLS의 최적화 목적을 수식으로 표현하면 아래와 같습니다.

Python을 활용하여 PLS Regression을 수행해보겠습니다.

from sklearn.cross_decomposition import PLSRegression
from sklearn.metrics import mean_squared_error

r_sq = {}
mse = {}
for i in range(1,50):
    pls = PLSRegression(n_components=i)
    pls.fit(Xstd, ystd)
    r_sq[i]=pls.score(Xstd,ystd)
    mse[i] = mean_squared_error(ystd, pls.predict(Xstd))

plt.plot(r_sq.keys(), r_sq.values(), "ro", alpha =0.5, label = "r_squares")
plt.plot(mse.keys(), mse.values(), "go", alpha =0.5, label = "mse")
plt.legend()
plt.show()

$R^2$와 mse관점에서 Component의 수가 3개일 때부터 수치상 높은 설명력을 가짐을 확인할 수 있습니다.

반응형