$\text{cost} = \sum e^2_i + \lambda\sum w^2_i$
$e^2_i$는 잔차(residual)의 제곱합, Ridge는 가중치들의 제곱합을 최소화하기 위함이다.
여기서 $\;\lambda\;$는 잔차 제곱합과 추가적인 제약조건(가중치)의 비중을 조절하기위한 Hyper parameter인데,
$\lambda$가 커질수록, 정규화의 정도가 커져서 어떻게든 제약조건에 맞춰야하기때문에 가중치가 0으로 수렴한다.
반면, $\lambda$가 작아질수록, 정규화 정도가 작아져서 $\lambda$가 0이 되면 일반 선형회귀 모형이 된다.
In [28]:
import numpy as np
import matplotlib.pylab as plt
import seaborn as sns
import pandas as pd
import statsmodels.api as sm
%matplotlib inline
In [30]:
np.random.seed(0) # random-state를 정한다.
n_samples = 30
X = np.sort(np.random.rand(n_samples)) # 0에서 1사이의 값 랜덤 샘플 추출(유니폼분포따름)
y = np.cos(1.5 * np.pi * X) + np.random.randn(n_samples) * 0.1
dfX = pd.DataFrame(X, columns=["x"])
dfX = sm.add_constant(dfX) # 이모님. 여기 상수항 추가~
dfy = pd.DataFrame(y, columns=["y"])
df = pd.concat([dfX,dfy],axis = 1) # 칼럼으로 붙이도록!!
model = sm.OLS.from_formula("y ~ x + I(x**2) + I(x**3) + I(x**4) + I(x**5)", data = df)
result1 = model.fit()
In [32]:
print(result1.summary())
In [40]:
def plot_statsmodels(result):
plt.scatter(X,y)
xx = np.linspace(0,1,1000) # 0부터 1사이까지 1000개의 숫자 생성해주삼
dfxx = pd.DataFrame(xx, columns=["x"])
dfxx = sm.add_constant(dfxx)
plt.plot(xx, result.predict(dfxx))
plt.show()
plot_statsmodels(result1)
In [41]:
result2 = model.fit_regularized(alpha=0.01, L1_wt=0) # Ridge
print(result2.params)
plot_statsmodels(result2)
In [43]:
result3 = model.fit_regularized(alpha=0.01, L1_wt=0.5) # Elastic Net
print(result3.params)
plot_statsmodels(result3)
In [44]:
result4 = model.fit_regularized(alpha=0.01, L1_wt=1) # LASSO
print(result4.params)
plot_statsmodels(result4)
In [ ]: