ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 하이퍼 파라미터 튜닝 - GridSearchCV
    카테고리 없음 2022. 6. 22. 15:27

    사용할 데이터 

    import seaborn as sns
    dia = sns.load_dataset("diamonds") #seaborn에서 diamonds샘플 데이터를 가져옵니다
    dia.columns
    
    Index(['price', 'cut', 'color', 'clarity', 'depth', 'table', 'carat', 'x', 'y',
           'z'],
          dtype='object')
    # price : 종속변수 , 다이아몬드 가격
    
    
    # 'x' : 다이아몬드 x 축 길이
    # 'y' : 다이아몬드 y 축 길이
    # 'z' : 다이아몬드 z 축 길이
    
    
    dia.head()
    price cut color clarity depth table carat x y z
    326 Ideal E SI2 61.5 55.0 0.23 3.95 3.98 2.43
    326 Premium E SI1 59.8 61.0 0.21 3.89 3.84 2.31
    327 Good E VS1 56.9 65.0 0.23 4.05 4.07 2.31
    334 Premium I VS2 62.4 58.0 0.29 4.20 4.23 2.63
    335 Good J SI2 63.3 58.0 0.31 4.34 4.35 2.75

     

    #전처리는 범주형 변수만 원핫인코딩 진행
    dia = pd.get_dummies(data = dia, columns=['cut','color','clarity'])
    
    #종속변수 설정
    y = dia['price']
    
    #독립변수 설정
    x_list = []
    for x in dia.columns:
        if x != 'price':
            x_list.append(x)
    x = dia[x_list]

     


     

    1. 사이킷런 model_selection 패키지의 GridSearchCV 클래스를 불러옵니다

    from sklearn import model_selection
    #from sklearn.model_selection import GridSearchCV

     

    2. 모델과 파라미터를 정의 합니다

    dtr = DecisionTreeRegressor(random_state=42) 
    
    grid_params = {'max_depth':[None,10,15,20,25,30,35],
                   'min_samples_leaf':[10,20,30]}

    하이퍼 파라미터는 딕셔너리 형태로 key 를 파라미터, value를 해당 값으로 설정합니다.

     

     

    3. GridSearchCV 객체를 생성합니다

    grid_dtr = model_selection.GridSearchCV(model,
                                            params,
                                            scoring='neg_root_mean_squared_error',
                                            cv=5,
                                            return_train_score=True)
    더보기

    GridSearchCV 주요 파라미터

    estimator : 자신이 정의 한 모델
    param_grid : 우리가 완전 탐색할 파라미터(딕셔너리)
    scoring : 평가지표
    cv : fold 수 ( 교차검증 횟수)
    return_train_score :  True 로 설정시 결과값 속성을 불러올 때 훈련 점수까지 불러 올 수 있습니다.
    refit : 최고 점수로 설정된 하이퍼 파라미터로 다시 전체 데이터를 학습시킵니다.

     

     

    4. 적합시킵니다.

    grid_dtr.fit(x_train,y_train)

     

    5. best_estimator_속성을 다시 할당합니다.

    #주요 속성
    print(grid_dtr.best_score_)
    -654.3322993618057
    
    print(grid_dtr.best_estimator_)
    DecisionTreeRegressor(min_samples_leaf=12, random_state=42)
    
    #모델에 파라미터값 전달
    dtr = grid_dtr.best_estimator_

     

    5. 성능이 가장 좋은 파라미터를 가진 학습기로 모델을 훈련시킵니다.

    #train 전체 데이터를 적합
    dtr.fit(x_train,y_train)
    
    #예측
    y_pred = dtr.predict(x_test)
    
    
    #테스트 세트에 대한 rmse값 
    from sklearn import metrics
    print(np.sqrt(metrics.mean_squared_error(y_pred,y_test)))
    629.6115576448587


    전체 코드

    #1 
    from sklearn import model_selection
    from sklearn.tree import DecisionTreeRegressor
    
    #2
    dtr = DecisionTreeRegressor(random_state=42)
    grid_params = {'max_depth':[None,10,15,20,25,30,35],
                   'min_samples_leaf':[10,20,30]}
    
    
    #3
    grid_dtr = model_selection.GridSearchCV(model,
                                            params,
                                            scoring='neg_root_mean_squared_error',
                                            cv=5,
                                            return_train_score=True)
    
    #4
    grid_dtr.fit(x_train,y_train)
    
    #5
    dtr = grid_dtr.best_estimator_
    dtr.fit(x_train,y_train)
    dtr.predcit(x_test)

     

     

    추가 :  그리드 서치한 교차 검증 셋의 스코어 보기

    #grid_dtr.cv_results_ : 딕셔너리 형태로 점수가 할당 되어 있어 데이터 프레임으로 변환
    
    grid_result = pd.DataFrame(grid_dtr.cv_results_)
    grid_result[['params','mean_test_score','mean_train_score']].head()
    #train_score의 경우 return_train_score=True 설정을 해야함.

     

     

    RandomizedSearchCV 함수를 사용하여 탐색 범위를 먼저 줄이고 완전 탐색하는 것(GridSearchCV)을 권장합니다.

    댓글

Designed by Tistory.