Виведення лінійної регресії XGBoost невірно


11

Я новачок у XGBoost, тому пробачте про своє незнання. Ось код python:

import pandas as pd
import xgboost as xgb

df = pd.DataFrame({'x':[1,2,3], 'y':[10,20,30]})
X_train = df.drop('y',axis=1)
Y_train = df['y']
T_train_xgb = xgb.DMatrix(X_train, Y_train)

params = {"objective": "reg:linear"}
gbm = xgb.train(dtrain=T_train_xgb,params=params)
Y_pred = gbm.predict(xgb.DMatrix(pd.DataFrame({'x':[4,5]})))
print Y_pred

Вихід:

[ 24.126194  24.126194]

Як бачите, вхідні дані - це просто пряма лінія. Тож результат, який я очікую, є [40,50]. Що я тут роблю неправильно?



2
@ Dawny33 видалено з SO.
simplfuzz

Відповіді:


22

Схоже, що XGBoost використовує дерева регресії як базові учні за замовчуванням. XGBoost (або підвищення рівня градієнта взагалі) працює, поєднуючи кілька цих базових учнів. Дерева регресії не можуть екстраполювати шаблони в навчальних даних, тому будь-який вхід вище 3 або нижче 1 не буде прогнозований правильно у вашому випадку. Ваша модель навчена прогнозувати виходи для входів в інтервалі [1,3], вхід, що перевищує 3, отримає той самий вихід, що і 3, а на вхід менше 1 - такий же вихід, як і 1.

Крім того, дерева регресії насправді не бачать ваші дані як прямі, оскільки вони є непараметричними моделями, а це означає, що вони теоретично можуть відповідати будь-якій фігурі, яка є більш складною, ніж пряма. Приблизно дерево регресії працює, присвоюючи ваші нові вхідні дані деяким точкам даних тренувань, які він бачив під час тренінгу, і отримує результат, заснований на цьому.

Це на відміну від параметричних регресорів (наприклад, лінійної регресії ), які насправді шукають найкращі параметри гіперплана (прямий у вашому випадку) для відповідності вашим даним. Лінійна регресія робить перегляд даних у вигляді прямої лінії з нахилом і перехопленням.

Ви можете змінити базового учня вашої моделі XGBoost на GLM (узагальнену лінійну модель), додавши "booster":"gblinear"до своєї моделі params:

import pandas as pd
import xgboost as xgb

df = pd.DataFrame({'x':[1,2,3], 'y':[10,20,30]})
X_train = df.drop('y',axis=1)
Y_train = df['y']
T_train_xgb = xgb.DMatrix(X_train, Y_train)

params = {"objective": "reg:linear", "booster":"gblinear"}
gbm = xgb.train(dtrain=T_train_xgb,params=params)
Y_pred = gbm.predict(xgb.DMatrix(pd.DataFrame({'x':[4,5]})))
print Y_pred

Загалом, щоб налагодити, чому ваша модель XGBoost поводиться певним чином, перегляньте параметри моделі:

gbm.get_dump()

Якщо ваш базовий учень є лінійною моделлю, вихід get_dump:

['bias:\n4.49469\nweight:\n7.85942\n']

У вашому коді вище, оскільки ви базуєте дерево учнів, вихід буде таким:

['0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=2.85\n\t\t4:leaf=5.85\n\t2:leaf=8.85\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=1.995\n\t\t4:leaf=4.095\n\t2:leaf=6.195\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=1.3965\n\t\t4:leaf=2.8665\n\t2:leaf=4.3365\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.97755\n\t\t4:leaf=2.00655\n\t2:leaf=3.03555\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.684285\n\t\t4:leaf=1.40458\n\t2:leaf=2.12489\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.478999\n\t\t4:leaf=0.983209\n\t2:leaf=1.48742\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.3353\n\t\t4:leaf=0.688247\n\t2:leaf=1.04119\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.23471\n\t\t4:leaf=0.481773\n\t2:leaf=0.728836\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.164297\n\t\t4:leaf=0.337241\n\t2:leaf=0.510185\n',
 '0:[x<2] yes=1,no=2,missing=1\n\t1:leaf=0.115008\n\t2:[x<3] yes=3,no=4,missing=3\n\t\t3:leaf=0.236069\n\t\t4:leaf=0.357129\n']

Порада: я фактично вважаю за краще використовувати класи xgb.XGBRegressor або xgb.XGBClassifier, оскільки вони слідують API навчання sci-kit . Оскільки в науковому комплекті існує стільки реалізацій алгоритму машинного навчання, використання XGB як додаткової бібліотеки не порушує мого робочого процесу лише тоді, коли я використовую інтерфейс sci-kit XGBoost.


Як налаштувати "booster":"gblinear"черезxgb.XGBRegressor
yosemite_k

Чи краще запустити нормалізацію функції при використанні gblinearбустера?
переповнений
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.