列車のデータサイズのために列車のデータをRAMに格納できないという問題があります。だから私は最初に列車のデータセット全体に1つのツリーを構築し、残差を計算して別のツリーを構築する方法(勾配ブーストツリーのように)が必要です。明らかに私がmodel = xgb.train(param, batch_dtrain, 2)
をいくつかのループで呼び出すと、それは役に立ちません。そのような場合は、各バッチのモデル全体が再構築されるだけなのでです。xgboostのインクリメンタルトレーニングを実装するにはどうすればよいですか?
答えて
免責事項:私はxgboostも新しいですが、私はこれを理解したと思います。
最初のバッチでトレーニングした後、モデルを保存してみてください。次に、連続して実行するときに、保存されたモデルのファイルパスをxgb.trainメソッドに渡します。
は、ここで私はそれが動作することを自分自身を納得させるために走った小さな実験です:
まず、トレーニングとテストセットにボストンデータセットを分割します。 次に、トレーニングセットを半分に分割します。 前半のモデルをフィットさせ、ベンチマークとして機能するスコアを取得します。 その後、後半に2つのモデルをフィットさせます。 1つのモデルに追加パラメータxgb_modelが追加されます。余分なパラメータを渡しても差が出ない場合は、スコアが似ていると予想されます。 しかし、幸いにも、新しいモデルは最初のモデルよりもはるかに優れているようです。
import xgboost as xgb
from sklearn.cross_validation import train_test_split as ttsplit
from sklearn.datasets import load_boston
from sklearn.metrics import mean_squared_error as mse
X = load_boston()['data']
y = load_boston()['target']
# split data into training and testing sets
# then split training set in half
X_train, X_test, y_train, y_test = ttsplit(X, y, test_size=0.1, random_state=0)
X_train_1, X_train_2, y_train_1, y_train_2 = ttsplit(X_train,
y_train,
test_size=0.5,
random_state=0)
xg_train_1 = xgb.DMatrix(X_train_1, label=y_train_1)
xg_train_2 = xgb.DMatrix(X_train_2, label=y_train_2)
xg_test = xgb.DMatrix(X_test, label=y_test)
params = {'objective': 'reg:linear', 'verbose': False}
model_1 = xgb.train(params, xg_train_1, 30)
model_1.save_model('model_1.model')
# ================= train two versions of the model =====================#
model_2_v1 = xgb.train(params, xg_train_2, 30)
model_2_v2 = xgb.train(params, xg_train_2, 30, xgb_model='model_1.model')
print(mse(model_1.predict(xg_test), y_test)) # benchmark
print(mse(model_2_v1.predict(xg_test), y_test)) # "before"
print(mse(model_2_v2.predict(xg_test), y_test)) # "after"
# 23.0475232194
# 39.6776876084
# 27.2053239482
不明な点がある場合は教えてください。
参照:https://github.com/dmlc/xgboost/blob/master/python-package/xgboost/training.py
model_2_v2は、両方のデータセットを一度に使用したモデルよりも悪化します。しかしmodel_2_v2はmodel_1よりも悪いですが、model_1が見えなかった新しいデータセットを与えるので、かなり奇妙ですが、最後のmodel_2_v2では悪化しました...増強されたツリーは増分学習を実行する最良の方法ではないようです。 @pikachau 'experiment.model'の代わりにmodel_1を使用しようとしましたか? –
データセットがかなり小さい(サンプルサイズ= 150)ためかもしれません。より大きなデータセットでは、model_2_v2はmodel_1よりも優れているはずです。ああ、実験。model == model_1;私はそれをもっと明示する必要がありました! – Alain
今(?バージョン0.6)に役立つかもしれないprocess_updateパラメータがあります。ここでの実験だ:
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import ShuffleSplit
from sklearn.datasets import load_boston
from sklearn.metrics import mean_squared_error as mse
boston = load_boston()
features = boston.feature_names
X = boston.data
y = boston.target
X=pd.DataFrame(X,columns=features)
y = pd.Series(y,index=X.index)
# split data into training and testing sets
rs = ShuffleSplit(test_size=0.3, n_splits=1, random_state=0)
for train_idx,test_idx in rs.split(X): # this looks silly
pass
train_split = round(len(train_idx)/2)
train1_idx = train_idx[:train_split]
train2_idx = train_idx[train_split:]
X_train = X.loc[train_idx]
X_train_1 = X.loc[train1_idx]
X_train_2 = X.loc[train2_idx]
X_test = X.loc[test_idx]
y_train = y.loc[train_idx]
y_train_1 = y.loc[train1_idx]
y_train_2 = y.loc[train2_idx]
y_test = y.loc[test_idx]
xg_train_0 = xgb.DMatrix(X_train, label=y_train)
xg_train_1 = xgb.DMatrix(X_train_1, label=y_train_1)
xg_train_2 = xgb.DMatrix(X_train_2, label=y_train_2)
xg_test = xgb.DMatrix(X_test, label=y_test)
params = {'objective': 'reg:linear', 'verbose': False}
model_0 = xgb.train(params, xg_train_0, 30)
model_1 = xgb.train(params, xg_train_1, 30)
model_1.save_model('model_1.model')
model_2_v1 = xgb.train(params, xg_train_2, 30)
model_2_v2 = xgb.train(params, xg_train_2, 30, xgb_model=model_1)
params.update({'process_type': 'update',
'updater' : 'refresh',
'refresh_leaf': True})
model_2_v2_update = xgb.train(params, xg_train_2, 30, xgb_model=model_1)
print('full train\t',mse(model_0.predict(xg_test), y_test)) # benchmark
print('model 1 \t',mse(model_1.predict(xg_test), y_test))
print('model 2 \t',mse(model_2_v1.predict(xg_test), y_test)) # "before"
print('model 1+2\t',mse(model_2_v2.predict(xg_test), y_test)) # "after"
print('model 1+update2\t',mse(model_2_v2_update.predict(xg_test), y_test)) # "after"
出力:
full train 17.8364309709
model 1 24.8
model 2 25.6967017352
model 1+2 22.8846455135
model 1+update2 14.2816257268
どちらが最終的なモデルですか、私は使うべきモデルですか? – tumbleweed
最低のMSEを持つモデルが必要です。しかし、1 + update2がフル・トレインよりどのように低いかに注意してください!それがなぜそのようになるべきか私には明らかではないので、私はこの結果が疑わしくなり、より多くのフォールドでCVを実行するでしょう。 – paulperry
私はxgboostモデルはインクリメンタルに訓練することができることを実証するためにa gist of jupyter notebookを作成しました。モデルをトレーニングするためにボストンのデータセットを使用しました。私は3回の実験を行いました - ワンショット学習、反復ワンショット学習、反復的増分学習。インクリメンタルトレーニングでは、サイズ50のバッチでモデルにボストンデータを渡しました。
要点の要点は、データを複数回繰り返してモデルが精度を収束させる必要があることですワンショット(全データ)学習。
ここでは、xgboostを使用して反復的なインクリメンタル学習を行うコードを示します。
batch_size = 50
iterations = 25
model = None
for i in range(iterations):
for start in range(0, len(x_tr), batch_size):
model = xgb.train({
'learning_rate': 0.007,
'update':'refresh',
'process_type': 'update',
'refresh_leaf': True,
#'reg_lambda': 3, # L2
'reg_alpha': 3, # L1
'silent': False,
}, dtrain=xgb.DMatrix(x_tr[start:start+batch_size], y_tr[start:start+batch_size]), xgb_model=model)
y_pr = model.predict(xgb.DMatrix(x_te))
#print(' MSE [email protected]{}: {}'.format(int(start/batch_size), sklearn.metrics.mean_squared_error(y_te, y_pr)))
print('MSE [email protected]{}: {}'.format(i, sklearn.metrics.mean_squared_error(y_te, y_pr)))
y_pr = model.predict(xgb.DMatrix(x_te))
print('MSE at the end: {}'.format(sklearn.metrics.mean_squared_error(y_te, y_pr)))
XGBoostバージョン: `xgboost`レポから0.6
- 1. Facebookのログインボタンを実装するにはどうすればよいですか?
- 2. javax.naming.Referenceableの実装をユニットテストするにはどうすればよいですか?
- 3. GUIのリセットボタンを実装するにはどうすればよいですか?
- 4. SpinnerのMatrixCursorを実装するにはどうすればよいですか?
- 5. ポイントアンドクリックのユーザーインタラクションモデルを実装するにはどうすればよいですか?
- 6. Pythonでxgboostのグリッド検索を実行するにはどうすればよいですか?
- 7. スイングでフェードボタンエフェクトを実装するにはどうすればよいですか?
- 8. Xamarinでドキュメントプロバイダエクステンションを実装するにはどうすればよいですか?
- 9. Jadeでoninputを実装するにはどうすればよいですか?
- 10. Require.jsでTinyMCEを実装するにはどうすればよいですか?
- 11. iPhoneでセッションタイムアウトを実装するにはどうすればよいですか?
- 12. nativescriptでビデオコールを実装するにはどうすればよいですか?
- 13. ES6でAngularJSを実装するにはどうすればよいですか?
- 14. JavaScriptでpostMessage()を実装するにはどうすればよいですか?
- 15. PHPでコールバックを実装するにはどうすればよいですか?
- 16. C#でスレッドアフィニティを実装するにはどうすればよいですか?
- 17. レールでアクセスログを実装するにはどうすればよいですか?
- 18. FlashでRichTextEditorを実装するにはどうすればよいですか?
- 19. ライブラリプロジェクトでアプリケーションインデックスを実装するにはどうすればよいですか?
- 20. Androidでウェブフックを実装するにはどうすればよいですか?
- 21. Reactでトランジションアニメーションを実装するにはどうすればよいですか?
- 22. イオンアプリでダイナミックテーマを実装するにはどうすればよいですか?
- 23. ページスクロールでアニメーションを実装するにはどうすればよいですか?
- 24. jQueryでオプションを実装するにはどうすればよいですか?
- 25. ShapelessでToTraversableを実装するにはどうすればよいですか?
- 26. アンドロイドスタジオでコードを実装するにはどうすればよいですか?
- 27. IronPythonでインターフェイスを実装するにはどうすればよいですか?
- 28. neo4jでリビジョンを実装するにはどうすればよいですか?
- 29. iPadにカスタムグリッドを実装するにはどうすればよいですか?
- 30. PagingAndSortingRepositoryにPostFilterを実装するにはどうすればよいですか?
例:私はあることを理解するであろうhttps://github.com/dmlc/xgboost/blob/master/tests/python/test_training_continuation.py –