2024-09-28 21:26:30 发布
网友
问题是,由于列车数据的大小,我的列车数据无法放入RAM。所以我需要一种方法,首先在整个列车数据集上建立一棵树,计算残差建立另一棵树,等等(像梯度增强树那样)。显然,如果我在某个循环中调用model = xgb.train(param, batch_dtrain, 2),这将没有帮助,因为在这种情况下,它只是为每个批重新构建整个模型。
model = xgb.train(param, batch_dtrain, 2)
免责声明:我也是xgboost的新手,但我想我已经弄明白了。
试着在第一批训练后保存你的模型。然后,在连续运行时,为xgb.train方法提供保存的模型的文件路径。
下面是一个小实验,我试着让自己相信它是有效的:
首先,将波士顿数据集分为训练集和测试集。 然后把训练集分成两半。 将模型与上半场匹配,得到一个分数作为基准。 然后用下半部分拟合两个模型;其中一个模型将具有附加参数xgbu 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
现在有了(0.6版?)可能有帮助的进程更新参数。下面是一个实验:
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.2542132108 model 2 25.6967017352 model 1+2 22.8846455135 model 1+update2 14.2816257268
我创建了a gist of jupyter notebook来演示xgboost模型可以增量训练。我用波士顿数据集训练模型。我做了三个实验-一次学习,迭代一次学习,迭代增量学习。在增量训练中,我将波士顿的数据以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 itr@{}: {}'.format(int(start/batch_size), sklearn.metrics.mean_squared_error(y_te, y_pr))) print('MSE itr@{}: {}'.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版本:0.6
免责声明:我也是xgboost的新手,但我想我已经弄明白了。
试着在第一批训练后保存你的模型。然后,在连续运行时,为xgb.train方法提供保存的模型的文件路径。
下面是一个小实验,我试着让自己相信它是有效的:
首先,将波士顿数据集分为训练集和测试集。 然后把训练集分成两半。 将模型与上半场匹配,得到一个分数作为基准。 然后用下半部分拟合两个模型;其中一个模型将具有附加参数xgbu model。如果传入额外的参数没有什么区别,那么我们会期望它们的分数是相似的。。 不过,幸运的是,新机型的性能似乎比第一款要好得多。
如果有什么不清楚的地方请告诉我!
引用:https://github.com/dmlc/xgboost/blob/master/python-package/xgboost/training.py
现在有了(0.6版?)可能有帮助的进程更新参数。下面是一个实验:
输出:
我创建了a gist of jupyter notebook来演示xgboost模型可以增量训练。我用波士顿数据集训练模型。我做了三个实验-一次学习,迭代一次学习,迭代增量学习。在增量训练中,我将波士顿的数据以50号为一批批传递给模型。
要点是,为了使模型收敛到通过一次性(所有数据)学习获得的精度,必须多次迭代数据。
下面是使用xgboost进行迭代增量学习的相应代码。
XGBoost版本:0.6
相关问题 更多 >
编程相关推荐