Boosting


分類の問題を解決するために、ツリーコンビネーションモデルがよく使用されます.
  • ツリーの組合せはrandomforestまたはgradient boostingモデルを用い,多くの問題で良好な性能を示した.
  • ツリーモデルは,非線形,非単調関係,特性間相互作用の存在するデータ学習に適している.
  • 本の木を深く勉強すると、過適合性が生じやすいので、ジョギング(Bagging,ランダムForest)またはBoosting(Boosting)の組み合わせモードを使用して、過適合性を回避します.
  • ランダムforestの利点は、スーパーパラメータに相対的に敏感ではないことであり、グラデーションガイドでは、スーパーパラメータ設定に基づいて、ランダムforestよりも良い予測性能を示すことができる.
  • Boosting vs Bagging


    ランダムforrestとグラデーションboostingはいずれもツリーの連合モデルであるが,ツリーの作成方法に差がある.
    最大の違いは、ランダムツリーでは各ツリーが独立して作成されますが、boostingで作成されたツリーは、以前に作成されたツリーの影響を受けます.
    Boostingアルゴリズムでは、AdaBoostが各ツリー(弱学習器、弱学習者)の作成時に誤って分類された観測値を重み付けし、次のツリーを生成する際に、そのツリーの誤った分類の観測値をより多くサンプリングし、その観測値の分類に焦点を当てる.

  • bagging:複数の弱いモデルを作成する
    bagデータには重複性があり、学習に使用されないデータ(out bag,OOB)がある可能性がある.(データのアンバランス防止には関係ありません.)

  • boosting:モデル予測エラーのサンプル(エラー)を徐々に強化し、エラー分類のサンプルを重み付けし、より明確にする.
  • Boosting


    AdaBoost



    AdaBoostはグラデーションブートと類似しているが,コスト関数を最適化する方法には差がある.AdaBoostでは,より重みの大きいデータを学習するために,サンプルの重みを調整することができる.
    1πの全ての観測値は同じ重み付け値を設定した.
    2朕は観測値の抽出を再開し、弱学習期間DNを学習し、+と-を分類する.
    3ππは、次のプロセスでサンプリングを行うために、誤った分類の観測値に重み付け値を与える.
    4異異~3異の過程はn回繰り返される.
    5」分類機(D 1、D 2、…、DN)と組み合わせて最終予測を行う.
    AdaBoostのコードは以下の通りです.

    最終学習期間H(x)H(x)H(x)H(x)H(x)は弱い学習期間(ht)(ht)(ht)の重み付け(α\alphaα)一つになる.
    ここでαt\alpha_tαtが大きいほどete tetが小さくなり、分類器hth thtの性能が良い.
    ここでαt\alpha_tαtが小さいとete tetが大きく、分類器hth thtの性能が悪いことを示している.

    Gradient Boosting



    グラデーションブートは、問題を回帰および分類するために使用できます.
    グラデーションブートはAdaBoostと似ていますが、コスト関数を最適化する方法には違いがあります.グラデーション・ブート・プログラムを使用すると、より大きなデータを学習するために残差を学習できます.

    sklearningに加えて、ブートを実装した多くのライブラリを使用することもできます。

  • scikit-learning Gradient Tree Boosting:速度が比較的遅い場合があります.
  • xgboost:接合側の値を受け入れ、単調な制約を強制できます.
  • LightGBM:接合側の値を受け入れ、単調拘束を強制できます.
  • CatBoost:実測値を受け取り、前処理を必要とせずに分類特徴を使用する.
  • monotonic constraints


    単調に増加する必要がある特性が、単調に増加するのではなくエラーによって適用される場合、各変数は適用されます.

    xgboostライブラリのMLモデル

    from xgboost import XGBClassifier
    
    pipe = make_pipeline(
        OrdinalEncoder(),
        SimpleImputer(strategy = 'median'),
        XGBClassifier(n_estimator = 200
                , random_state = 2
                , n_jobs = -1
                , max_depth = 7
                , learning_rate = 0.2
                )
    )
    
    pipe.fit(X_train, y_train);
    xgboostはランダムforestよりもスーパーパラメータ設定に敏感である.
    有効なライブラリでもあり、適切であることを確認します.min_child_weight inxgboost:および適切なブロック
    分割過程において、葉の重量が全て加算した重量よりも小さい場合、分割を停止する.葉の重量が指定された重量より小さい場合は、分類を停止する制限を適用して過剰な適合を阻止することができる.scale_pos_weight:バランスデータ

    Early Stopを使用してマッチングを回避

    n_estimatorsを最適化するために、GridSearchCVまたは反復文ではなく早期停止が使用される.n_iterationsを繰返し数と呼ぶ場合、早期停止を使用するため、n_iterationsの木を学ぶだけです.
    しかし,GridSearchCVまたは反復文を用いると,sum(range(1,n_rounds+1))までの木を学習する.また、max_depthlearning_rateなどのパラメータの値に合わせて調整する必要があります.

    ターゲットのパーセンテージがバランスしていない場合、ratioを計算してクラスの重みを与えます。

    # class에 적용할 weight 계산하기
    vc = y_train.value_counts().tolist()
    
    ratio = float(vc[0]/vc[1])ratio
    
    
    encoder = OrdinalEncoder()
    X_train_encoded = encoder.fit_transform(X_train) #학습데이터 인코딩
    X_val_encoded = encoder.transfor,(X_val) #검증데이터 인코딩
    
    model = XGBClassifier(
        n_estimators = 1000, # 1000 트리로 설정했지만, early stopping 에 따라 조절된다.
        max_depth = 7, # default=3이며 high cardinality 특성을 위해 기본보다 높였다.
        learning_rate = 0.2,
        #scale_pos_weight=ratio, # imbalance 데이터 일 경우 비율을 적용합니다.
        n_jobs = -1
    )
    
    eval_set = [(X_train_encoded, y_train), 
                (X_val_encoded, y_val)]
    
    model.fit(X_train_encoded, y_train, 
              eval_set=eval_set,
              eval_metric='error', # #(wrong cases)/#(all cases)
              early_stopping_rounds=50
             ) # 50 rounds 동안 스코어의 개선이 없으면 멈춤
    以上の計算式には、以下のような結果値が残ります.
    results = model.evals_result()
    train_error = results['validation_0']['error']
    val_error = results['validation_1']['error']
    
    epoch = range(1, len(train_error)+1)
    plt.plot(epoch, train_error, label='Train')
    plt.plot(epoch, val_error, label='Validation')
    plt.ylabel('Classification Error')
    plt.xlabel('Model Complexity (n_estimators)')
    plt.ylim((0.15, 0.25)) # Zoom in
    plt.legend();