1. 왜 하이퍼파라미터 튜닝이 필요한가?
모델 학습에는 **하이퍼파라미터(Hyperparameter)**라는 설정값이 있음.
이는 학습 전에 직접 지정해야 하며, 성능에 큰 영향을 줌.
모델의 결과 예측에 영향을 많이는 주는 파라미터가 어떠한 것인지 파악하는 것이 모델의 성능 향상으로 이어짐.
예를 들어 랜덤 포레스트에서는:
- max_features: 각 노드에서 고려할 최대 특성 수
- n_estimators: 사용할 트리 수
등이 있음.
2. Grid Search (그리드 탐색)
1) 기본 개념
하이퍼파라미터의 모든 조합을 체계적으로 탐색하여 최적 조합을 찾는 방식
2) 예제 코드
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV
param_grid = {
'preprocessing__geo__n_clusters': [5, 8, 10],
'random_forest__max_features': [4, 6, 8]
}
grid_search = GridSearchCV(full_pipeline_with_model,
param_grid=param_grid,
cv=3,
scoring='neg_mean_squared_error',
return_train_score=True)
grid_search.fit(housing_prepared, housing_labels)
🔍 preprocessing__geo__n_clusters: 파이프라인 내 ClusterSimilarity 변환기의 클러스터 수
🔍 random_forest__max_features: 랜덤 포레스트가 각 분할마다 고려할 특성 수
3) 결과 확인
grid_search.best_params_
{'preprocessing__geo__n_clusters': 10, 'random_forest__max_features': 8}
3. Randomized Search (랜덤 탐색)
1) 기본 개념
모든 조합을 탐색하지 않고 지정한 수만큼 랜덤하게 샘플링
조합이 많거나 하이퍼파라미터가 연속적인 경우에 적합
2) 예제 코드
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
param_distribs = {
'preprocessing__geo__n_clusters': randint(low=3, high=15),
'random_forest__max_features': randint(low=2, high=10),
}
rnd_search = RandomizedSearchCV(full_pipeline_with_model,
param_distributions=param_distribs,
n_iter=10,
cv=3,
scoring='neg_mean_squared_error',
random_state=42)
rnd_search.fit(housing_prepared, housing_labels)
3) 결과 확인
rnd_search.best_params_
{'preprocessing__geo__n_clusters': 9, 'random_forest__max_features': 7}
4. 특성 중요도 분석 (Feature Importance)
튜닝된 모델을 바탕으로 어떤 특성이 예측에 중요한지 확인
feature_importances = rnd_search.best_estimator_.named_steps["random_forest"].feature_importances_
extra_attribs = ["rooms_per_household", "population_per_household", "bedrooms_per_room"]
cat_encoder = full_pipeline_with_model.named_steps["preprocessing"].named_transformers_["cat"]
cat_one_hot_attribs = list(cat_encoder.get_feature_names_out())
attributes = num_attribs + extra_attribs + cat_one_hot_attribs
sorted(zip(feature_importances, attributes), reverse=True)
1) 출력 예시
[(0.314, 'median_income'),
(0.112, 'ocean_proximity_INLAND'),
(0.087, 'bedrooms_per_room'),
(0.075, 'longitude'),
... ]
median_income과 ocean_proximity_INLAND가 예측에 가장 큰 영향을 줌
중요도가 낮은 특성은 제거하여 모델 간결화 가능
5. 테스트셋으로 최종 모델 평가
1) 최종 모델로 예측 수행
final_model = rnd_search.best_estimator_
X_test = strat_test_set.drop("median_house_value", axis=1)
y_test = strat_test_set["median_house_value"]
X_test_prepared = final_model.named_steps["preprocessing"].transform(X_test)
final_predictions = final_model.named_steps["random_forest"].predict(X_test_prepared)
2) RMSE 계산
from sklearn.metrics import mean_squared_error
final_mse = mean_squared_error(y_test, final_predictions)
final_rmse = final_mse ** 0.5
print(f"최종 RMSE: {final_rmse:,.2f}")
3) 출력 결과 예시:
최종 RMSE: 41,424.40
6. 정리 및 인사이트
| 항목 | 내용 |
| 최적 모델 | Random Forest Regressor |
| 탐색 방법 | RandomizedSearchCV (n_iter=10) |
| 최적 파라미터 | n_clusters=9, max_features=7 |
| 최종 RMSE | 약 41,424 |
인사이트
- median_income은 예측에 절대적인 영향을 주는 주요 변수
- 중요도가 낮은 특성 제거 → 모델 단순화 및 성능 유지 가능
'AI(ML & DL)' 카테고리의 다른 글
| [기계학습] ML 프로젝트 - 분류(Classfication) 모델 ( 2 ) (0) | 2025.05.23 |
|---|---|
| [기계학습] ML 프로젝트 - 분류 (Classification) 모델 (0) | 2025.05.19 |
| [기계학습] ML 프로젝트 A - Z 까지 ( 6 ) (0) | 2025.05.12 |
| [기계학습] ML 프로젝트 A-Z까지 ( 5 ) (0) | 2025.05.05 |
| [기계학습] ML 프로젝트 A-Z까지 ( 4) (0) | 2025.05.02 |