'''
< RIDGE REGRESSION >
Cost Function(비용함수) : y (실제 결과값)과 y^ (모델로 추정한 결과값)의 차이(에러)를 제곱해서 합한 것
차이를 그냥 다 더하지 않고 제곱한 이유는
그냥 전부 더하면 0이 되버리기 때문에 차이에 대한 제곱을 더한 것이다.
MSE : Cost Function / 데이터 수(N)
Ridge: Linear Regression 선형 회귀모델의 Cost Function 비용함수에 ALPHA(패널티)를 적용한 것.
여기서 ALPHA(패널티)는 Lambda * 계수(coefficient) 제곱의 합이다.
이때 Lambda 값이 0에 가까워지면 Ridge는 본래 Linear Regression의
Cost Function에 가까워지게 된다.
반면에, Lambda의 값이 어느 정도 크다면,
계수의 크기가 0에 가까워져서 모델의 복잡도가 줄어들고
multicollinearity(다중공선성) 문제의 영향을 줄어들게 할 수 있게 된다.
왜냐면 서로 영향을 미치는 독립변수들의 weight(가중치)가 줄어들기 때문
'''
#Ridge 실습
alphas = range(0,3,1)
weight_ = []
intercept_ = []
for alpha in alphas:
bt_lr_model = Ridge(alpha=alpha, normalize=True, random_state=19)
lr = bt_lr_model.fit(X_trn, y_trn)
bt_lr_pred = bt_lr_model.predict(X_val)
val_mse = round(mean_squared_error(y_val, bt_lr_pred), 3)
weight_.append(lr.coef_)
intercept_.append(lr.intercept_)
trn_r2 = print(round(bt_lr_model.score(X_trn, y_trn), 3))
val_r2 = print(round(bt_lr_model.score(X_val, y_val), 3))
print('weight의 변화',weight_)
print('편향',intercept_)
'''LASSO REGRESSION
Ridge와 수식은 비슷하지만 한 가지 차이점은,
페널티의 계산이 Lambda * coefficient 제곱합이 아니라 Lambda * coefficient 절대값의 합이라는 것
L1 정규화 방식이고, zero coefficient 를 만드는 것이 가능해진다.
즉, 어떤 독립변수의 경우 아예 사라지게 될 수도 있게 되면서 feature selection,
상대적으로 더 중요한 독립변수를 선택할 수 있게 된다.
Lasso는 특정 독립변수의 coefficient 값을 0으로 만들 수 있고
Ridge는 0에 가까워지게 하지만
Lasso처럼 0으로 만들 수는 없다는 차이점이 있다.
'''
from sklearn.linear_model import Lasso
fig1 = plt.figure(figsize=(15,8))
#서브플롯 객체 생성
for i in range(5):
globals()[f'ax{i+1}'] = fig1.add_subplot(2, 3, i+1)
for idx, alpha in enumerate([0, 1, 5, 10, 50]):
lasso= Lasso(alpha=alpha)
lasso.fit(X,y)
sns.barplot(x=lasso.coef_, y=X.columns, ax=globals()[f'ax{idx+1}'])
globals()[f'ax{idx+1}'].set_title(f'[Lasso] alpha = {alpha}')
plt.xlim(-15, 4)
#plt.show()
'''L1 vs L2
Regression = [Prediction]
Regression + Ridge = [Prediction ] + [Bias Variance Trade off]
Regression + Lasso = [Prediction ] + [Bias Variance Trade off] + [Feature Selection]
'''
from sklearn.linear_model import Ridge
fig = plt.figure(figsize=(15,8))
for i in range(6):
globals()[f'ax{i+1}'] = fig.add_subplot(2, 3, i+1)
for idx, alpha in enumerate([0, 1, 5, 10, 50,100]):
ridge = Ridge(alpha=alpha)
ridge.fit(X, y)
sns.barplot(x=ridge.coef_, y=X.columns, ax=globals()[f'ax{idx+1}'])
globals()[f'ax{idx+1}'].set_title(f'[Ridge] alpha = {alpha}')
plt.xlim(-15, 4)
#plt.show()
'''
<ELASTICNET>
Ridge의 L2, Lasso의 L1을 합쳐서 비용함수를 계산한 것이라고 보면 된다.
alpha가 0에 가까우면 elasticNet은 Ridge에 가까워지고,
alpha가 1에 가까우면 elasticNet은 Lasso에 가까워지게 된다.
왜냐,Ridge는 0에 가까워지게 하지만
Lasso처럼 0으로 만들 수는 없다는 차이점이 있으므로.
elasticNet을 사용하게 되면 Ridge처럼 coefficient의 크기를 줄이면서
Lasso처럼 특정 coefficient를 0으로 만들어 버리면서 특정 독립변수를 사라지게 하는
feature selection(상대적으로 더 중요한 독립변수를 선택)를 할 수 있다.
- L1 + L2
- parameter : alpha, l1_ratio
- alpha = a+b
- l1_ratio = a/(a+b )
'''
from sklearn.linear_model import ElasticNet
fig = plt.figure(figsize=(15,8))
for i in range(5):
globals()[f'ax{i+1}'] = fig.add_subplot(2, 3, i+1)
for idx, alpha in enumerate([0, 1, 5, 10, 50]):
elastic = ElasticNet(alpha=alpha)
elastic.fit(X, y)
sns.barplot(x=elastic.coef_, y=X.columns, ax=globals()[f'ax{idx+1}'])
globals()[f'ax{idx+1}'].set_title(f'[ElasticNet] alpha = {alpha}')
plt.xlim(-15, 4)
#plt.show()
'''
따라서, 파라미터를 구할땐,
R2는 제일 높고(제일 설명력이 좋고),
MSE(Mean Squared Error)와
RMSE(Root Mean Squared Error)는 제일 낮은 값이 좋다
교차검증을 통해 어떤 알파값이 제일 좋은지 알아보자
'''
# Ridge Regression
# select alpha 0.0001 or 0.001 or 0.01 by checking R2, MSE, RMSE
#lasso
alphas = [0.001,0.01,0.1,1]
for a in alphas:
model = Lasso(alpha=a).fit(X,y)
score = model.score(X, y)
pred_y = model.predict(X)
mse = mean_squared_error(y, pred_y)
print("Lasso: Alpha:{0:.4f}, R2:{1:.2f}, MSE:{2:.2f}, RMSE:{3:.2f}".format(a, score, mse, np.sqrt(mse)))
print('\n')
# Ridge 이용 했을 경우,
alphas = [0.001,0.01,0.1,1]
for a in alphas:
model = Ridge(alpha=a).fit(X,y)
score = model.score(X, y)
pred_y = model.predict(X)
mse = mean_squared_error(y, pred_y)
print("Ridge: Alpha:{0:.4f}, R2:{1:.2f}, MSE:{2:.2f}, RMSE:{3:.2f}".format(a, score, mse, np.sqrt(mse)))
print('\n')
#출력:
# Alpha:0.0000, R2:0.75, MSE:19.31, RMSE:4.39
# Alpha:1.0000, R2:0.75, MSE:19.46, RMSE:4.41
# Alpha:2.0000, R2:0.75, MSE:19.59, RMSE:4.43
model = Ridge(alpha=0.001).fit(X,y)
coeff_df = pd.DataFrame(model.coef_.reshape(13,1),X.columns,columns=['Coefficient'])
score = model.score(X, y)
pred_y = model.predict(X)
mse = mean_squared_error(y, pred_y)
'Python' 카테고리의 다른 글
파이썬 코드 암호화 알고리즘 (1) | 2025.01.03 |
---|---|
차트 유사도 패턴 검출 (0) | 2024.12.26 |
Python - Regression 회귀 분석 (0) | 2022.10.24 |
Python - 다중공선성 , 차원축소 , 군집 (0) | 2022.10.24 |
Python - 모델 Stacking (0) | 2022.10.22 |