pythonML

[pythonML] 랜덤포레스트(RandomForest) 하이퍼파라미터(RandomForestClassifier, RandomForestRegressor)

독립성이 강한 ISFP 2023. 6. 9. 14:39
728x90
반응형
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import LabelEncoder
import warnings
warnings.filterwarnings("ignore")
from sklearn.model_selection import train_test_split

train_x # 독립변수
train_y # 종속변수

test # test 데이터셋

x_train, x_valid, y_train, y_valid = train_test_split(train_x, train_y, test_size=0.1, random_state=42)

평가 지표 설정

from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error

def evaluation(y_test , pred):
    
    mae = mean_absolute_error(y_test,pred) ## mae
    mse = mean_squared_error(y_test,pred) # mse
    rmse = np.sqrt(mean_squared_error(y_test,pred)) # rmse

    print('mae: {}, mse: {}, rmse:{}'.format(mae, mse, rmse))

RandomForest 기본 예시 코드

from sklearn.ensemble import RandomForestRegressor

# 랜덤 포레스트 모델 초기화
rf_model = RandomForestRegressor()
rf_model.fit(X_train, y_train)
pred = rf_model.predict(X_test)

RandomForest 파라미터 삽입 예시 코드

from sklearn.ensemble import RandomForestRegressor

# 랜덤 포레스트 모델 초기화
rf_model = RandomForestRegressor(n_estimators=100, max_features="sqrt", random_state=42)
rf_model.fit(X_train, y_train)
pred = rf_model.predict(X_test)

RandomForest 하이퍼파라미터 튜닝 예시 코드

from sklearn.model_selection import GridSearchCV

params = {
    'n_estimators':[2800, 3000, 3300],
    'max_depth' : [6, 8, 10, 12], 
    'min_samples_leaf' : [8, 12, 18],
    'min_samples_split' : [8, 16, 20]
}

rf_clf = RandomForestRegressor(random_state=0, n_jobs=-1)
grid_cv = GridSearchCV(rf_clf , param_grid=params , cv=2, n_jobs=2, verbose=2 )
grid_cv.fit(x_train , y_train) # grid.cv.fit(train_x, train_y)

estimator =grid_cv.best_estimator_ 
pred = estimator.predict(x_valid) # estimator.predict(test)

print('최적 하이퍼 파라미터:\n', grid_cv.best_params_)
print('최고 예측 정확도: {0:.4f}'.format(grid_cv.best_score_))
evaluation(y_valid , pred)

 


RandomForest 하이퍼 파라미터 

class sklearn.ensemble.RandomForestRegressor(
    n_estimators=100, 
    max_features=1.0, 
    criterion='squared_error', 
    max_depth=None, 
    min_samples_split=2, 
    min_samples_leaf=1, 
    min_weight_fraction_leaf=0.0, 
    max_leaf_nodes=None, 
    min_impurity_decrease=0.0, 
    bootstrap=True, 
    n_jobs=None, 
    random_state=None, 
    verbose=0
)
class sklearn.ensemble.RandomForestClassifier(
    n_estimators=100, 
    max_features='sqrt', 
    criterion='gini', 
    max_depth=None, 
    min_samples_split=2, 
    min_samples_leaf=1, 
    min_weight_fraction_leaf=0.0, 
    max_leaf_nodes=None, 
    min_impurity_decrease=0.0, 
    bootstrap=True, 
    n_jobs=None, 
    random_state=None, 
    verbose=0, 
    class_weight=None
)
  • n_estimators: 생성할 트리의 개수 (int, default=100)

    • 트리의 개수가 많을수록 앙상블 모델의 성능이 향상될 수 있지만, 계산 비용도 증가
    • 트리 개수가 일정 수 이상이면 결과의 향상이 크게 나타나지 않음
  • max_features: 노드를 분할할 때 고려할 특성의 무작위 하위 집합의 크기

    회귀: {“sqrt”, “log2”, None}, int or float, default=1.0
    분류: {“sqrt”, “log2”, None}, int or float, default="sqrt"

    • 값을 작게 설정하면 분산 감소, 편향 증가, 복잡도 감소, 모델의 성능 감소
    • 값을 크게 설정하면 분산 증가, 편향 감소, 복잡도 증가, 모델의 성능 증가, 과적합 위험
      • 정수(int): 정수 개의 특성 고려
      • 부동소수점(float): 1과 max_features * n_features_in_의 정수 값 중 큰 값 고려
      • auto:  n_features(회귀) / auto : sqrt(n_features) (분류)
      • sqrt: sqrt(n_features) 
      • log2: log2(n_features)
      • None or 1: n_features(회귀) / None: n_features(분류)
  • criterion: 노드의 분할 기준을 결정하는 데 사용되는 평가 지표

    회귀 {“squared_error”, “absolute_error”, “friedman_mse”, “poisson”}, default=”squared_error”

    노드 분할의 품질을 측정하는 기준으로 사용
    • "squared_error" (평균 제곱 오차, Mean Squared Error): 각 분할에서 평균 예측값과 실제값 간의 제곱 차이를 계산하고, 이를 모든 분할에 대해 합산하여 평균을 구합니다. 
    • "friedman_mse":(Friedman의 평균 제곱 오차): "squared_error"와 비슷한 개념이지만, 잠재적인 분할에 대한 Friedman의 개선 점수를 고려합니다. 이 개선 점수는 각 분할의 오차 감소 정도를 측정하여 최적의 분할을 선택하는 데 활용됩니다.
    • "absolute_error" (평균 절대 오차, Mean Absolute Error): 각 분할에서 평균 예측값과 실제값 간의 절대 차이를 계산하고, 이를 모든 분할에 대해 평균을 구합니다.
    • "poisson" (포아송 손실, Poisson Loss): 각 분할에서 포아송 분포와 실제값 간의 편차를 측정합니다. 

    분류:   {“gini”, “entropy”, “log_loss”}, default=”gini”


    노드의 분할 기준은 불순도를 기준으로 결정.
    불순도는 해당 노드의 클래스 불균형 정도를 측정하는 지표로서, 불순도는 낮추고, 순도를 높이는 방향으로 분할이 이루어져야 함.분류 
    • "gini": gini 지수가 낮을수록 노드의 순도가 높아짐
    • "entropy": entropy가 낮을수록 노드의 순도가 높아짐

    ▶ 보통은 기본값인 "gini" (또는 "mse")가 잘 동작하지만, 특정 문제에 따라 다른 criterion 값을 실험하여 최적의 성능을 얻을 수도 있습니다.

  • max_depth: 트리의 최대 깊이 (int, default=None)
    • 깊이가 제한된 트리는 각각의 결정 경계를 더 간단하게 만들며, 모델이 데이터에 과적합되는 것을 방지할 수 있습니다.
    • 값을 작게 설정하면 모델의 단순성을 증가, 분산 감소, 편향 증가 → 데이터의 다양한 패턴을 잡아내지 못함, 일반화 능력 향상
    • 값을 증가시키면 모델의 복잡성, 분산 증가, 편향 감소 → 과적합 가능성, BUT 더 복잡한 패턴을 학습 가능.
  • min_samples_split: 노드를 분할하기 위해 필요한 최소한의 샘플 개수 (int or float, default=2)
    • 샘플 개수가 이 값보다 작아지면 더 이상 분할하지 않고 리프 노드(말단 노드)로 설정
    • 값을 작게 설정하면 모델 복잡성 증가. 더 복잡한 결정 경계를 가진 모델이 생성되어 데이터의 작은 변동에도 민감하게 반응 → 과적합 위험, 적은 수의 샘플을 기반으로 한 결정이 노이즈에 영향을 받을 가능성
    • 값을 증가시키면 모델의 편향이 증가, 분산은 감소. 즉, 더 단순한 모델이 생성되어 모델의 복잡도 감소. 이는 결정 경계가 더 단순해지고 일부 정보의 손실이 발생 → 모델이 과적합되는 위험 감소, 너무 큰 값으로 설정하면 모델이 너무 단순해져서 예측 성능이 저하
  • min_samples_leaf: 노드를 분할하기 위해 리프 노드가 가져야 할 최소한의 샘플 개수(int or float, default=1)
    • 값을 작게 설정하면 모델 복잡성 증가. → 과적합의 위험
    • 값을 증가시키면 모델의 편향은 증가하고 분산은 감소. 모델의 복잡도가 낮아지지만, 일부 정보의 손실이 발생
  • max_leaf_nodes: 생성될 수 있는 최대 리프 노드의 개수를 제한 (int, default=None)

    일반적으로 랜덤 포레스트의 트리는 자라다가 가능한 한 많은 리프 노드를 생성하려는 경향이 있습니다.
    그러나 max_leaf_nodes를 설정함으로써 트리의 성장을 제한할 수 있습니다.
    max_leaf_nodes를 지정하면 트리는 해당 개수 이상의 리프 노드를 생성하지 않습니다.
    이를 통해 과적합을 방지하고, 일반화 능력을 향상시킬 수 있습니다.
    작은 max_leaf_nodes 값은 모델의 단순성을 증가시키고 편향을 높일 수 있습니다. 
  • min_impurity_decrease: 노드를 분할하기 위한 최소한의 불순도 감소량.(float, default=0.0)

    노드의 분할은 해당 분할이 전체 트리의 불순도를 감소시키는지 여부에 따라 결정
    min_impurity_decrease는 불순도 감소량이 이 값보다 크거나 같을 때 분할이 이루어져야 함을 의미.
    즉, 분할이 불순도 감소량이 충분히 크지 않으면 노드는 더 이상 분할되지 않고 잎 노드로 유지.
    • 값을 작게 설정하면 노드의 분할이 더 자주 일어남.(양수로 지정) 모델의 복잡도 증가
    • 값이 크게 설정하면 노드의 분할이 덜 발생. 제약이 강해짐
  • n_jobs: 모델 학습 및 예측에 사용되는 병렬 작업의 수(int, default=None)

    랜덤 포레스트는 결정 트리의 앙상블로 구성되어 있으며, 각각의 결정 트리는 독립적으로 학습 및 예측이 가능합니다.
    이러한 특성을 활용하여 n_jobs 파라미터를 설정함으로써 병렬 처리를 통해 모델의 학습 및 예측 속도를 향상시킬 수 있습니다.

    파라미터:
    • 1: 모든 가능한 프로세서를 사용하여 병렬 처리합니다.
    • 양의 정수: 지정된 수의 프로세서를 사용하여 병렬 처리합니다.
  • bootstrap: 부트스트래핑은 중복을 허용하여 샘플을 랜덤 하게 선택하는 방식, 모델의 다양성을 증가. (bool, default=True)

  • random_state: 랜덤 시드를 지정하는 파라미터로, 재현성을 위해 사용됩니다.
    동일한 시드 값을 사용하면 같은 결과를 얻을 수 있음.(int, default=None)

  • verbose: 학습과 예측 시에 출력되는 정보의 상세도를 제어
    • verbose=0: 출력이 비활성화되어 가장 적은 양의 정보만 표시.
    • verbose=1: 학습 및 예측 과정에서 진행 상황 메시지 표시. 진행 상황을 모니터링하고 싶을 때 유용.

RandomForest 속성

  • best_estimator_
    GridSearchCV 객체에서 최적의 추정기(estimator)를 반환하는 속성입니다.
    GridSearchCV는 주어진 하이퍼파라미터 그리드(param_grid)에서 모든 조합을 시도하고, 교차 검증을 통해 각 조합의 성능을 평가합니다. 그리드 서치가 완료되면 best_estimator_ 속성은 최적의 조합으로 학습된 추정기(estimator)를 반환합니다.
grid_cv.best_estimator_

> RandomForestRegressor(n_estimators = 3000, max_depth=8, min_samples_leaf=8, min_sample_split=8, n_jobs=-1, random_state=0)

  • feature_importances_
    랜덤 포레스트는 다수의 의사 결정 트리를 앙상블하여 모델을 구성합니다. 각 트리는 피처들을 사용하여 분할을 수행하고, 이 과정에서 피처들의 중요도를 계산합니다. feature_importances_ 속성은 이러한 중요도 값을 모아서 제공합니다.
    주로, 중요도 값은 0과 1 사이의 실수 값으로 표현되며, 피처들 간의 상대적인 중요도를 나타냅니다. 중요도 값이 클수록 해당 피처가 예측에 더 큰 영향을 미친다고 해석할 수 있습니다.
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

ftr_importances_values = estimator.feature_importances_
ftr_importances = pd.Series(ftr_importances_values,index=x_train.columns)
ftr_top = ftr_importances.sort_values(ascending=False)

plt.figure(figsize=(8,6))
plt.title('Feature importances')
sns.barplot(x=ftr_top , y = ftr_top.index)
plt.show()

  • n_features_in_
    RandomForest 모델이 학습 시에 관찰한 특성(feature)의 수를 나타내는 속성입니다.
    이 속성은 모델이 fit() 메서드를 사용하여 학습된 후에 사용할 수 있습니다.
grid_cv.n_features_in_

> 13

  • feature_names_in_
    RandomForest 모델이 학습 시에 사용된 특성(feature)의 이름을 나타내는 속성입니다.
    이 속성은 입력 데이터(X)의 특성 이름이 모두 문자열로 되어 있을 때만 해당 속성을 사용할 수 있습니다.
    "feature_names_in_"은 각 특성의 이름을 포함하는 배열 또는 리스트로 표현됩니다.
grid_cv.feature_names_in_

> array(['생산년도', '모델출시년도', '브랜드', '차량모델명', '판매도시', '판매구역', '주행거리', '배기량', '압축천연가스(CNG)', '경유', '가솔린', '하이브리드', '액화석유가스(LPG)'], dtype=object)

728x90
반응형