Kaggleのトップランカーたちを見ていると、SVM、Random Forest、Neural Network、Gradient Boostingの4つをstackingして使っていることが多い。SVMとRFは使えるので、そろそろGradient Boostingも使えるようになっておきたところ。
Gradient Boostingの基本
いいビデオがあった。これを見ると基本的なアイディアはつかめる。
Copyright Information
Prof. Alexander Ihler, Ensembles (3): Gradient Boosting
License: Standard YouTube License
Boostingとは?
・アンサンブル学習の一種
・弱学習器を直列に繋ぐ
・各段の学習器は前段でエラーとなったサンプルに重点を置く
Gradient Boostingとは?
・Boostingモデルの一つ
・以下の手続きを繰り返す
1. 弱学習器を学習
2. 残差(観測値と予測値の差)を測定
3. 残差にフィットするように次の弱学習器を学習
なぜGradient Boostingと呼ばれるか?
残差を使って学習器の予測値を逐次的に更新する
⇒Gradient DescentでMSEを最小化することと等価
※MSEの勾配 ~ 残差
Gradient Boostingの実用的な話
scikit-learnのdeveloperの人のビデオに他のモデルとの比較やパラメータチューニングの話があった。
Copyright Information
Peter Prettenhofer, Gradient Boosted Regression Trees in scikit-learn
License: Standard YouTube License
・Gradient Boostingは有名なデータサイエンス系のコンペティションで頻繁に用いられている
Gradient Boostingの利点
・不均一なデータを扱える(特徴量のスケールが違ってもOK)
・いろいろな損失関数をサポート
・特徴量の非線形な相互作用を自動検出
scikit-learnで使用する際のパラメータチューニング
・n_estimators(boostingのステージ数)=3000で他のハイパーパラメータをgride searchでチューニング
・n_estimatorsを大きくし、learning_rate(学習率;弱学習器を結合するときの係数)をチューニング
サンプルコード
scikit-learnでボストンの家の価格を推定するサンプルコードを書いてみた。パラメータチューニングはPeter氏が推奨している方法でおこなった。
from sklearn.ensemble import GradientBoostingRegressor from sklearn.grid_search import GridSearchCV from sklearn.datasets import load_boston data = load_boston() x = data['data'] y = data['target'] # tune hyper parameters first model = GradientBoostingRegressor(n_estimators=3000) parameters = {'learning_rate' : [0.1, 0.05, 0.02, 0.01], 'max_depth': [4, 6], 'min_samples_leaf': [3, 5, 9, 17], 'max_features': [1.0, 0.3, 0.1]} gscv = GridSearchCV(model, parameters, verbose=10, n_jobs=-1, cv=4) gscv.fit(x, y) print "best score=", gscv.best_score_ # tune learning rate with higher n_estimators model = gscv.best_estimator_ model.set_params(n_estimators=100000) parameters = {'learning_rate' : [0.1, 0.05, 0.02, 0.01]} gscv = GridSearchCV(model, parameters, verbose=10, n_jobs=-1, cv=4) gscv.fit(x, y) print "best score=", gscv.best_score_