라쏘(Lasso), 릿지(Ridge), 엘라스틱넷(ElasticNet)은 모두 선형 회귀(Linear Regression)의 일종으로, 종속 변수와 독립 변수 간의 선형 관계를 모델링하는 알고리즘입니다.¶
라쏘(Lasso): L1 규제를 사용하여 모델의 가중치를 0으로 축소시키는 특성이 있습니다. 이는 변수 선택(Feature Selection)의 효과를 가지며, 일부 계수를 0으로 만들어 해당 변수가 예측 모델에 영향을 주지 않도록 만듭니다. 이러한 특성으로 인해, Lasso는 변수 선택이 중요한 문제에서 사용됩니다.¶
릿지(Ridge): L2 규제를 사용하여 모델의 가중치를 축소시키는 특성이 있습니다. L2 규제는 가중치 값을 작게 만들어 overfitting을 방지하는 효과가 있습니다. 따라서 Ridge는 변수가 많은 경우에 사용하기 좋습니다.¶
엘라스틱넷(ElasticNet): L1 규제와 L2 규제를 함께 사용하는 알고리즘입니다. 따라서 Lasso와 Ridge의 특징을 모두 가지고 있습니다. 엘라스틱넷은 변수 선택과 overfitting을 동시에 해결할 수 있으며, 두 규제의 하이퍼파라미터를 조절하여 L1 규제와 L2 규제의 비중을 조절할 수 있습니다.¶
In [5]:
#코드실습
from sklearn.datasets import load_diabetes
import pandas as pd
diabetes = load_diabetes() #데이터 불러오기
x = pd.DataFrame(diabetes.data, columns = diabetes.feature_names)
y = diabetes.target
Out[5]:
array([151., 75., 141., 206., 135., 97., 138., 63., 110., 310., 101.,
69., 179., 185., 118., 171., 166., 144., 97., 168., 68., 49.,
68., 245., 184., 202., 137., 85., 131., 283., 129., 59., 341.,
87., 65., 102., 265., 276., 252., 90., 100., 55., 61., 92.,
259., 53., 190., 142., 75., 142., 155., 225., 59., 104., 182.,
128., 52., 37., 170., 170., 61., 144., 52., 128., 71., 163.,
150., 97., 160., 178., 48., 270., 202., 111., 85., 42., 170.,
200., 252., 113., 143., 51., 52., 210., 65., 141., 55., 134.,
42., 111., 98., 164., 48., 96., 90., 162., 150., 279., 92.,
83., 128., 102., 302., 198., 95., 53., 134., 144., 232., 81.,
104., 59., 246., 297., 258., 229., 275., 281., 179., 200., 200.,
173., 180., 84., 121., 161., 99., 109., 115., 268., 274., 158.,
107., 83., 103., 272., 85., 280., 336., 281., 118., 317., 235.,
60., 174., 259., 178., 128., 96., 126., 288., 88., 292., 71.,
197., 186., 25., 84., 96., 195., 53., 217., 172., 131., 214.,
59., 70., 220., 268., 152., 47., 74., 295., 101., 151., 127.,
237., 225., 81., 151., 107., 64., 138., 185., 265., 101., 137.,
143., 141., 79., 292., 178., 91., 116., 86., 122., 72., 129.,
142., 90., 158., 39., 196., 222., 277., 99., 196., 202., 155.,
77., 191., 70., 73., 49., 65., 263., 248., 296., 214., 185.,
78., 93., 252., 150., 77., 208., 77., 108., 160., 53., 220.,
154., 259., 90., 246., 124., 67., 72., 257., 262., 275., 177.,
71., 47., 187., 125., 78., 51., 258., 215., 303., 243., 91.,
150., 310., 153., 346., 63., 89., 50., 39., 103., 308., 116.,
145., 74., 45., 115., 264., 87., 202., 127., 182., 241., 66.,
94., 283., 64., 102., 200., 265., 94., 230., 181., 156., 233.,
60., 219., 80., 68., 332., 248., 84., 200., 55., 85., 89.,
31., 129., 83., 275., 65., 198., 236., 253., 124., 44., 172.,
114., 142., 109., 180., 144., 163., 147., 97., 220., 190., 109.,
191., 122., 230., 242., 248., 249., 192., 131., 237., 78., 135.,
244., 199., 270., 164., 72., 96., 306., 91., 214., 95., 216.,
263., 178., 113., 200., 139., 139., 88., 148., 88., 243., 71.,
77., 109., 272., 60., 54., 221., 90., 311., 281., 182., 321.,
58., 262., 206., 233., 242., 123., 167., 63., 197., 71., 168.,
140., 217., 121., 235., 245., 40., 52., 104., 132., 88., 69.,
219., 72., 201., 110., 51., 277., 63., 118., 69., 273., 258.,
43., 198., 242., 232., 175., 93., 168., 275., 293., 281., 72.,
140., 189., 181., 209., 136., 261., 113., 131., 174., 257., 55.,
84., 42., 146., 212., 233., 91., 111., 152., 120., 67., 310.,
94., 183., 66., 173., 72., 49., 64., 48., 178., 104., 132.,
220., 57.])
a값을 설정한 뒤 sklearn의 Ridge를 사용해 모델을 생성한 뒤 fit()로 데이터를 학습 시킨다.¶
In [14]:
from sklearn.linear_model import Ridge
import numpy as np
#로그 스케일로 -3부터 1까지의 범위에서 지정된 5개의 숫자를 생성하는 코드입니다.
alpha = np.logspace(-3,1,5)
data = []
for i,a in enumerate(alpha):
ridge = Ridge(alpha=a, random_state=45)
ridge.fit(x,y)
#ridge 모델의 계수를 가지고 있는
#1차원 NumPy 배열의 값들을 가지고 있는
#Pandas 시리즈를 생성하는 코드입니다.
data.append(pd.Series(np.hstack([ridge.coef_])))
df_ridge = pd.DataFrame(data, index=alpha)
df_ridge.columns = x.columns
df_ridge
Out[14]:
| age | sex | bmi | bp | s1 | s2 | s3 | s4 | s5 | s6 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0.001 | -9.549162 | -239.086958 | 520.369375 | 323.822745 | -712.322159 | 413.379125 | 65.811323 | 167.513007 | 720.939924 | 68.123360 |
| 0.010 | -7.197534 | -234.549764 | 520.588601 | 320.517131 | -380.607135 | 150.484671 | -78.589275 | 130.312521 | 592.347959 | 71.134844 |
| 0.100 | 1.308705 | -207.192418 | 489.695171 | 301.764058 | -83.466034 | -70.826832 | -188.678898 | 115.712136 | 443.812917 | 86.749315 |
| 1.000 | 29.466112 | -83.154276 | 306.352680 | 201.627734 | 5.909614 | -29.515495 | -152.040280 | 117.311732 | 262.944290 | 111.878956 |
| 10.000 | 19.812842 | -0.918430 | 75.416214 | 55.025160 | 19.924621 | 13.948715 | -47.553816 | 48.259433 | 70.143948 | 44.213892 |
In [19]:
import matplotlib.pyplot as plt
#df_ridge에 대한 선 그래프를 그리는 코드입니
plt.semilogx(df_ridge)
plt.xticks(alpha, labels=np.log10(alpha))
plt.legend(labels=df_ridge.columns, bbox_to_anchor=(1,1))
plt.title('Ridge')
plt.xlabel('alpha')
plt.ylabel('Coefficient (size)')
plt.axhline(y=0, linestyle='--', color='black', linewidth=3)
Out[19]:
<matplotlib.lines.Line2D at 0x2b7d2f44b50>
In [21]:
#코드실습
from sklearn.datasets import load_diabetes
import pandas as pd
diabetes = load_diabetes() #데이터 불러오기
x = pd.DataFrame(diabetes.data, columns = diabetes.feature_names)
y = diabetes.target
from sklearn.linear_model import Lasso
#로그 스케일로 -3부터 1까지의 범위에서 지정된 5개의 숫자를 생성하는 코드입니다.
alpha = np.logspace(-3,1,5)
data=[]
for i,a in enumerate(alpha):
lasso = Lasso(alpha = a, random_state=45)
lasso.fit(x,y)
data.append(pd.Series(np.hstack([lasso.coef_])))
df_lasso = pd.DataFrame(data, index=alpha)
df_lasso.columns = x.columns
df_lasso
Out[21]:
| age | sex | bmi | bp | s1 | s2 | s3 | s4 | s5 | s6 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0.001 | -8.996177 | -238.896328 | 520.267403 | 323.423596 | -720.244828 | 421.399753 | 66.733503 | 164.448022 | 725.335558 | 67.476810 |
| 0.010 | -1.304662 | -228.819129 | 525.566130 | 316.168834 | -307.016211 | 89.324647 | -105.078369 | 119.597616 | 571.330356 | 65.008383 |
| 0.100 | -0.000000 | -155.359976 | 517.186795 | 275.077235 | -52.539365 | -0.000000 | -210.157991 | 0.000000 | 483.912648 | 33.673965 |
| 1.000 | 0.000000 | -0.000000 | 367.703860 | 6.298858 | 0.000000 | 0.000000 | -0.000000 | 0.000000 | 307.605418 | 0.000000 |
| 10.000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | -0.000000 | 0.000000 | 0.000000 | 0.000000 |
In [22]:
#df_ridge에 대한 선 그래프를 그리는 코드입니
plt.semilogx(df_lasso)
plt.xticks(alpha, labels=np.log10(alpha))
plt.legend(labels=df_lasso.columns, bbox_to_anchor=(1,1))
plt.title('Lasso')
plt.xlabel('alpha')
plt.ylabel('Coefficient (size)')
plt.axhline(y=0, linestyle='--', color='black', linewidth=3)
Out[22]:
<matplotlib.lines.Line2D at 0x2b7d30d89d0>
엘라스텍넷 : 릿지와 라쏘 회귀를 절충한 알고리즘¶
In [26]:
#코드실습
from sklearn.datasets import load_diabetes
import pandas as pd
diabetes = load_diabetes() #데이터 불러오기
x = pd.DataFrame(diabetes.data, columns = diabetes.feature_names)
y = diabetes.target
from sklearn.linear_model import ElasticNet
import numpy as np
alpha = np.logspace(-3,1,5)
data = []
for i,a in enumerate(alpha):
ela = ElasticNet(alpha = a, l1_ratio=0.5, random_state=45)
ela.fit(x,y)
data.append(pd.Series(np.hstack([ela.coef_])))
df_ela = pd.DataFrame(data, index=alpha)
df_ela.columns = x.columns
df_ela
Out[26]:
| age | sex | bmi | bp | s1 | s2 | s3 | s4 | s5 | s6 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0.001 | 8.706329 | -178.074465 | 450.884335 | 281.068431 | -44.049705 | -77.943898 | -188.957481 | 119.794399 | 393.702359 | 98.944302 |
| 0.010 | 33.147367 | -35.245354 | 211.024367 | 144.559236 | 21.931722 | 0.000000 | -115.619973 | 100.658917 | 185.325911 | 96.257335 |
| 0.100 | 10.286332 | 0.285983 | 37.464655 | 27.544765 | 11.108856 | 8.355892 | -24.120809 | 25.505492 | 35.465700 | 22.894985 |
| 1.000 | 0.359018 | 0.000000 | 3.259767 | 2.204340 | 0.528646 | 0.250935 | -1.861363 | 2.114454 | 3.105835 | 1.769851 |
| 10.000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | -0.000000 | 0.000000 | 0.000000 | 0.000000 |
In [27]:
#df_ridge에 대한 선 그래프를 그리는 코드입니
plt.semilogx(df_ela)
plt.xticks(alpha, labels=np.log10(alpha))
plt.legend(labels=df_ela.columns, bbox_to_anchor=(1,1))
plt.title('Elastic')
plt.xlabel('alpha')
plt.ylabel('Coefficient (size)')
plt.axhline(y=0, linestyle='--', color='black', linewidth=3)
Out[27]:
<matplotlib.lines.Line2D at 0x2b7d3246af0>
'빅데이터분석기사 준비' 카테고리의 다른 글
| 빅분기6장(서포트 벡터 머신) (0) | 2023.05.12 |
|---|---|
| 빅분기6장(로지스틱 회귀) (0) | 2023.05.09 |
| 빅분기6장(단순선형회귀, 다항회귀) (0) | 2023.05.05 |
| 빅데이터분석기사 5장 (0) | 2023.05.02 |
| 빅데이터분석 실기 1유형 준비 (0) | 2023.04.27 |