KRR(Kernel Ridge Regression)

2021. 3. 23. 21:54머신러닝

반응형

이번 포스팅에서는 Parametric한 방법론으로, Kernel Trick을 활용한 Regression에 대해서 다루어보도록 하겠습니다. Kernel Trick을 활용한 Regression은 Basis Expansion과 개념적으로 동일하게 Input 변수 X를 커널함수를 활용하여 Mapping한 변수를 활용하여 파라미터를 추정하는 것입니다. (Basis Expansion 개념의 쉬운 예로 Polynomial Regression같은 경우는 Input X를 제곱, 세제곱하여 새로운 값를 만들어 Regression을 하여 특정 Parameter $\beta$를 추정하였습니다.)

[Kernel Ridge Regression]

Kernel Ridge Regression의 경우에는, 위에서 정리된 것과 동일하게 Mapping된 Value를 가지고 Ridge Regression을 수행하는 것입니다. 여기서 

python의 sklearn에서 해당 개념을 활용한 Method를 제공하고 있습니다.

기존의 Ridge Regression은 아래의 같은 RSS(Residual sum of squares)를 최소화 하는 것이였습니다.

그렇다면 Kernel Ridge Regression은 X를 Mapping한 $\phi$에 대해 위의 식을 최소화하는 Parameter를 구하는 것이고 아래와 같은 RSS를 최소화하도록 합니다.

Python의 sklearn에서 Kernel Ridge Regression을 위한 Method를 제공해주고 있습니다. 이를 직접해보기전에 주요 Kernel 함수에 대해서 정리해보도록 하겠습니다.

(1) Linear Function 

(2) Polynomial Function

(3) Radial basis Function(Gaussian)

실습 데이터로 일전에 Spline을 정리할 때 활용한 Wage 데이터를 활용하도록 하겠습니다.(direction-f.tistory.com/85)

import pandas as pd
import numpy as np

from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.kernel_ridge import KernelRidge

import matplotlib.pyplot as plt 
import seaborn as sns
sns.set()


##Data Loading
data = pd.read_csv("Wage.csv")
data.head()
data.info()
data_x = data["age"]
data_y =data["wage"]
train_x, valid_x, train_y, valid_y = train_test_split(data_x, data_y, test_size=0.33, random_state=7)

## KRR without penalty

clf_linear = KernelRidge(kernel ='linear', alpha=0.0)
clf_poly = KernelRidge(kernel ='polynomial', alpha=0.0, gamma = 2)
clf_rbf = KernelRidge(kernel ='rbf', alpha=0.0, gamma = 0.5)

clf_linear.fit(train_x.values.reshape(-1,1),train_y.values.reshape(-1,1))
clf_poly.fit(train_x.values.reshape(-1,1),train_y.values.reshape(-1,1))
clf_rbf.fit(train_x.values.reshape(-1,1),train_y.values.reshape(-1,1))

## MSE
mean_squared_error(clf_linear.predict(valid_x.values.reshape(-1,1)), valid_y.values.reshape(-1,1))
#2304.503244209303

mean_squared_error(clf_poly.predict(valid_x.values.reshape(-1,1)), valid_y.values.reshape(-1,1))
#1777.963029016196

mean_squared_error(clf_rbf.predict(valid_x.values.reshape(-1,1)), valid_y.values.reshape(-1,1))
#1943.5659039652628

##시각화
xp = np.linspace(valid_x.min(),valid_x.max(),100).reshape(-1,1)

plt.scatter(valid_x.values, valid_y, label = "original" , facecolor='None', edgecolor='k', alpha=0.3)
plt.plot(xp, clf_linear.predict(xp), label = 'linear' , color = "r")
plt.plot(xp, clf_poly.predict(xp), label = 'polynomial', color = "g")
plt.plot(xp, clf_rbf.predict(xp), label = 'rbf', color = "b")
plt.legend()
plt.show()

반응형

'머신러닝' 카테고리의 다른 글

커널 밀도 추정 기반 Classification  (0) 2021.04.19
커널 밀도 추정(Kernel Density Estimation, KDE)  (0) 2021.04.12
Kernel Regression  (0) 2021.03.23
Smoothing Spline  (0) 2021.03.12
Natural Cubic Spline  (0) 2021.03.09