본문 바로가기
머신러닝(Machine Learning)

머신러닝 실습: 회귀분석 연습2

by Blaze_블즈 2024. 2. 29.

안녕하세요

블레이즈 테크노트 

블레이즈 입니다. 

 

 

지난 번에는 데이터 전처리에 관한 이야기를 나눴는데,

오늘은 그 전처리된 데이터로 실제 모델 학습과 평가를 해볼 예정입니다.

 

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 점수도 중간 정도가 나온 것 같습니다. 

 

 

이상으로, 다양한 회귀 모델을 활용한 데이터 분석 과정을 마치겠습니다.

data_regression_new.csv
6.63MB

 

 

감사합니다.