html
K-Fold 교차 검증을 사용하여 GridSearchCV 없이 자동차 가격 예측 구현하기
목차
소개
자동차 가격 예측은 엔진 크기, 마력, 연료 유형 등 다양한 특징을 기반으로 차량의 가격을 예측하는 고전적인 회귀 문제입니다. K-Fold 교차 검증을 구현하면 모델이 보이지 않는 데이터에 잘 일반화되는지 확인하여 모델의 신뢰성을 높일 수 있습니다. 이 글에서는 Python을 사용하여 데이터를 전처리하고, 특징을 공학적으로 변환하며, 여러 회귀 모델을 구축하고, K-Fold 교차 검증을 통해 성능을 평가하는 방법을 시연합니다.
데이터셋 개요
우리는 Kaggle의 자동차 가격 예측 데이터셋을 사용할 것입니다. 이 데이터셋은 다양한 자동차 모델의 상세한 사양과 가격을 포함하고 있습니다. 데이터셋에는 symboling
, CarName
, fueltype
, aspiration
, doornumber
, carbody
등 자동차 가격에 영향을 미치는 여러 특징이 포함되어 있습니다.
데이터 전처리
효과적인 데이터 전처리는 모델링을 위해 데이터셋을 준비하는 데 필수적입니다. 여기에는 결측치 처리, 범주형 변수 인코딩, 관련 특징 선택이 포함됩니다.
결측치 처리
수치 데이터
수치 특징의 결측치는 통계적 방법을 사용하여 처리할 수 있습니다. 우리는 수치 열의 결측치를 평균값 전략으로 대체할 것입니다.
123456789101112131415
import numpy as npimport pandas as pdfrom sklearn.impute import SimpleImputer # 데이터셋 로드data = pd.read_csv('CarPrice.csv')X = data.iloc[:, :-1]y = data.iloc[:, -1] # 수치 열 식별numerical_cols = X.select_dtypes(include=['int64', 'float64']).columns # 평균으로 결측치 대체imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')X[numerical_cols] = imp_mean.fit_transform(X[numerical_cols])
범주형 데이터
범주형 특징의 경우, 가장 빈번한 값 전략이 결측치 대체에 효과적입니다.
12345678
from sklearn.impute import SimpleImputer # 범주형 열 식별string_cols = X.select_dtypes(include=['object']).columns # 가장 빈번한 값으로 결측치 대체imp_freq = SimpleImputer(missing_values=np.nan, strategy='most_frequent')X[string_cols] = imp_freq.fit_transform(X[string_cols])
특징 선택
관련 있는 특징을 선택하면 모델의 복잡성을 줄이고 성능을 향상시키는 데 도움이 됩니다.
12
# 'car_ID' 열은 가격 예측에 기여하지 않으므로 제거X.drop('car_ID', axis=1, inplace=True)
특징 공학
특징 공학은 원시 데이터를 예측 모델에 더 잘 맞는 의미 있는 특징으로 변환하는 것을 포함합니다.
범주형 변수 인코딩
머신 러닝 알고리즘은 수치 입력을 필요로 하기 때문에 범주형 변수를 인코딩해야 합니다. 우리는 One-Hot 인코딩을 사용하여 범주형 변수를 이진 행렬로 변환할 것입니다.
123456789101112
from sklearn.preprocessing import OneHotEncoderfrom sklearn.compose import ColumnTransformer # 인덱스로 범주형 열 식별string_cols = list(np.where((X.dtypes == object))[0]) # One-Hot 인코딩 적용columnTransformer = ColumnTransformer( [('encoder', OneHotEncoder(), string_cols)], remainder='passthrough')X = columnTransformer.fit_transform(X)
특징 스케일링
스케일링은 각 특징이 결과에 동등하게 기여하도록 보장하여 특정 알고리즘의 성능을 향상시킵니다.
123456789
from sklearn.preprocessing import StandardScaler # StandardScaler 초기화sc = StandardScaler(with_mean=False) # 훈련 데이터에 적합하고 변환sc.fit(X_train)X_train = sc.transform(X_train)X_test = sc.transform(X_test)
회귀 모델 구축
우리는 자동차 가격을 예측하기 위해 다섯 가지 다른 회귀 모델을 구축하고 평가할 것입니다:
- 의사결정나무 회귀
- 랜덤 포레스트 회귀
- AdaBoost 회귀
- XGBoost 회귀
- 서포트 벡터 회귀기(SVR)
의사결정나무 회귀
의사결정나무 회귀는 특징 값을 기준으로 데이터를 하위 집합으로 분할하여 해석하기 쉽게 만듭니다.
1234
from sklearn.tree import DecisionTreeRegressor # 모델 초기화decisionTreeRegressor = DecisionTreeRegressor(max_depth=4)
랜덤 포레스트 회귀
랜덤 포레스트는 여러 의사결정나무의 예측을 집계하여 과적합을 줄이고 정확성을 향상시킵니다.
1234
from sklearn.ensemble import RandomForestRegressor # 모델 초기화randomForestRegressor = RandomForestRegressor(n_estimators=25, random_state=10)
AdaBoost 회귀
AdaBoost는 이전에 잘못 예측된 인스턴스에 초점을 맞추어 여러 약한 학습기를 결합하여 강력한 예측 모델을 만듭니다.
1234
from sklearn.ensemble import AdaBoostRegressor # 모델 초기화adaBoostRegressor = AdaBoostRegressor(random_state=0, n_estimators=100)
XGBoost 회귀
XGBoost는 성능과 속도를 위해 설계된 최적화된 분산 그래디언트 부스팅 라이브러리입니다.
12345678910
import xgboost as xgb # 모델 초기화xgbRegressor = xgb.XGBRegressor( n_estimators=100, reg_lambda=1, gamma=0, max_depth=3, learning_rate=0.05)
서포트 벡터 회귀기(SVR)
SVR은 서포트 벡터 머신의 원리를 회귀 작업에 적용하여 고차원 공간에서 효과적입니다.
1234
from sklearn.svm import SVR # 모델 초기화svr = SVR()
K-Fold 교차 검증 구현
K-Fold 교차 검증은 데이터셋을 k
개의 하위 집합으로 분할하고, 반복적으로 모델을 훈련 및 검증하여 k
번 수행하며, 매번 다른 하위 집합을 검증 세트로 사용합니다.
1234567891011
from sklearn.model_selection import KFoldfrom sklearn.metrics import r2_score # K-Fold 교차 검증자 정의kf = KFold(n_splits=10, random_state=42, shuffle=True) # 모델을 구축하고 평가하는 함수def build_model(X_train, X_test, y_train, y_test, model): model.fit(X_train, y_train) y_pred = model.predict(X_test) return r2_score(y_test, y_pred)
케이스별 K-Fold 교차 검증 실행
각 모델의 K-Fold 전반에 걸친 성능을 평가하고 평균 R² 점수를 계산할 것입니다.
123456789101112131415161718192021222324252627282930313233343536
# 점수 리스트 초기화decisionTreeRegressor_scores = []randomForestRegressor_scores = []adaBoostRegressor_scores = []xgbRegressor_scores = []svr_scores = [] # K-Fold 교차 검증 수행for train_index, test_index in kf.split(X): X_train, X_test = X[train_index], X[test_index] y_train, y_test = y[train_index], y[test_index] # 의사결정나무 decisionTreeRegressor_scores.append( build_model(X_train, X_test, y_train, y_test, decisionTreeRegressor) ) # 랜덤 포레스트 randomForestRegressor_scores.append( build_model(X_train, X_test, y_train, y_test, randomForestRegressor) ) # AdaBoost adaBoostRegressor_scores.append( build_model(X_train, X_test, y_train, y_test, adaBoostRegressor) ) # XGBoost xgbRegressor_scores.append( build_model(X_train, X_test, y_train, y_test, xgbRegressor) ) # SVR svr_scores.append( build_model(X_train, X_test, y_train, y_test, svr) )
모델 성능 평가
K-Fold 교차 검증을 실행한 후, 각 모델의 평균 R² 점수를 계산하여 성능을 평가할 것입니다.
1234567
from statistics import mean print('Decision Tree Regressor Mean R² Score: ', mean(decisionTreeRegressor_scores))print('Random Forest Regressor Mean R² Score: ', mean(randomForestRegressor_scores))print('AdaBoost Regressor Mean R² Score: ', mean(adaBoostRegressor_scores))print('XGBoost Regressor Mean R² Score: ', mean(xgbRegressor_scores))print('SVR Mean R² Score: ', mean(svr_scores))
샘플 출력:
12345
Decision Tree Regressor Mean R² Score: 0.8786768422448108Random Forest Regressor Mean R² Score: 0.9070724684428952AdaBoost Regressor Mean R² Score: 0.894756851083693XGBoost Regressor Mean R² Score: 0.9049838393114154SVR Mean R² Score: -0.1510507928400266
해석:
- 랜덤 포레스트 회귀는 가장 높은 평균 R² 점수를 보여, 테스트된 모델들 중 가장 좋은 성능을 나타냅니다.
- SVR은 음의 R² 점수를 보여 이 데이터셋에서 성능이 낮음을 나타내며, 이는 하이퍼파라미터 튜닝 없이 기본 상태에서는 데이터의 기본 패턴을 효과적으로 포착하지 못했을 가능성이 있습니다.
결론
K-Fold 교차 검증을 구현함으로써 회귀 모델의 성능을 평가하는 견고한 방법을 제공하며, 결과가 특정 훈련-테스트 분할에 의존하지 않고 일반화 가능함을 보장할 수 있습니다. 이 가이드에서는 데이터를 전처리하고, 범주형 변수를 인코딩하며, 특징을 스케일링하고, 여러 회귀 모델을 구축하며, GridSearchCV 없이 K-Fold 교차 검증을 사용하여 성능을 평가하는 방법을 시연했습니다.
주요 요점:
- 데이터 전처리: 결측치의 적절한 처리와 특징 선택은 모델 성능에 매우 중요합니다.
- 특징 공학: 범주형 변수 인코딩과 특징 스케일링은 모델이 패턴을 학습하는 능력에 크게 영향을 미칠 수 있습니다.
- 모델 평가: K-Fold 교차 검증은 모델이 보이지 않는 데이터에 얼마나 잘 일반화되는지 평가하는 신뢰할 수 있는 방법을 제공합니다.
- 모델 선택: 테스트된 모델 중 앙상블 방법인 랜덤 포레스트와 XGBoost가 이 특정 경우에서 의사결정나무와 SVR과 같은 단순한 모델보다 뛰어난 성능을 보였습니다.
추가 최적화를 위해 GridSearchCV나 RandomizedSearchCV와 같은 하이퍼파라미터 튜닝 기법을 통합하면 각 알고리즘에 최적의 파라미터 세트를 찾아 모델 성능을 향상시킬 수 있습니다.
---
이 구조화된 접근 방식을 따르면 다양한 회귀 작업에 K-Fold 교차 검증을 효과적으로 구현할 수 있어 모델이 정확하고 견고하게 유지됩니다.