자기계발/Python

[빅데이터분석기사] 27 엘라스틱넷

호등 2022. 6. 25. 12:13
반응형

엘라스틱넷(Elasticnet)

엘라스틱넷은 릿지회귀와 라쏘회귀를 절충한 모델이다. 규제항은 릿지와 라쏘의 규제항을 단순히 더해서 사용한다. 두 규제항의 혼합정도를 혼합비율 r을 사용해 조절하게 된다. 만약 r=0이면 릿지회귀와 같고, r=1이면 라쏘회귀와 같게 된다.

 

scikit-learn

엘라스틱넷(Elasticnet) 회귀모델은 사이킷런의 linear_model에서 ElasticNet이다.

 

하이퍼파라미터 역시 alpha, 디폴트 값은 alpha=1이다.

알파값이 커지면 계수를 0에 가까ㅃ게 제약하여 훈련데이터의 정확도는 낮아지지만 일반화에는 기여한다. 이 부분은 라쏘회귀 설명이랑 같다.

 

1) 기본모델 적용

from sklearn.linear_model import ElasticNet
model = ElasticNet()
model.fit(X_scaled_train, y_train)

pred_train = model.predict(X_scaled_train)
print(model.score(X_scaled_train, y_train))

pred_test = model.predict(X_scaled_test)
model.score(X_scaled_test, y_test)

sklearn.linear_model로부터 ElasticNet을 가져온 후 model 변수에 담는다.

정규화한 훈련데이터셋을 학습(fit)하고 예측값을 도출 및 저장(predict)한 후 정확도를 구한다.

정확도는 약 5%로 확인된다.

 

2) RMSE 오차 확인

#RMSE (Root Mean Squared Error)
import numpy as np
from sklearn.metrics import mean_squared_error
MSE_train = mean_squared_error(y_train, pred_train)
MSE_test = mean_squared_error(y_test, pred_test)
print(np.sqrt(MSE_train))
print(np.sqrt(MSE_test))

RMSE로 오차를 계산해보았더니 훈련데이터 93,206, 테스트데이터는 93,097로 나왔다.

 

3) Grid Search

#Grid Search
param_grid = {'alpha': [0.0, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 0.1, 0.5, 1.0, 2.0, 3.0]}
from sklearn.model_selection import GridSearchCV
grid_search = GridSearchCV(ElasticNet(), param_grid, cv=5)
grid_search.fit(X_scaled_train, y_train)

print("Best Parameter:{}".format(grid_search.best_params_))
print("Best Score:{:.4f}".format(grid_search.best_score_))
print("TestSet score:{:.4f}".format(grid_search.score(X_scaled_train, y_train)))

alpha값을 0.000001, 0.00001, 0.0001, 0.001, 0.01, 0.1, 1, 2, 3 등 10가지로 설정하여 그리드탐색을 진행했다.

분석결과 하이퍼파라미터 alpha=0.00001일 때 정확도가 각각 54.5%, 56.4%로 나타났다.

 

4) Random Search

#Random Search
from scipy.stats import randint
param_distribs={'alpha':randint(low=0.00001,high=10)}
from sklearn.model_selection import RandomizedSearchCV
random_search=RandomizedSearchCV(ElasticNet(),param_distributions=param_distribs,n_iter=100,cv=5)
random_search.fit(X_scaled_train, y_train)

print("Best Parameter:{}".format(random_search.best_params_))
print("Best Score:{:.4f}".format(random_search.best_score_))
print("TestSet score:{:.4f}".format(random_search.score(X_scaled_train, y_train)))

랜덤탐색에서는 0.00001 ~ 10사이에서 무작위로 100번 뽑아 엘라스틱회귀모델을 적용했다.

분석결과 하이퍼파라미터 alpha=0일때 정확도 각각 54.5%, 54.7%로 나타났다.

반응형