我正在使用python xgboost库,我无法使用gblinear booster获得一个简单的工作示例:
M = np.array([
[1, 2],
[2, 4],
[3, 6],
[4, 8],
[5, 10],
[6, 12],
])
xg_reg = xgb.XGBRegressor(objective ='reg:linear', booster='gblinear')
X, y = M[:, :-1], M[:, -1]
xg_reg.fit(X,y)
plt.scatter(range(-5, 20), [xg_reg.predict([i]) for i in range(-5, 20)])
plt.scatter(M[:,0], M[:,-1])
plt.show()
预测为蓝色,实际数据为橙色
我错过了什么吗?
我认为问题是模型没有收敛到配置和您选择的数据量的最佳值。 GBM不使用增强模型直接拟合目标,而是拟合梯度,然后将预测的一部分(分数等于学习速率)添加到前一步骤的预测中。
因此,明显的改进方法是:提高学习率,增加迭代次数,增加数据量。
例如,您的代码变体已经提供了更好的预测:
X = np.expand_dims(range(1,7), axis=1)
y = 2*X
# note increased learning rate!
xg_reg = xgb.XGBRegressor(objective ='reg:linear', booster='gblinear', learning_rate=1)
xg_reg.fit(X, y, verbose=20, eval_set=[(X,y)])
plt.scatter(range(-5, 20), [xg_reg.predict([i]) for i in range(-5, 20)], label='prediction')
plt.scatter(X[:20,:], y[:20], label='target')
plt.legend()
plt.show()
这导致训练数据的度量值为0.872(我在拟合函数中添加了评估,以了解它是如何变化的)。如果将样本数从7增加到70,则进一步减少到~0.1。