Search on the blog

2015年7月21日火曜日

scikit-learn(5) Gradient Boosting

 以前から気になっていたGradient Boostingについて勉強した。

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は有名なデータサイエンス系のコンペティションで頻繁に用いられている

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_

0 件のコメント:

コメントを投稿