회귀모델을 위한 데이터불러오기, 전처리 작업 (데이터일반분할)
이패스 신성진 김용재 와 함께하는 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 교차 검증을 활용한 회귀 모델 성능 비교
- KFold(n_splits=5, shuffle=True, random_state=42)
- 데이터를 5개의 부분으로 나누어 5번 교차 검증 수행
- shuffle=True를 설정하면 데이터를 섞은 후 분할
- random_state=42로 랜덤성을 고정
- 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 | 대용량 데이터에 최적화된 부스팅 회귀 모델 |
'파이썬' 카테고리의 다른 글
12-4. 교재 머신러닝 지도학습 (0) | 2025.03.25 |
---|---|
이패스 신성진 김용재 와 함께하는 AI모델링 (0) | 2025.03.18 |
12-3. 머신러닝 분류모델 총정리(이패스 신성진 김용재 와 함께하는 AI모델링) (0) | 2025.03.18 |
13. 모델평가 (모델성능비교) (0) | 2025.03.18 |
12-1 데이터분할(분할, k-fold) (0) | 2025.03.18 |