xgboost은 머신러닝 분야에서 널리 사용되는 강력한 알고리즘 중 하나입니다. 그러나 모델을 훈련시키기 전에 데이터를 전처리하는 것은 중요한 단계입니다. 이 블로그 포스트에서는 xgboost에서의 전처리 전략을 알아보고 Python 코드를 통해 실제 예제를 제시하겠습니다.
데이터 스케일링
xgboost은 feature 간의 스케일 차이에 민감할 수 있으므로, 데이터 스케일링은 매우 중요합니다. 가장 일반적인 전처리 방법으로는 표준화(standardization)와 정규화(normalization)가 있습니다.
표준화: 데이터의 평균을 0으로, 표준편차를 1로 만들어주는 작업입니다. 이를 통해 각 feature의 분포를 동일하게 만들어 줍니다.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
정규화: 데이터의 범위를 0과 1 사이로 조정합니다. 이는 이상치(outliers)가 있는 경우에 유용할 수 있습니다.
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train_normalized = scaler.fit_transform(X_train)
X_test_normalized = scaler.transform(X_test)
카테고리컬 변수 처리
xgboost는 기본적으로 카테고리컬 변수를 처리할 수 있지만, 몇 가지 전처리 방법을 사용함으로써 모델의 성능을 더욱 향상시킬 수 있습니다.
원핫인코딩: 카테고리컬 변수를 이진형(dummies)으로 변환하는 것입니다. 이를 통해 카테고리 순서가 없는 경우 모델이 더 잘 이해할 수 있습니다.
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()
X_train_encoded = encoder.fit_transform(X_train)
X_test_encoded = encoder.transform(X_test)
빈도 인코딩: 카테고리컬 변수의 값을 해당 카테고리가 나타난 빈도로 대체하는 것입니다. 이는 카테고리가 많은 경우 유용합니다.
frequency_map = X_train[col].value_counts().to_dict()
X_train['col_encoded'] = X_train[col].map(frequency_map)
X_test['col_encoded'] = X_test[col].map(frequency_map)
결측값 처리
데이터에 결측값이 있는 경우 이를 처리해야 모델이 원활하게 동작할 수 있습니다. 일반적으로 결측값을 채우는 방법으로는 평균(mean), 중간값(median), 최빈값(mode)으로 대체하는 방법이 있습니다.
# 결측값을 평균으로 대체
X_train_filled = X_train.fillna(X_train.mean())
X_test_filled = X_test.fillna(X_train.mean())
# 결측값을 중간값으로 대체
X_train_filled = X_train.fillna(X_train.median())
X_test_filled = X_test.fillna(X_train.median())
# 결측값을 최빈값으로 대체
X_train_filled = X_train.fillna(X_train.mode().iloc[0])
X_test_filled = X_test.fillna(X_train.mode().iloc[0])
피처 선택
xgboost 모델에서는 중요한 피처를 선택하는 것이 모델 성능을 향상시키는 데 도움이 될 수 있습니다. 여러 피처 선택 방법이 있지만, 가장 일반적인 방법으로는 변수 중요도를 기반으로 하는 방법입니다.
from xgboost import XGBClassifier
model = XGBClassifier()
model.fit(X_train, y_train)
importance = model.feature_importances_
sorted_idx = np.argsort(importance)
plt.barh(X_train.columns[sorted_idx[-10:]], importance[sorted_idx[-10:]])
plt.xlabel("Feature Importance")
plt.show()
결과
위에서 언급한 xgboost에서의 전처리 전략들은 데이터를 더 효과적으로 처리하고 모델의 성능을 향상시킬 수 있는 방법들입니다. 이러한 전략들을 적절히 조합해 사용하면 좀 더 우수한 결과를 얻을 수 있을 것입니다. 위에서 제시한 Python 코드를 활용하여 실제 데이터셋에서 전처리 작업을 수행해보세요!