안녕하세요
블레이즈 테크노트
블레이즈 입니다.

지난 번에는 데이터 전처리에 관한 이야기를 나눴는데,
오늘은 그 전처리된 데이터로 실제 모델 학습과 평가를 해볼 예정입니다.
2024.02.28 - [머신러닝(Machine Learning)] - 머신러닝 기초: 회귀분석 연습 1
지난 번에 데이터 전처리 과정을 보여드렸지만 혹시나 해당 전처리 과정이 제대로 안되셨을까봐
전처리 완료 데이터를 포스트 맨 아래에 첨부하도록 하겠습니다.
이번 포스팅에서 다룰 회귀 모델은
선형 회귀, Ridge 회귀, Lasso 회귀, Elastic Net 회귀 모델입니다.
이러한 모델에 대한 이론적 배경은 아래의 포스팅에 설명했으니, 참고해주세요!
2024.02.26 - [머신러닝(Machine Learning)] - 머신러닝 이론 선형회귀모델: Ridge, Lasso, Elastic Net
먼저, 선형 회귀를 위한 라이브러리를 임포트해줍니다.
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
선형 회귀 모델을 시작으로, 모델을 학습시키고 결과를 예측해보겠습니다.
그 후, 평균 제곱 오차(MSE)와 결정 계수(R²)를 통해 모델 성능을 평가해보도록 하겠습니다.
linear_reg = LinearRegression() ### 선형회귀 모델의 객체 생성
linear_reg.fit(final_X_train, final_y_train) ### 선형회귀 학습
linear_reg_y_preds = linear_reg.predict(final_X_test) ### 선형회귀 예측 진행
lin_mse = mean_squared_error(final_y_test, linear_reg_y_preds) ### mean square error 계산
lin_rmse = np.sqrt(lin_mse)
lin_r2 = r2_score(final_y_test, linear_reg_y_preds) ### r2 계산
print('Intercept : ', linear_reg.intercept_[0]) ### 절편값 계산
print('MSE : {0: .3f}, RMSE : {1: .3f}'.format(lin_mse, lin_rmse))
print('Variance score : {0: .3f}'.format(lin_r2))

선형 회귀 모델로 예측한 결과, MSE는 0.047, R² 점수는 0.952가 나왔습니다.
이는 모델이 데이터를 상당히 잘 예측했음을 의미합니다.
또한, 각 변수의 중요도를 살펴보기 위해 계수값을 출력해볼 수 있으며, 중요한 독립 변수들을 시각적으로 확인할 수 있습니다.
### coefficient 출력
linear_coeff = pd.Series(data = linear_reg.coef_[0], index = final_X_test.columns)
linear_coeff = linear_coeff.sort_values(ascending = False)
print(linear_coeff)
어떤 변수가 중요한 독립 변수인지 그래프로 확인할 수 있습니다.
plt.rcParams["figure.figsize"] = (30,20)
sns.barplot(x = linear_coeff.values, y=linear_coeff.index) ### 막대그래프
plt.show()

아래와 같이 예측값과 실제 레이블을 비교할 수 있습니다.
빨간 색은 예측값을, 파란색은 실제 타겟값을 나타냅니다.
### 예측값과 label 비교 plotting
plt.figure(figsize=(20,5))
plt.plot(linear_reg_y_preds[0:70], c = 'r', label = 'Predict') ### 모델의 예측값 불러오기 (예측값 중에 70개만)
plt.plot(final_y_test[0:70], c='b', label = 'Target') ### label인 final_y_test 불러오기 (label 중에 70개만)
plt.legend()

이어서, Ridge, Lasso, 그리고 Elastic Net 모델로 같은 과정을 반복하며 성능을 비교해보겠습니다.
각 모델마다 약간의 성능 차이는 있지만, 전반적으로 모든 모델이 데이터를 잘 예측하는 것을 볼 수 있습니다.
다음으로, Ridge 회귀 모델을 생성해서 학습해보도록 하겠습니다.
from sklearn.linear_model import Ridge
ridge_reg = Ridge(alpha = 0.05) ### Ridge 회귀 모델의 객체 생성
ridge_reg.fit(final_X_train, final_y_train) ### Ridge 회귀 학습
rid_y_preds = ridge_reg.predict(final_X_test) ### Ridge 회귀 진행
rid_mse = mean_squared_error(final_y_test, rid_y_preds) ### mean square error 계산
rid_rmse = np.sqrt(rid_mse)
rid_r2 = r2_score(final_y_test, rid_y_preds) ### r2 계산
print('Intercept : ', ridge_reg.intercept_[0]) ### 절편값 계산
print('MSE : {0: .3f}, RMSE : {1: .3f}'.format(rid_mse, rid_rmse))
print('Variance score : {0: .3f}'.format(rid_r2))

성능에 있어서 선형 회귀 모델과 큰 차이는 없었습니다.
다음으로, Lasso 모델입니다.
from sklearn.linear_model import Lasso
lasso_reg = Lasso(alpha = 0.001) ### Lasso 회귀 모델의 객체 생성
lasso_reg.fit(final_X_train, final_y_train) ### Lasso 학습
lasso_y_preds = lasso_reg.predict(final_X_test) ### Lasso 회귀 진행
lasso_mse = mean_squared_error(final_y_test, lasso_y_preds) ### mean square error 계산
lasso_rmse = np.sqrt(lasso_mse)
lasso_r2 = r2_score(final_y_test, lasso_y_preds) ### r2 계산
print('Intercept : ', lasso_reg.intercept_[0]) ### 절편값 계산
print('MSE : {0: .3f}, RMSE : {1: .3f}'.format(lasso_mse, lasso_rmse))
print('Variance score : {0: .3f}'.format(lasso_r2))

MSE 0.050, R2 점수 0.949로 성능이 약간 안좋아졌습니다.
마지막으로, ElasticNet 입니다.
from sklearn.linear_model import ElasticNet
ela_reg = ElasticNet(alpha = 0.001, l1_ratio=0.6) ### ElasticNet 모델의 객체 생성
ela_reg.fit(final_X_train, final_y_train) ### ElasticNet 학습
ela_y_preds = ela_reg.predict(final_X_test) ### ElasticNet 예측 진행
ela_mse = mean_squared_error(final_y_test, ela_y_preds) ### mean square error 계산
ela_rmse = np.sqrt(ela_mse)
ela_r2 = r2_score(final_y_test, ela_y_preds) ### r2 계산
print('Intercept : ', ela_reg.intercept_[0])
print('MSE : {0: .3f}, RMSE : {1: .3f}'.format(ela_mse, ela_rmse))
print('Variance score : {0: .3f}'.format(ela_r2))

Elastic Net 은 Ridge와 Lasso를 합친거다 보니 MSE 점수도 중간 정도가 나온 것 같습니다.
이상으로, 다양한 회귀 모델을 활용한 데이터 분석 과정을 마치겠습니다.
감사합니다.
'머신러닝(Machine Learning)' 카테고리의 다른 글
머신러닝 실습: 분류분석 연습2 (0) | 2024.03.03 |
---|---|
머신러닝 실습: 분류분석 연습1 (0) | 2024.03.02 |
머신러닝 실습: 회귀분석 연습 1 (0) | 2024.02.28 |
머신러닝 이론 선형회귀모델: Ridge, Lasso, Elastic Net (0) | 2024.02.26 |
머신러닝 기초_pandas, matplotlib.pyplot 활용하기 (0) | 2024.02.25 |