Я думаю, что проблема в том, что модель не сходится к оптимальной с конфигурацией и количеством данных, которые вы выбрали. 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 для данных обучения (я добавил оценку в функцию подбора, чтобы посмотреть, как она меняется). Это дополнительно уменьшается до ~ 0,1, если вы увеличите количество образцов с 7 до 70.