[머신러닝] 하이퍼파라미터 / 최적의 하이퍼파라미터 찾기란 무엇인가? / Random Forest와 하이퍼파라미터

2025. 2. 27. 22:11AI & DS/머신러닝

하이퍼파라미터(Hyperparameter)란?

  • 하이퍼파라미터(Hyperparameter)는 모델이 학습하기 전에 설정해야 하는 값(설정값, 옵션)
  • 모델이 직접 학습하는 것이 아니라, 사람이 설정해야 하는 값 -> 모델의 성능을 조정하는 중요한 역할

 하이퍼파라미터 vs 모델이 학습하는 파라미터

  • 모델이 학습하는 파라미터 (모델 내부에서 자동으로 학습됨) : 데이터를 보고 자동으로 최적화됨
    • 로지스틱 회귀의 가중치(W)와 편향(b)
    • 신경망(딥러닝)에서 뉴런 간의 가중치 값
  • 하이퍼파라미터 (사람이 직접 설정해야 함) : 학습 전에 사람이 직접 설정해야 하고, 모델이 자동으로 찾지 못함
    • 랜덤 포레스트의 n_estimators (트리 개수)
    • KNN의 K 값 (몇 개의 이웃을 볼 것인지)
    • 신경망에서 learning rate (학습률)

랜덤 포레스트에서 최적의 하이퍼파라미터 찾기

랜덤 포레스트에는 여러 개의 하이퍼파라미터가 있음 -> 예를 들어, 다음 두 가지를 조정할 수 있음

하이퍼파라미터 설명
n_estimators 몇 개의 결정 트리를 만들 것인가? (트리 개수)
max_depth 각 트리의 최대 깊이는 얼마로 할 것인가?
  • 적절한 하이퍼파라미터를 찾는 과정이 중요하다.
    • 예를 들어,
      • n_estimators = 10, max_depth = 5 :  너무 단순한 모델 (과소적합, underfitting)
      • n_estimators = 100, max_depth = 10 : 좋은 성능을 보임
      • n_estimators = 500, max_depth = 50 : 너무 복잡한 모델 (과적합, overfitting)

최적의 하이퍼파라미터 찾기 : GridSearchCV 

  • GridSearchCV 또는 RandomizedSearchCV : 자동으로 최적의 값을 찾아줌
    • 모든 조합을 테스트해서 가장 성능이 좋은 하이퍼파라미터를 자동으로 찾아주는 방법
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier

# 1. 랜덤 포레스트 모델 생성
rf_model = RandomForestClassifier()

# 2. 탐색할 하이퍼파라미터 범위 설정
params = {
    'n_estimators': [50, 100, 150, 200],  # 트리 개수
    'max_depth': [5, 10, 15]  # 트리 깊이
}

# 3. GridSearchCV 설정 (5-Fold 교차 검증 사용)
grid_search = GridSearchCV(rf_model, param_grid=params, cv=5, scoring='accuracy')

# 4. 모델 학습 (최적의 하이퍼파라미터 찾기)
grid_search.fit(X_train, y_train)

# 5. 최적의 하이퍼파라미터 출력
print("최적의 파라미터:", grid_search.best_params_)
최적의 파라미터: {'max_depth': 10, 'n_estimators': 150}
# 즉, 트리 개수 150개, 깊이 10일 때 가장 좋은 성능을 보였음

최적의 파라미터로 학습된 랜덤 포레스트 모델 가져오기

최적의 모델 선택 (best_rf_model = grid_search.best_estimator_)

best_rf_model = grid_search.best_estimator_
  • grid_search.best_estimator_ : 최적의 하이퍼파라미터로 학습된 랜덤 포레스트 모델을 가져옴
  • 즉, 가장 성능이 좋은 모델을 선택하여 이후 예측에 사용
📌 왜 이걸 할까?
- GridSearchCV는 여러 개의 모델을 비교해서 가장 좋은 모델을 찾는 과정
- 최적의 모델(best_estimator_)을 저장해서 테스트 데이터에서 예측을 수행하기 위해 사용

 

 

예측 수행 (best_rf_model.predict())

rf_pred = best_rf_model.predict(X_test_scaled)
  • X_test_scaled(테스트 데이터)를 입력하여 클래스를 예측
  • rf_pred에는 모델이 예측한 값이 들어감 (예: [0, 1, 1, 0, ...])
[0, 1, 1, 1, 0, 0, 1, 1, 0, ...]
# 테스트 데이터에 대해 모델이 양성(0)인지 악성(1)인지 예측

 

 

모델 평가 (Confusion Matrix 출력)

rf_matrix = confusion_matrix(y_test, rf_pred)
print("Random Forest Confusion Matrix:")
print(rf_matrix)
  • 혼동 행렬(Confusion Matrix)을 계산하여 모델의 성능을 평가
  • y_test(실제 값)과 rf_pred(예측 값)를 비교
Random Forest Confusion Matrix:
[[ 59   4]
 [  1 107]]