n224_Model Selection


学習目標
  • 機種選択 クロス検証 使い方が理解できる.
  • スーパーパラメータを最適化することによってモデルの性能を向上させることができる.
  • クロス検証



    データが不十分な場合、提案された検証方法を用いて、訓練セットから検証セットを取り外して評価するプロセスを複数回繰り返し、これらのスコアを平均して最終的な検証スコアを得る.

    長所


    すべてのデータセットはトレーニングに使用できます.
  • の精度を向上させることができます.
  • のデータ不足による不適合を防止することができる.
  • すべてのデータセットを評価に使用できます.
    これにより、
  • の評価に使用されるデータの偏りを防止することができる.(検証データは1つのデータに偏らず、検証データを分離することなく学習データの全体的な検証精度を得ることができる.)
  • の評価結果によれば、より一般化されたモデルを作成することができる.
  • 短所

  • は反復回数が多いため,長いモデル訓練/評価時間が必要である.
  • クロス検証は、時系列データには適用されません.
  • *hold-outクロス検証
    十分なデータがある場合に使用し、元のデータを学習、検証、テストの3つのデータセットに分け、訓練データで学習する方法.しかし,データセット全体の数がそれほど大きくなければ,モデル予測性能の推定は不正確になる.つまり、良いアウトを作ることに非常に注意しなければならない.

    k-fold cross-validation(CV)



    k個の集合のうち、k−1個の部分集合はトレーニングに用いられ、残りの部分集合はテストデータとして検証され、データの一部を検証データとして学習する.学習データのすべてのデータをk回の検証で検証データとし、k個の検証結果の平均値を検証性能評価指標として使用します.
    pipe = make_pipeline(
        OneHotEncoder(use_cat_names=True), 
        SimpleImputer(strategy='mean'), 
        StandardScaler(), 
        SelectKBest(f_regression, k=20),
        Ridge(alpha=1.0)
    )
    
    # 3-fold 교차검증을 수행합니다.
    k = 3
    scores = cross_val_score(pipe, X_train, y_train, cv=k, 
                             scoring='neg_mean_absolute_error')
    #일반적으로 scoring을 값이 클 수록 모델 성능이 좋은 것으로 사이킷런에서 인식하는데, mae는 값이 클 수록 모델 성능이 저하되는 것이므로 Negative 키워드를 붙여서 사용
    print(f'MAE ({k} folds):', -scores)
    
    #평균&정규화
    -scores.mean()
    scores.std()
    from category_encoders import TargetEncoder
    from sklearn.ensemble import RandomForestRegressor
    
    pipe = make_pipeline(
        # TargetEncoder: 범주형 변수 인코더로, 타겟값을 특성의 범주별로 평균내어 그 값으로 인코딩
        TargetEncoder(min_samples_leaf=1, smoothing=1), 
        SimpleImputer(strategy='median'), 
        RandomForestRegressor(max_depth = 10, n_jobs=-1, random_state=2)
    )
    
    k = 3
    
    scores = cross_val_score(pipe, X_train, y_train, cv=k, 
                             scoring='neg_mean_absolute_error')    
    #일반적으로 scoring을 값이 클 수록 모델 성능이 좋은 것으로 사이킷런에서 인식하는데, mae는 값이 클 수록 모델 성능이 저하되는 것이므로 Negative 키워드를 붙여서 사용합니다.
    
    print(f'MAE for {k} folds:', -scores)
    
    -scores.mean()
    scores.std()

    (mean)TargetEncoder




    カテゴリ変数エンコーダとして,ターゲット値を特性のカテゴリ別に平均符号化する.
    #범주형 데이터만 출력
    X_train.describe(exclude='number')
    from category_encoders import TargetEncoder
    from sklearn.ensemble import RandomForestRegressor
    
    pipe = make_pipeline(
        # TargetEncoder: 범주형 변수 인코더로, 타겟값을 특성의 범주별로 평균내어 그 값으로 인코딩
        TargetEncoder(min_samples_leaf=1, smoothing=1), 
        SimpleImputer(strategy='median'), 
        RandomForestRegressor(max_depth = 10, n_jobs=-1, random_state=2)
    )

    ちょうパラメータちょうせい


    マシンラーニングモデルの作成には、次の2つの重要な問題があります.
  • 最適化(最適化):
  • モデルを調整してより良いトレーニングデータを得る
  • 一般化(一般化):学習モデルの最初に見たデータにおける性能について述べる
  • 理想的なモデルは、小さな統合と適切な間に存在します.
  • と小適合:
  • 、トレーニング/検証キットの損失が同時に減少
  • と適合(オーバーフィット):トレーニングデータの損失は減少し続け、検証データの損失は増加します.
  • 検証曲線の描画(検証曲線)

    import matplotlib.pyplot as plt
    from category_encoders import OrdinalEncoder
    from sklearn.model_selection import validation_curve
    from sklearn.tree import DecisionTreeRegressor
    
    pipe = make_pipeline(
        OrdinalEncoder(), 
        SimpleImputer(), 
        DecisionTreeRegressor()
    )
    
    depth = range(1, 30, 2)
    ts, vs = validation_curve(
        pipe, X_train, y_train
        , param_name='decisiontreeregressor__max_depth'
        , param_range=depth, scoring='neg_mean_absolute_error'
        , cv=3
        , n_jobs=-1
    )
    
    train_scores_mean = np.mean(-ts, axis=1)
    validation_scores_mean = np.mean(-vs, axis=1)
    
    fig, ax = plt.subplots()
    
    # 훈련세트 검증곡선
    ax.plot(depth, train_scores_mean, label='training error')
    
    # 검증세트 검증곡선
    ax.plot(depth, validation_scores_mean, label='validation error')
    
    # 이상적인 max_depth
    ax.vlines(5,0, train_scores_mean.max(), color='blue')
    
    # 그래프 셋팅
    ax.set(title='Validation Curve'
          , xlabel='Model Complexity(max_depth)', ylabel='MAE')
    ax.legend()
    fig.dpi = 100

    このようにしてツリーの深さを決定する必要がある場合は、max depth=5付近で設定しなければ、オーバーフィットを防止し、一般化されたパフォーマンスを維持できません.

    Randomized Search CV



    実際には、ユーザが自分で決定するスーパーパラメータが必要であるため、手動で決定することは困難であるため、通常、ツールを使用してコース運転中に最適なスーパーパラメータの組み合わせを見つけることができる.
  • GridSearchCV:検証するスーパーパラメータを決定し、すべての組合せ
  • を検証する
  • RandomizedSearchCV:検証するスーパーパラメータの値範囲を指定し、ランダムに値を指定して、すべての組合せ
  • を検証します.
    from sklearn.model_selection import RandomizedSearchCV
    from scipy.stats import randint, uniform
    
    pipe = make_pipeline(
        TargetEncoder(), 
        SimpleImputer(), 
        RandomForestRegressor(random_state=2)
    )
    
    dists = {
        'targetencoder__smoothing': [2.,20.,50.,60.,100.,500.,1000.], # int로 넣으면 error(bug)
        'targetencoder__min_samples_leaf': randint(1, 10),     
        'simpleimputer__strategy': ['mean', 'median'], 
        'randomforestregressor__n_estimators': randint(50, 500), 
        'randomforestregressor__max_depth': [5, 10, 15, 20, None], 
        'randomforestregressor__max_features': uniform(0, 1) # max_features
    }
    
    clf = RandomizedSearchCV(
        pipe, 
        param_distributions=dists, 
        n_iter=50, 
        cv=3, 
        scoring='neg_mean_absolute_error',  
        verbose=1,
        n_jobs=-1
    )
    #일반적으로 scoring을 값이 클 수록 모델 성능이 좋은 것으로 사이킷런에서 인식하는데, mae는 값이 클 수록 모델 성능이 저하되는 것이므로 Negative 키워드를 붙여서 사용합니다.
    
    clf.fit(X_train, y_train);
    
    print('최적 하이퍼파라미터: ', clf.best_params_)
    print('MAE: ', -clf.best_score_)
    
    
    #각 하이퍼파라미터 조합으로 만들어진 모델들을 순위별로 나열
    pd.DataFrame(clf.cv_results_).sort_values(by='rank_test_score').T
    
    
    #테스트 데이터에 대한 예측 결과
    # 만들어진 모델에서 가장 성능이 좋은 모델을 불러옵니다.
    pipe = clf.best_estimator_
    
    from sklearn.metrics import mean_absolute_error
    
    y_pred = pipe.predict(X_test)
    mae = mean_absolute_error(y_test, y_pred)
    print(f'테스트세트 MAE: ${mae:,.0f}')

    Parameter



    best_estimator : estimator
    Estimator that was chosen by the search, i.e. estimator which gave highest score (or smallest loss if specified) on the left out data. Not available if refit=False. ... See refit parameter for more information ...
    =>best estimator CV終了後に見つかったbestparameterを使用してすべての学習データを自動的に再学習(再結合)
    refit : boolean, string, or callable, default=True
    Refit an estimator using the best found parameters on the whole dataset.
    =>hold-outクロス検証(トレーニング/検証/テストセットとして1回の実験のみ)を実行した場合は、(トレーニング+検証)データセットで最適化されたスーパーパラメータを使用して最終モデルを再学習(再インストール)する必要があります.

    線形回帰,ランダム森林モデルの調節推奨超パラメータ


    Random Forest

  • 類weight(アンバランス類)
  • max dept(深すぎるとぴったり)
  • n推定器(少ない時は低く、高い時は長い)
  • minサンプルリーフ(適切であればアップ)
  • max特性(少ないほど良い)
  • Logistic Regression

  • C (Inverse of regularization strength)
  • class weight(アンバランスクラス)
  • penalty
  • Ridge / Lasso Regression

  • alpha