시카고 집값 예측 프로젝트 개선 경험, 데이터 전처리부터 회귀 모델 해석까지

과거에 진행했던 프로젝트들이 눈에 들어왔습니다. 그중에서 가장 먼저 다시 살펴본 것은 바로 시카고 집값 예측 프로젝트였습니다. 프로젝트를 되돌아보면서, 그때 놓쳤거나 더 개선할 수 있었던 부분들을 하나씩 짚어보고, 실제 코드와 사례를 통해 어떤 방식으로 개선할 수 있었는지 공유하려고 합니다. 이번 리뷰를 통해 데이터 전처리, 모델 선택, 성능 평가, 변수 해석까지 프로젝트 전반에서 배울 점을 정리하고, 앞으로 비슷한 프로젝트를 진행할 때 적용할 수 있는 노하우도 함께 정리했습니다.

 

시카고 집값 예측 프로젝트를 실제 경험 기반으로 리뷰하며 데이터 전처리, 다중공선성, 특성 스케일링, 다양한 회귀 모델 적용, 교차검증, 변수 중요도 분석까지 개선한 경험을 공유해보려 합니다. 누군가에게는 도움이 되었으면 하네요.

 

1. 데이터 전처리와 이상치 처리

 

가장 먼저 깨달은 점은 데이터 전처리를 깊게 고민하지 않았다는 것입니다. 이상치가 존재할 경우 모델 성능에 큰 영향을 줄 수 있으므로, 박스플롯을 활용하여 이상치를 탐지하고 처리하는 과정이 필요했습니다.

 

plt.figure(figsize=(12,6))
sns.boxplot(data=boston_pd, orient='h')
plt.title('Boxplot for Outlier Detection')
plt.show()

또한 다중공선성을 고려하여 ‘LSTAT’ 변수를 제외하였지만, VIF(Variance Inflation Factor)를 계산하여 시각화하는 것이 모델 해석에 도움이 됩니다.

 

from statsmodels.stats.outliers_influence import variance_inflation_factor
vif = pd.DataFrame()
vif['Feature'] = X.columns
vif['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(vif)

2. 특성 스케일링

 

회귀 모델 학습 시, 특성들의 값 범위 차이가 크면 모델 성능에 부정적인 영향을 줄 수 있습니다. 따라서 StandardScaler를 사용해 표준화 과정을 추가하는 것이 좋습니다.

 

from sklearn.preprocessing import StandardScaler
X = boston_pd.drop('PRICE', axis=1)
y = boston_pd['PRICE']
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

3. 다양한 회귀 모델 적용 및 성능 비교

 

단일 모델만 사용하지 않고, Ridge, Lasso, RandomForest, XGBoost 등 여러 회귀 모델을 적용하여 성능을 비교하면 최적의 모델 선택이 가능합니다.

models = {
    'Ridge': Ridge(),
    'Lasso': Lasso(),
    'RandomForest': RandomForestRegressor(),
    'XGBoost': XGBRegressor()
}
for name, model in models.items():
    model.fit(X_train, y_train)
    pred = model.predict(X_test)
    rmse = np.sqrt(mean_squared_error(y_test, pred))
    print(f'{name} RMSE: {rmse}')

4. 모델 평가의 다양화

 

RMSE뿐 아니라 R² 스코어를 활용하여 모델이 데이터를 얼마나 잘 설명하는지 확인하고, Cross-validation으로 일반화 성능을 평가하는 것이 중요합니다.

from sklearn.metrics import r2_score
r2 = r2_score(y_test, pred_test)
print(f'R² of Test data: {r2}')

from sklearn.model_selection import cross_val_score
scores = cross_val_score(reg, X, y, cv=5, scoring='neg_mean_squared_error')
rmse_scores = np.sqrt(-scores)
print(f'Cross-validated RMSE: {rmse_scores.mean()}')

5. 변수 중요도 분석과 해석

 

모델의 특성 중요도를 분석하면 집값 예측에 어떤 변수가 영향을 미치는지 알 수 있습니다. 선형 회귀의 계수나 RandomForest, XGBoost의 feature importance를 시각화하여 해석을 추가하는 것이 좋습니다.

 

feature_importance = pd.Series(reg.coef_, index=X.columns)
feature_importance.sort_values().plot(kind='barh')
plt.title('Feature Importance')
plt.show()

이번 경험을 통해, 단순히 모델을 학습하고 결과를 얻는 것이 아니라, 데이터 전처리부터 다양한 모델 적용, 평가 지표, 변수 해석까지 체계적으로 접근해야 한다는 것을 다시 한번 느끼는 계기가 되었습니다.