Я новичок в 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]
. Что я здесь не так делаю?
python
linear-regression
xgboost
simplfuzz
источник
источник
Ответы:
Похоже, что XGBoost использует деревья регрессии в качестве базовых учащихся по умолчанию. XGBoost (или Gradient Boosting в целом) работают путем объединения нескольких из этих базовых учеников. Деревья регрессии не могут экстраполировать шаблоны в обучающих данных, поэтому любой ввод выше 3 или ниже 1 не будет правильно предсказан в вашем случае. Ваша модель обучена прогнозированию выходов для входных данных в интервале
[1,3]
, вход больше 3 будет иметь тот же выход, что и 3, а вход меньше 1 будет иметь тот же выход, что и 1.Кроме того, деревья регрессии на самом деле не видят ваши данные в виде прямой линии, поскольку они являются непараметрическими моделями, что означает, что они могут теоретически соответствовать любой фигуре, которая является более сложной, чем прямая линия. Грубо говоря, дерево регрессии работает, присваивая ваши новые входные данные некоторым точкам обучающих данных, которые оно наблюдало во время обучения, и формирует выходные данные на основе этого.
Это в отличие от параметрических регрессоров (таких как линейная регрессия ), которые на самом деле ищут лучшие параметры гиперплоскости (прямой в вашем случае), чтобы соответствовать вашим данным. Линейная регрессия действительно видит ваши данные как прямую линию с наклоном и пересечением.
Вы можете изменить базового ученика вашей модели XGBoost на GLM (обобщенную линейную модель), добавив
"booster":"gblinear"
к своей моделиparams
:В общем, чтобы выяснить, почему ваша модель XGBoost ведет себя определенным образом, посмотрите параметры модели:
Если ваш базовый ученик - линейная модель, вывод get_dump:
В приведенном выше коде, поскольку у вас есть древовидные базы учеников, результат будет:
Совет: я на самом деле предпочитаю использовать классы xgb.XGBRegressor или xgb.XGBClassifier, так как они следуют API обучения sci-kit . А поскольку sci-kit learn имеет так много реализаций алгоритма машинного обучения, использование XGB в качестве дополнительной библиотеки не мешает моему рабочему процессу, только когда я использую интерфейс sci-kit XGBoost.
источник
"booster":"gblinear"
помощьюxgb.XGBRegressor
gblinear
бустера?