линейная регрессия xgboost (gblinear) неправильные прогнозы - PullRequest
1 голос
/ 03 апреля 2019

Я использую библиотеку 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()

enter image description here

Прогнозы отображаются синим цветом, а реальные данные - оранжевым

Я что-то упустил?

1 Ответ

1 голос
/ 07 апреля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...