アンサンブル学習について
Kaggle ensembling guide
https://mlwave.com/kaggle-ensembling-guide/
https://github.com/MLWave/Kaggle-Ensemble-Guide
交差検証
上記のように、2つ目のモデルの学習データに、1つ目のベースモデルの予測が使用される。
しかし、全ての学習・テストデータを一度に使ってしまうと、
テストデータを見たモデルを利用するので、次のモデルでオーバーフィットするリスクがある。
そのため、交差検証を行う。
交差検証の流れ
- データを $k$ 個のブロックに分割する。
- $i$ 番目のブロックをテストデータ、それ以外の$k - 1$個をトレーニングデータとして学習を行う。
- 得られた $k$ 個の精度の平均値をモデルの評価値とする。
実装
from sklearn.model_selection import KFold
from sklearn.model_selection import StratifiedKFold
# 単純な交差検証の方法
kfold = KFold(n_splits=3)
print('Cross-validation scores: \n{}'.format(cross_val_score(model, X_test,y_test, cv=kfold)))
# 層化交差検証の方法
stratifiedkfold = StratifiedKFold(n_splits=3)
print('Cross-validation scores: \n{}'.format(cross_val_score(model, X_test,y_test, cv=stratifiedkfold)))
用いる学習器を用いて、1度目の学習をする。
from sklearn.ensemble import RandomForestClassifier, ExtraTreesClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.naive_bayes import GaussianNB
from xgboost import XGBClassifier
from sklearn.neighbors import KNeighborsClassifier
clfs = [RandomForestClassifier(),
ExtraTreesClassifier(),
GradientBoostingClassifier(),
KNeighborsClassifier(),
GaussianNB(),
XGBClassifier()
]
clfsに学習器を配列として入れています。
作った学習器の配列を使って学習させていく。
from heamy.estimator import Regressor
from heamy.pipeline import ModelsPipeline
pipeline = ModelsPipeline(*clfs)
stack_ds = pipeline.stack(k=10, seed=seed)
stack_dsに入っているのは、2回目のメタモデルで用いるデータセット。
メタモデルを作成する
stacker = Regressor(dataset=stack_ds, estimator=LinearRegression)
results = stacker.predict()
バリデーション
results = stacker.validate(k=10,scorer=mean_absolute_error)