概要XGBoost勾配後押しツリーを使用してライブラリをscikitが-学ぶ(GBDT)パラメータ調整の概要

    でXGBoostアルゴリズム原理の概要、我々は原則XGBoostアルゴリズム、我々はPythonライブラリのXGBoostを使用する方法について説明し、この1と同様に、重要性と、いくつかの重要なパラメータを考えアシスタントを議論しました。

    本論文では、を参照してXGBoostのPythonドキュメント  と  ドキュメントXGBoostのパラメータ

1. XGBoostライブラリの概要

    Pythonのサポートに加えてXGBoost、だけでなく、R、Javaや他の言語をサポートしています。この記事では、インストールして、今XGBoostのバージョン0.90を使用することができます「xgboostインストールピップ」を使用し、XGBoost Pythonライブラリに焦点を当てています。弱い学習者として決定木をサポートに加えて、XGBoostライブラリは、それはまた、線形分類器、決定木、およびDARTドロップアウトしてをサポートしていますが、通常の状況下では、我々は、デフォルトの決定木を使用する弱学習することができ、この記事では、唯一の使用について説明しますデフォルトの決定木弱学習XGBoost。

    インタフェースXGBoost Pythonのスタイルの2種類があります。一つは、実質的に同一の、ほんのわずかに異なるAPIは、主にパラメータ名で、使用し、データセットされている両方のスタイルsklearnを達成するために、自身のネイティブのPython APIインターフェイス、APIインターフェースおよび他のあるXGBoostれます上記の初期化。

2.ライブラリの基本的な使用をXGBoost

    私の完全な例を参照してくださいGithubのコードを

2.1ネイティブのPython APIインタフェースを使用して

    スタイルの2種類のXGBoostライブラリインタフェースは、我々はどのようにネイティブのPython APIインタフェースを見てみましょう。

    その後、最初のネイティブデータセット部、入力機能を押してから出力部、およびDMatrixデータ構造内に配置する必要がありXGBoost、私たちはトレーニングセットXとYを初期化することができます使用して、のDMatrix詳細を気にしません。

インポートのPdとしてパンダ
 インポートのNPとしてnumpyの
 インポートXGBとしてxgboost
 インポートPLTのようmatplotlib.pylab
%のmatplotlibのインライン

から sklearn.model_selectionのインポートGridSearchCV
 から sklearn.model_selectionのインポート train_test_split
sklearn.datasets.samples_generator インポートmake_classificationの
 X-パターン特徴、yは出力サンプルタイプが10,000サンプルの合計、ここで、各サンプル20、出力2つのカテゴリは、冗長性がない特徴がある、各クラスタのカテゴリ 
X、 make_classification = Y(N_SAMPLES = 10000、n_features = 20であり、n_redundant = 0、
                             n_clusters_per_class = 1、n_classes = 2、flip_y = 0.1)
X_train、X_test、y_train、y_test = train_test_split(X、Y、random_state = 1)
dtrain = xgb.DMatrix(X_train、y_train)
DTEST = xgb.DMatrix(X_test、y_test)

    上記のコードは、我々はランダムな初期化バイナリデータを設定し、トレーニング及び検証セットに分割。DMatrixと、あなたがトレーニングや予測を行うことができ、DMatrixを初期化するために、それぞれ、トレーニングおよびバリデーションセットを使用してください。次のように単純な例のコードは次のとおりです。

PARAM = { ' MAX_DEPTH ':5 ' ETA ':0.5、' 冗長':1、' 目標'' バイナリ:ロジスティック' } 
raw_model = xgb.train(PARAM、dtrain、num_boost_round = 20)
sklearn.metrics インポートaccuracy_score 
pred_train_raw = raw_model.predict(dtrain)
  I における範囲(LEN(pred_train_raw))
     場合 pred_train_raw [I]> 0.5 
         [I] pred_train_raw = 1
     それ以外に
        [I] pred_train_raw = 0               
 プリント(accuracy_scoreを(dtrain.get_label()、pred_train_raw))

    トレーニングの精度は、ここに私の出力を設定して0.9664です。パフォーマンス検証セットを見てください:

pred_test_raw = raw_model.predict(DTEST)
 のための I における(LEN(pred_test_raw))範囲:
     もし pred_test_raw [I]> 0.5 
         [I] pred_test_raw = 1
     それ以外に
        [I] pred_test_raw = 0               
 プリント(accuracy_score(dtest.get_labelを() 、pred_test_raw))

    私は、出力の精度は、すでに高い、0.9408に設定されていることを確認するためにここにいます。

     しかし、私のためsklearnスタイルのAPIを使用し、またはネイティブのPython APIインターフェースを好きではない、そこにラッパーsklearnいるので、それsklearnスタイルのインターフェースを使用してみてください。

ネイティブのパラメータを使用して2.2 sklearnスタイルのインターフェイス

    sklearnスタイルのインターフェイスでは、2つのクラスがあります使用することができ、分類されXGBClassifier、他は使用XGBRegressorのリターンです。これらの二つのカテゴリーの使用を使用することで、アルゴリズムの入力パラメータのために他のsklearnスタイルのパラメータ名を使用することで、初のオリジナルで、まだ名前付きパラメータの同じAPIセットを使用し、また、2つの方法があります。ここでは、元のAPIと名前付きパラメータの同じセットを使用する方法を見てみましょう。

    次のように実際には、それらに上記のパラメータparamsネイティブセットのXGBClassifier / ** kwargsからXGBRegressorのパラメータを使用します。

sklearn_model_raw = xgb.XGBClassifier(** PARAM)
sklearn_model_raw.fit(X_train、y_train、early_stopping_rounds = 10、eval_metric = " エラー" 
        eval_set = [(X_test、y_test)])

    PARAM内部には、実際に定義された2.1です。

PARAM = { ' MAX_DEPTH ':5 ' ETA ':0.5、' 冗長':1、' 目標'' バイナリ:ロジスティック' }

    sklearnスタイルのインターフェースを使用しますが、パラメータ定義の元の名前を使用して、まだ少し奇妙に感じるので、私は、一般的に別のスタイルのインターフェイスsklearnスタイルパラメータ名を使用するために使用されます。

sklearnを使用して2.3 sklearnスタイルのインターフェイスのスタイルパラメータ

    sklearnライブラリの使用は違いはありませんように、あなたはまた、グリッドサーチsklearnを使用することができますsklearn形式のインターフェイスを使用して、引数のsklearnスタイルを使用して、私はそうすることを主に、方法をお勧めしてGBDT。

    しかし、そうするために、ネーミングおよびパラメータは少し異なっ2.1と2.2を定義します。私たちの後ろを意味し、特定のパラメータは、我々は、分類、トレーニングや通話の単純なアルゴリズムの初期化プロセスを見て、言います:

sklearn_model_new = xgb.XGBClassifier(MAX_DEPTH = 5、learning_rate = 0.5、冗長= 1、対物= ' バイナリ:ロジスティック'、random_state = 1)

    これは、パラメータXGBClassifierのクラスを定義したパラメータを直接見て、同様のsklearnすることができます。ETAのステップは、我々はここで定義する以前の2つのセクションでは、別の名前learning_rateになる見ることができます。

    初期化後、トレーニングや方法が予測と2.2差はなかったです。

sklearn_model_new.fit(X_train、y_train、early_stopping_rounds = 10、eval_metric = " エラー" 
        eval_set = [(X_test、y_test)])

3. XGBoostライブラリパラメータ

    第二節では、XGBoostライブラリを使用しようとしましたが、パラメータ用のライブラリXGBoostはなく、あまりにも多くの議論。次は、主に、主な議論については、セクション2.3でsklearnスタイルのパラメータで、ここでは詳細に説明します。これらのパラメータの前に、私は話すだろう勾配後押しツリー(GBDT)概要パラメータ調整scikitは、学習パラメータは、の定義に対応しそうであれば、誰もGBDT非常に身近なトーンパラメータ、その後も90%をマスターしXGBoostパラメータ調整。

    図書館XGBoostパラメータは、フレームパラメータ、弱学習およびその他のパラメータを高めています。

3.1 XGBoostフレームワークパラメータ 

    ブースター、n_estimatorsとobjectve:フレームパラメータXGBoostのために、最も重要な3つのパラメータです。

    1)ブースターはデフォルトgbtree、即ちCART決定木を使用してもよい弱い学習者XGBoostのタイプを決定し、弱い学習者gblinearのDARTと同様に線形であってもよいです。一般的に、我々はそれにgbtreeを使用するには、パラメータを調整する必要はありません。

    2)n_estimatorsは、それが私たちの意思決定ツリー内の弱学習器の数を表しているため、それは、私たちのXGBoostモデルの複雑さに関連して、パラメータを調整することが非常に重要です。このパラメータは、n_estimators sklearn GBDTに対応しています。小さすぎるn_estimators、簡単underfitting、あまりにもn_estimators、及びオーバーフィッティングに簡単には、一般的に適度な調整パラメータの値を選択する必要があります。

    3)目的を解決するために私たちの問題は、分類又は回帰、または他の問題、および関数の対応する損失で表しています。具体的な値は、我々は唯一の分類と回帰時に使用される一般的なパラメータを気にし、多くのことを取ることができます。

    squarederror、すなわちMSE平均二乗誤差:REGが、一般的に回帰目的で使用されます。バイナリ分類一般的な使用のバイナリ:一般的な使用のマルチでロジスティック、マルチ分類問題:ソフトマックス。

 3.2 XGBoost弱学習パラメータ   

    ここでは、唯一のデフォルトパラメータの使用は弱学習をgbtree話し合います。以下のように決定木の関連するパラメータの主なパラメータのパラメータを調整するには、次のとおりです。 

    1)MAX_DEPTH:小さな機能がどのような値であることができるときにデータ以下、木構造の深さを制御します。モデル試料の量だけでなく、多くの機能場合、一般的にグリッドサーチ特定パラメータ調整の最大深さ値を制限する必要があります。このパラメータは、MAX_DEPTHのsklearn GBDTに対応しています。

    2)min_child_weight:ツリーノード右量がこの閾値より小さい場合、最小の子ノードの重み閾値は、ツリーノードがリーフノードであることを、サブツリーを分割しないであろう。右ツリーノード、本明細書の再利用は、その二次導関数と、$ H_ {TJ} $内側すなわちXGBoost原理物品の全てのサンプルのノード:$$ H_ {TJ} = \和\ limits_ {X_I \ R_ {でTJ }} H_ {TI} $$

    値がsklearn GBDTで、引数が正確に対応していないがありますが、min_samples_splitは別の角度からの閾値限界を果たし、最適値を見つけるために、グリッドサーチする必要があります。

    3)ガンマ:減少したしきい値によって引き起こさXGBoostスプリットデシジョンツリー損失。我々は、ツリー構造を分割しようとするときには、以下の式、試行の最大数である:$$ \最大の\ FRAC {1} {2} \ FRAC {G_L ^ 2} {H_L + \ラムダ} + \ FRAC {1} {2 } \ FRAC {G_R ^ 2} {H_R + \ラムダ} - \のFRAC {1} {2} \ FRAC {(G_L + G_R)^ 2} {H_L + H_R + \ラムダ} - \ガンマ$$

    このの価値を最大化するには、サブツリーを分割し続けるために、私たちのガンマ以上のものが必要。この値は、最適値を見つけるために、グリッドサーチを必要とされます。

    4)サブサンプル:サブサンプリングパラメータ、これは交換せずにサンプリングし、そのsklearnのGBDTのサブサンプルの役割です。分散の割合がオーバーフィッティング防止するために、すなわち、1未満に低減することができるが、サンプルフィット偏差が大きくなり、値が低すぎることはできません。オーバーフィッティング比較的小さな値の数を見つけるアシスタントグリッド検索を見つけることができれば、初期値は、1であることができます。

    5)colsample_bytree / colsample_bylevel / colsample_bynode:これら三つのパラメータは、サンプルに特徴的であり、デフォルトはサンプリングされない、すなわち、すべての機能を使用して、決定木。colsample_bytreeコントロールサンプル請求ツリー全体、比率、割合及びサンプリング制御機能の層は、ツリーノードをcolsample_bynode前記colsample_bylevel対照試料の比。合計特性など64は、それがcolsample_bytree、colsample_bylevelとcolsample_bynodeが0.5であると仮定され、一個の木のノードがランダムに8サンプリングされるときに、分割部分木を分割しようとします。

    6)reg_alpha / reg_lambda:これは、2 XGBoost正則化パラメータです。reg_alphaがL1正則化係数であり、reg_lambdaは、我々はXGBoost正則損失素子部を議論原理物品におけるL1正則化因子である:$$ \オメガ(h_t)= \ガンマJ + \ FRAC {\ラムダ} {2} \和\ limits_ {J = 1} ^ {Jw_ TJ} ^ 2 $$

    これらのパラメータは、上記のパラメータを調整するために必要とされるが、一般的にMAX_DEPTH、min_child_weightとガンマを強調すること。状況はフィットの下を見つけた、とされていた場合は、後でいくつかのパラメータを調整してみてください。

3.3 XGBoost他のパラメータ

    XGBoost主learning_rate注意が必要な他のパラメータが、あります。

    learning_rate同様の、より小さいlearning_rateの弱識別器の重み減少係数の各々、及びsklearn GBDTのlearning_rate制御は、我々は弱い学習の反復のより数を必要とすることを意味します。通常、我々は反復ステップの最大数を使用し、フィッティングアルゴリズムの効果を決定するために一緒に働きます。したがって、これら2つのパラメータn_estimatorsとlearning_rateはアシスタントと有効であるために。もちろん、また、他のすべての調整パラメータの完了後、n_estimatorsを行って、その後、learning_rateに固定され、そして最後に、learning_rate n_estimatorsを転送します。

    とき正例と負のためのケースの割合がさらに、同時実行スレッド数、scale_pos_weightカテゴリがアンバランス制御アルゴリズムをn_jobs。class_weight同様のでsklearn。あなたはそれぞれの機能の重要度を確認することができますimportance_type。「ゲイン」、「体重」、「カバー」、「total_gain」または「total_cover」を選択することができます。最後の特徴は、昇圧get_scoreメソッド呼び出しの対応する重みによって得ることができます。重要度を算出する機能分割機能数として選択されることにより、「重み」、「ゲイン」と機能をもたらすように計算され、それぞれ「total_gain」は、平均利得特性として選択し、重要度によって計算される総利得を分割することができます。「カバー」と「total_cover」が選択されると、サンプルカバレージの全体的な平均サンプルカバレッジ分割を行うための機能を計算する重要度によって算出されます。

4. XGBoostグリッドサーチパラメータ調整

    XGBoostは、パラメータ調整のグリッド検索とクラスGridSeachCVのsklearnの組み合わせを使用することができ、かつ通常のsklearn分類と回帰アルゴリズムの使用は違いはありません。次のように具体的な処理の例です。

gsCv = GridSearchCV(sklearn_model_new、
                   { ' MAX_DEPTH ':[4,5,6 ]、
                     ' n_estimators ':[5,10,20 ]})
gsCv.fit(X_train、y_train)
印刷(gsCv.best_score_)
 プリント(gsCv.best_params_)

    私の出力はここにあります:

    0.9533333333333334

    { 'MAX_DEPTH':4 'n_estimators':10}

    そして、上記の提起に基づいて検索をしてみてくださいlearning_rate:

sklearn_model_new2 = xgb.XGBClassifier(MAX_DEPTH = 4、n_estimators = 10、冗長= 1、対物= ' バイナリ:ロジスティック'、random_state = 1 
gsCv2 = GridSearchCV(sklearn_model_new2、
                   { ' learning_rate ':[0.3,0.5,0.7 ]})
gsCv2.fit(X_train、y_train)
印刷(gsCv2.best_score_)
 プリント(gsCv2.best_params_)

    私の出力はここにあります:

    0.9516

    { 'learning_rate':0.3}

    もちろん、実際の状況はここで、我々はパラメータ調整が完了しましたと仮定すると、パラメータを調整し続ける必要があり、我々は検証セットを用いた場合の効果を見てみてください:

sklearn_model_new2 = xgb.XGBClassifier(MAX_DEPTH = 4、learning_rate = 0.3、冗長= 1、対物= ' バイナリ:ロジスティック'、n_estimators = 10 
sklearn_model_new2.fit(X_train、y_train、early_stopping_rounds = 10、eval_metric = " エラー" 
        eval_set = [(X_test、y_test)])

    最終的な出力は次のようになります。

    [9] validation_0エラー:0.0588

    つまり、検証セットの精度は94.12パーセントです。

    得られた結果は、セットの精度を確認した場合私たちは、以前のグリッド検索パラメータの調整を決定することができます。繰り返し検索パラメータと検証する必要の場合は実際の処理。

    上記のライブラリの使用XGBoost、かつ実用的な問題を解決するためにXGBoostを使用するように私の友人を助けるために欲望の概要です。

 

(再印刷するようこそ、ソースは歓迎通信:. [email protected]をご記入ください)  

おすすめ

転載: www.cnblogs.com/pinard/p/11114748.html