GBDT の原理については、「勾配リフティングツリーの原理(GBDT)」の記事で紹介されています。この記事では、scikit-learnでのGBDTアルゴリズムクラスライブラリの使用とチューニングについて説明します。
1. scikit-learn GBDTライブラリの概要
scikit-learnでは、GBDTクラスライブラリにGradientBoostingClassifierとGradientBoostingRegressorが含まれています。GradientBoostingClassifierは分類に使用され、GradientBoostingRegressorは回帰に使用されます。それらのパラメーターはまったく同じですが、損失関数損失などの一部のパラメーターには異なるオプションがあります。重要なパラメーターを2つのカテゴリーに分けます。最初のカテゴリーはBoostingフレームワークの重要なパラメーターであり、2番目のカテゴリーは弱学習器CART回帰決定木の重要なパラメーターです。
以下では、これらの2つの側面からこれらのパラメーターの使用と調整を紹介します。
2. GBDTクラスライブラリのブースティングフレームワークパラメーター
最初に、Boostingフレームワークの重要なパラメーターを紹介します。GradientBoostingClassifierとGradientBoostingRegressorのほとんどのパラメーターは同じです。次の表を使用して詳細に説明します。
パラメータ | GradientBoostingClassifier | GradientBoostingRegressor |
n_estimators | 弱学習器の反復の最大数、または弱学習器の最大数。一般的に、n_estimatorsは小さすぎてアンダーフィットが容易ですが、n_estimatorsは大きすぎてオーバーフィットが容易です。通常、適度な値を選択する必要があります。デフォルト値は50です。実際のチューニングプロセスでは、多くの場合、パラメーターlearning_rateと一緒に考慮されます。 | |
learning_rate | 弱学習器の減量係数νは、元の強学習器に正則化項を加えた反復式になります。νの値の範囲は0 <ν≤1です。同じトレーニングセットのフィッティング効果の場合、νが小さいほど、より弱い学習者の反復を実行する必要があることを意味します。ステップサイズと最大反復回数は通常、アルゴリズムのフィッティング効果を決定するために一緒に使用されます。したがって、パラメーターn_estimatorsとlearning_rateは一緒に調整する必要があります。一般に、より小さいνからチューニングを開始でき、デフォルト値は1です。 | |
サブサンプル | 勾配ツリー(GBDT)原理昇圧 ] 0,1(値は、上述のテキスト正則のサブセクションのサンプリング比。このサブサンプリング及びランダムフォレストを交換サンプルでランダムフォレストを使用して、同じではない、そしてここでは置換サンプリングは使用されません。値が1の場合、すべてのサンプルが使用されます。これはサブサンプリングなしと同じです。値が1未満の場合、サンプルの一部のみがGBDT決定ツリーに適合します。1未満の値を選択してください。分散を減らしてオーバーフィッティングを防ぐことができますが、サンプルフィッティングの偏差が増えるため、値が低くなりすぎないようにする必要があります。[0.5、0.8]から選択することをお勧めします。 | |
初期化 | 弱学習に対応する初期化ツリー(GBDT)原則を高める勾配での記事では、あなたがいない場合は、初期化の分類と回帰予測を、その後、トレーニングセットでサンプルセットを行い、それ以外のinitパラメータの初期化を行うに学習者は、分類と回帰を提供予報。通常、データに関する事前の知識がある場合、または以前にフィッティングを行った場合に使用されます。それ以外の場合は、このパラメーターを考慮する必要はありません。 | |
損失 | GradientBoostingClassifierの損失関数には、対数尤度損失関数「deviance」と指数損失関数「exponential」の2つのオプションがあります。デフォルト値は、対数尤度損失関数の「偏差」です。一般に、デフォルトの対数尤度損失関数「deviance」を使用することをお勧めします。これは、バイナリ分類と多変量分類に最適化効果があります。指数損失関数「指数」は、Adaboostアルゴリズムを実行することと同等です。 | GradientBoostingRegressorの損失関数には、平均二乗誤差損失関数「ls」、絶対損失関数「lad」、Huber損失関数「huber」、分位点損失関数「quantile」が含まれます。デフォルトは、平均二乗損失関数「ls」です。一般的に、データにノイズポイントが少ない場合は、デフォルトの平均二乗誤差損失関数「ls」を使用することをお勧めします。ノイズポイントが多い場合は、ノイズ対策のフーバーロス機能「フーバー」のご利用をお勧めします。トレーニングセットでセグメント化予測を実行する必要がある場合は、変位値損失関数「変位値」を使用することをお勧めします。 |
アルファ | GradientBoostingClassifierクラスには、このパラメーターはありません。 | Huber損失関数「huber」と分位点損失関数「quantile」を使用する場合、分位点の値を指定する必要があります。デフォルト値は0.9です。ノイズポイントが多い場合は、このパラメータの値を適切に減らすことができます。 |
3. GBDTクラスライブラリの弱学習器パラメーター
次に、GradientBoostingClassifierとGradientBoostingRegressorの弱学習器パラメーターを紹介します。GBDTはCART回帰決定木を弱学習器として使用するため、そのパラメーターは基本的に決定木クラスから派生します。つまり、DecisionTreeClassifierとDecisionTreeRegressorのパラメーターは基本的に同じです。で上(sklearn)デシジョンツリーアルゴリズムライブラリをscikit学習紙詳細な説明を行うには、これらのパラメータの2つのクラスを持っています。ここでは、注意が必要な最も重要なパラメータのいくつかを強調しています。
1)max_featuresを分割するときに考慮されるフィーチャの最大数:複数のタイプの値を使用できます。デフォルトは「なし」です。つまり、分割するときにすべてのフィーチャ番号が考慮されます。「log2」の場合、最大でlog2N(2 N)機能の対数です。「sqrt」または「auto」の場合、除算時に最大Nの平方根機能が考慮されることを意味します。整数の場合、考慮される機能の絶対数を表します。フィーチャー番号のパーセンテージ、つまり、考慮後のフィーチャー番号(パーセンテージxN)が丸められます。ここで、Nはサンプルの特徴の総数です。一般に、サンプルフィーチャの数が50未満など、それほど多くない場合は、デフォルト値の「なし」で十分です。フィーチャの数が非常に多い場合は、上記の他の値を柔軟に使用して、分割時に考慮されるフィーチャの最大数を制御できます。決定木の生成時間を制御します。
2)デシジョンツリーの最大深度max_depth:デフォルトを入力できません。入力しない場合、デシジョンツリーの深度は制限されません。一般に、データや機能が少ない場合は、この値を無視できます。トレーニングセットのサンプルサイズが大きく、機能が多い場合は、この最大深度を制限することをお勧めします。具体的な値はデータ分布によって異なります。一般的に使用される10〜100の間を取ることができます。
3)内部ノードのサブディビジョンに必要なサンプルの最小数min_samples_split:この値は、サブツリーが分割され続ける条件を制限します。ノードのサンプル数がmin_samples_split未満の場合、再度分割されません。デフォルト値は2です。サンプルサイズが大きくない場合は、この値を制御する必要はありません。サンプルサイズが非常に大きい場合は、この値を増やすことをお勧めします。
4)リーフノードのサンプルの最小数min_samples_leaf:この値は、リーフノードのサンプルの最小数を制限します。リーフノードの数がこの値より少ない場合は、兄弟ノードと一緒にプルーニングされます。デフォルト値は1です。最小サンプル数の整数、またはサンプルの総数に対する割合として最小サンプル数を入力できます。サンプルサイズが大きくない場合は、この値を制御する必要はありません。サンプルサイズが非常に大きい場合は、この値を増やすことをお勧めします。
5)リーフノードの最小サンプルウェイトとmin_weight_fraction_leaf:この値は、リーフノードのすべてのサンプルウェイトの合計の最小値を制限します。この値よりも小さい場合、兄弟ノードと一緒にプルーニングされます。デフォルト値は0で、サンプルの重みは考慮されません。一般的に言って、より多くのサンプルが欠損値を持っている場合、または分類木のサンプルの分布カテゴリが非常に偏っている場合、サンプルの重みが導入されるため、このパラメーターを考慮する必要があります。
6)葉ノードの最大数max_leaf_nodes:葉ノードの最大数を制限することで、過剰適合を防ぐことができますデフォルト値は「なし」、つまり、葉ノードの最大数は制限されていません。制限を増やすと、アルゴリズムはリーフノードの最大数内で最適な決定木を作成します。特徴が多くない場合はこの値は無視できますが、特徴が多い場合は制限する必要があります。特定の値は交差検証によって取得できます。
7)ノード分割の最小不純物min_impurity_split:この値は、決定木の成長を制限します。ノードの不純度(ジニ係数、平均二乗偏差)がこのしきい値よりも小さい場合、ノードは子ノードを生成しなくなります。葉ノードになります。通常、デフォルト値の1e-7を変更することはお勧めしません。
4. Mnistデータセットを使用してscikit-learnのGradientBoostingClassifierをテストする
コードは次のとおりです。
-------------------------------------------------- -------------------------------------------------
sklearn.ensembleからGradientBoostingClassifierをインポート
sklearn.model_selectionからGridSearchCVをインポート
sklearn.metricsからインポートprecision_score
インポート時から
npとしてnumpyをインポートする
インポートミニスト
rocをインポートする
__name__ == "__main__"の場合:
#Mnistデータセットを読み取り、GBDTの分類モデルをテストする
mnistSet = mnist.loadLecunMnistSet()
train_X、train_Y、test_X、test_Y = mnistSet [0]、mnistSet [1]、mnistSet [2]、mnistSet [3]
m、n = np.shape(train_X)
idx = range(m)
np.random.shuffle(idx)
print "\ n ********** GradientBoostingClassifierクラス**********をテストします"
t = time()
モデル= GradientBoostingClassifier(max_features = 90、max_depth = 40、min_samples_split = 8、min_samples_leaf = 3、
n_estimators = 1200、learning_rate = 0.05、subsample = 0.95)
#トレーニングデータセットの適合
model.fit(train_X、train_Y)
#予測トレーニングセット
train_Y_hat = model.predict(train_X [idx])
「トレーニングセットの精度:」、正確性スコア(train_Y [idx]、train_Y_hat)を出力します
#予測テストセット
test_Y_hat = model.predict(test_X)
「テストセットの精度:」、正確性スコア(test_Y、test_Y_hat)を出力します。
「合計経過時間:」、時間()-t、「秒」を出力します
#ROC曲線を描く
n_class = len(np.unique(train_Y))
roc.drawROC(n_class、test_Y、test_Y_hat)
-------------------------------------------------- -------------------------------------------------
5. CCPPデータセットを使用してscikit-learnのGradientBoostingRegressorをテストします
コードは次のとおりです。
-------------------------------------------------- -------------------------------------------------
sklearn.ensembleからインポートGradientBoostingRegressor
sklearn.model_selectionからインポートGridSearchCV、train_test_split
sklearn.preprocessingからインポートStandardScaler
sklearn.metricsからインポートmean_squared_error
インポート時から
npとしてnumpyをインポートする
パンダをpdとしてインポート
__name__ == "__main__"の場合:
#CCPPデータセットを読み取り、GBDT回帰モデルをテストする
data = pd.read_excel( "data / CCPP / Folds5x2_pp.xlsx")
#AT:温度、V:圧力、AP:湿度、RH:圧力、PE:出力電力
#サンプル機能X
X = data [['AT'、 'V'、 'AP'、 'RH']]
#データの正規化
X = StandardScaler()。fit_transform(X)
#出力例Y
Y =日付[['PE']]
#トレーニングセットとテストセットを分割し、データセットの70%をトレーニングセットに、30%をテストセットに
train_X、test_X、train_Y、test_Y = train_test_split(X、Y、test_size = 0.3、random_state = 1)
m、n = np.shape(train_X)
idx = range(m)
np.random.shuffle(idx)
印刷 "\ n ********** GradientBoostingRegressorクラス**********をテストします"
t = time()
モデル= GradientBoostingRegressor(learning_rate = 0.1、n_estimators = 1500、max_depth = 5、min_samples_split = 9、
min_samples_leaf = 2、subsample = 0.95)
#トレーニングデータセットの適合
model.fit(train_X、train_Y.values.ravel())
#予測テストセット
test_Y_pred = model.predict(test_X)
print "测试集MSE:"、mean_squared_error(test_Y、test_Y_pred)
print "测试集RMSE:"、np.sqrt(mean_squared_error(test_Y、test_Y_pred))
「合計経過時間:」、時間()-t、「秒」を出力します
-------------------------------------------------- -------------------------------------------------
リファレンス:http://www.cnblogs.com/pinard/p/6143927.html