본문 바로가기

파이썬

12-4. 머신러닝 회귀모델 총정리 (이패스 신성진 김용재 와 함께하는 AI모델링)

회귀모델을 위한 데이터불러오기, 전처리 작업 (데이터일반분할)

이패스 신성진 김용재 와 함께하는 AI모델링

# 📌 Wine 데이터 - 회귀 모델 총정리 (일반 Train/Test Split 사용)
# - 다양한 회귀 모델을 학습하고 성능 평가 수행

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

# 1️⃣ 데이터 불러오기 및 전처리
wine_data = pd.read_csv("datasets/winequality-white.csv", sep=";")

# X (특성)과 y (타겟) 분리
X_wine = wine_data.drop(columns=["quality"])
y_wine = wine_data["quality"]

# 데이터 정규화
scaler = StandardScaler()
X_wine_scaled = scaler.fit_transform(X_wine)

# Train/Test Split (80:20 비율)
X_train_w, X_test_w, y_train_w, y_test_w = train_test_split(X_wine_scaled, y_wine, test_size=0.2, random_state=42)

 

회귀모델을 위한 모델학습 및 평가(데이터일반분할)

# 2️⃣ 다양한 회귀 모델 학습 및 평가

# Linear Regression (선형 회귀)
lin_reg = LinearRegression()
lin_reg.fit(X_train_w, y_train_w)
y_pred_lin = lin_reg.predict(X_test_w)

print("Linear Regression:")
print("MAE:", mean_absolute_error(y_test_w, y_pred_lin))
print("MSE:", mean_squared_error(y_test_w, y_pred_lin))
print("RMSE:", mean_squared_error(y_test_w, y_pred_lin, squared=False))
print("R² Score:", r2_score(y_test_w, y_pred_lin))
print("\n")

# Ridge Regression (릿지 회귀 - L2 정규화)
ridge = Ridge(alpha=1.0)  # L2 규제 강도 조절 (기본값 1.0)
ridge.fit(X_train_w, y_train_w)
y_pred_ridge = ridge.predict(X_test_w)

print("Ridge Regression:")
print("MAE:", mean_absolute_error(y_test_w, y_pred_ridge))
print("MSE:", mean_squared_error(y_test_w, y_pred_ridge))
print("RMSE:", mean_squared_error(y_test_w, y_pred_ridge, squared=False))
print("R² Score:", r2_score(y_test_w, y_pred_ridge))
print("\n")

# Lasso Regression (라쏘 회귀 - L1 정규화)
lasso = Lasso(alpha=0.1)  # L1 규제 강도 조절 (기본값 1.0)
lasso.fit(X_train_w, y_train_w)
y_pred_lasso = lasso.predict(X_test_w)

print("Lasso Regression:")
print("MAE:", mean_absolute_error(y_test_w, y_pred_lasso))
print("MSE:", mean_squared_error(y_test_w, y_pred_lasso))
print("RMSE:", mean_squared_error(y_test_w, y_pred_lasso, squared=False))
print("R² Score:", r2_score(y_test_w, y_pred_lasso))
print("\n")

# ElasticNet Regression (엘라스틱넷 - L1+L2 정규화)
elastic = ElasticNet(alpha=0.1, l1_ratio=0.5)  # L1과 L2의 비율 설정
elastic.fit(X_train_w, y_train_w)
y_pred_elastic = elastic.predict(X_test_w)

print("ElasticNet Regression:")
print("MAE:", mean_absolute_error(y_test_w, y_pred_elastic))
print("MSE:", mean_squared_error(y_test_w, y_pred_elastic))
print("RMSE:", mean_squared_error(y_test_w, y_pred_elastic, squared=False))
print("R² Score:", r2_score(y_test_w, y_pred_elastic))
print("\n")

# Random Forest Regressor (랜덤 포레스트 회귀)
rf_reg = RandomForestRegressor(n_estimators=100, random_state=42)
rf_reg.fit(X_train_w, y_train_w)
y_pred_rf = rf_reg.predict(X_test_w)

print("Random Forest Regressor:")
print("MAE:", mean_absolute_error(y_test_w, y_pred_rf))
print("MSE:", mean_squared_error(y_test_w, y_pred_rf))
print("RMSE:", mean_squared_error(y_test_w, y_pred_rf, squared=False))
print("R² Score:", r2_score(y_test_w, y_pred_rf))
print("\n")

# Gradient Boosting Regressor (GBM)
gbm_reg = GradientBoostingRegressor(n_estimators=50, learning_rate=0.1, max_depth=3, random_state=42)
gbm_reg.fit(X_train_w, y_train_w)
y_pred_gbm = gbm_reg.predict(X_test_w)

print("Gradient Boosting Regressor:")
print("MAE:", mean_absolute_error(y_test_w, y_pred_gbm))
print("MSE:", mean_squared_error(y_test_w, y_pred_gbm))
print("RMSE:", mean_squared_error(y_test_w, y_pred_gbm, squared=False))
print("R² Score:", r2_score(y_test_w, y_pred_gbm))
print("\n")

# XGBoost Regressor (XGBoost 회귀)
xgb_reg = XGBRegressor(n_estimators=50, learning_rate=0.1, max_depth=3, random_state=42)
xgb_reg.fit(X_train_w, y_train_w)
y_pred_xgb = xgb_reg.predict(X_test_w)

print("XGBoost Regressor:")
print("MAE:", mean_absolute_error(y_test_w, y_pred_xgb))
print("MSE:", mean_squared_error(y_test_w, y_pred_xgb))
print("RMSE:", mean_squared_error(y_test_w, y_pred_xgb, squared=False))
print("R² Score:", r2_score(y_test_w, y_pred_xgb))
print("\n")

# LightGBM Regressor (LightGBM 회귀)
lgbm_reg = LGBMRegressor(n_estimators=50, learning_rate=0.1, max_depth=-1, random_state=42)
lgbm_reg.fit(X_train_w, y_train_w)
y_pred_lgbm = lgbm_reg.predict(X_test_w)

print("LightGBM Regressor:")
print("MAE:", mean_absolute_error(y_test_w, y_pred_lgbm))
print("MSE:", mean_squared_error(y_test_w, y_pred_lgbm))
print("RMSE:", mean_squared_error(y_test_w, y_pred_lgbm, squared=False))
print("R² Score:", r2_score(y_test_w, y_pred_lgbm))

 

회귀모델을 위한 데이터불러오기, 전처리 작업 (k-fold 분할)

# 📌 Wine 데이터 - K-Fold 교차 검증을 활용한 회귀 모델 성능 평가

import pandas as pd
from sklearn.model_selection import KFold, cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from sklearn.metrics import make_scorer, mean_absolute_error, mean_squared_error, r2_score

# 1️⃣ 데이터 불러오기 및 전처리
wine_data = pd.read_csv("datasets/winequality-white.csv", sep=";")

# X (특성)과 y (타겟) 분리
X_wine = wine_data.drop(columns=["quality"])
y_wine = wine_data["quality"]

# 데이터 정규화
scaler = StandardScaler()
X_wine_scaled = scaler.fit_transform(X_wine)

# 2️⃣ K-Fold 설정 (5-Fold)
kf = KFold(n_splits=5, shuffle=True, random_state=42)

# 3️⃣ 사용자 정의 스코어링 함수 (MAE, MSE, R²)
scoring = {
    "MAE": make_scorer(mean_absolute_error),
    "MSE": make_scorer(mean_squared_error),
    "R2": make_scorer(r2_score)
}

# 4️⃣ 다양한 회귀 모델 교차 검증 평가

# Linear Regression
lin_reg = LinearRegression()
lin_reg_scores = cross_val_score(lin_reg, X_wine_scaled, y_wine, cv=kf, scoring="r2")
print("Linear Regression Mean R² Score:", lin_reg_scores.mean())

# Ridge Regression (릿지 회귀 - L2 정규화)
ridge = Ridge(alpha=1.0)
ridge_scores = cross_val_score(ridge, X_wine_scaled, y_wine, cv=kf, scoring="r2")
print("Ridge Regression Mean R² Score:", ridge_scores.mean())

# Lasso Regression (라쏘 회귀 - L1 정규화)
lasso = Lasso(alpha=0.1)
lasso_scores = cross_val_score(lasso, X_wine_scaled, y_wine, cv=kf, scoring="r2")
print("Lasso Regression Mean R² Score:", lasso_scores.mean())

# ElasticNet Regression (엘라스틱넷 - L1+L2 정규화)
elastic = ElasticNet(alpha=0.1, l1_ratio=0.5)
elastic_scores = cross_val_score(elastic, X_wine_scaled, y_wine, cv=kf, scoring="r2")
print("ElasticNet Regression Mean R² Score:", elastic_scores.mean())

# Random Forest Regressor (랜덤 포레스트 회귀)
rf_reg = RandomForestRegressor(n_estimators=100, random_state=42)
rf_scores = cross_val_score(rf_reg, X_wine_scaled, y_wine, cv=kf, scoring="r2")
print("Random Forest Regressor Mean R² Score:", rf_scores.mean())

# Gradient Boosting Regressor (GBM)
gbm_reg = GradientBoostingRegressor(n_estimators=50, learning_rate=0.1, max_depth=3, random_state=42)
gbm_scores = cross_val_score(gbm_reg, X_wine_scaled, y_wine, cv=kf, scoring="r2")
print("Gradient Boosting Regressor Mean R² Score:", gbm_scores.mean())

# XGBoost Regressor (XGBoost 회귀)
xgb_reg = XGBRegressor(n_estimators=50, learning_rate=0.1, max_depth=3, random_state=42)
xgb_scores = cross_val_score(xgb_reg, X_wine_scaled, y_wine, cv=kf, scoring="r2")
print("XGBoost Regressor Mean R² Score:", xgb_scores.mean())

# LightGBM Regressor (LightGBM 회귀)
lgbm_reg = LGBMRegressor(n_estimators=50, learning_rate=0.1, max_depth=-1, random_state=42)
lgbm_scores = cross_val_score(lgbm_reg, X_wine_scaled, y_wine, cv=kf, scoring="r2")
print("LightGBM Regressor Mean R² Score:", lgbm_scores.mean())

 

K-Fold 교차 검증을 활용한 회귀 모델 성능 비교

  1. KFold(n_splits=5, shuffle=True, random_state=42)
    • 데이터를 5개의 부분으로 나누어 5번 교차 검증 수행
    • shuffle=True를 설정하면 데이터를 섞은 후 분할
    • random_state=42로 랜덤성을 고정
  2. cross_val_score(estimator, X, y, cv=kf, scoring="r2")
    • estimator: 사용할 모델 (예: LinearRegression(), RandomForestRegressor())
    • X: 입력 데이터 (특성)
    • y: 정답 데이터 (타겟)
    • cv=kf: K-Fold 설정 적용
    • scoring="r2": 평가 지표 (예: "r2"=결정계수, "neg_mean_absolute_error"=MAE, "neg_mean_squared_error"=MSE

정리


선형 회귀 (Linear Regression) 기본적인 선형 회귀 모델
릿지 회귀 (Ridge Regression) L2 규제를 적용하여 모델 단순화
라쏘 회귀 (Lasso Regression) L1 규제를 적용하여 일부 특성을 제거
엘라스틱넷 회귀 (ElasticNet Regression) L1과 L2를 조합하여 최적의 모델 생성
랜덤 포레스트 회귀 (Random Forest Regressor) 여러 개의 결정 트리를 앙상블하여 성능 향상
Gradient Boosting Regressor (GBM) 오차를 줄여가며 학습하는 강력한 회귀 모델
XGBoost Regressor GBM을 최적화하여 빠른 학습 속도를 제공
LightGBM Regressor 대용량 데이터에 최적화된 부스팅 회귀 모델