Почему xgboost выдает одинаковые прогнозы и значения nan для объектов при использовании всего набора данных? - PullRequest
2 голосов
/ 12 мая 2019

Сводка

Я использую Python v3.7 и xgboost v0.81.У меня есть непрерывные данные (y) на уровне штата США по каждой неделе с 2015 по 2019 год. Я пытаюсь регрессировать к следующим функциям: y, год, месяц, неделя, регион (закодировано).Я установил поезд на август 2018 года и раньше, а тест - на сентябрь 2018 года и далее.Когда я тренирую модель таким образом, происходят две странные вещи:

  • feature_importances все равно nan
  • предсказания одинаковы (0,5, 0,5 ....)

То, что я пробовал

Фиксация любых функций в одной переменной позволяет модели обучаться соответствующим образом, и две странные проблемы, с которыми мы столкнулись ранее, исчезли.Ex.год == 2017 или регион == 28

код

(я знаю, что это временная проблема, но проблема возникает и в этом общем случае)

X = df[['year', 'month', 'week', 'region_encoded']]
display(X)
y = df.target
display(y)
X_train, X_test, y_train, y_test = train_test_split(X.values, y.values, test_size=0.1)

model = XGBRegressor(n_jobs=-1, n_estimators=1000).fit(X_train, y_train)

display(model.predict(X_test)[:20])

display(model.feature_importances_)

Результаты- некоторые прогнозы и значения функций

year    month   week    region_encoded
0   2015    10  40  0
1   2015    10  40  1
2   2015    10  40  2
3   2015    10  40  3
4   2015    10  40  4

0    272.0
1     10.0
2    290.0
3     46.0
4    558.0
Name: target, dtype: float64

array([0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], dtype=float32)

array([nan, nan, nan, nan], dtype=float32)

1 Ответ

1 голос
/ 12 мая 2019

Если целевая переменная содержит NaN, хотя бы один, этого достаточно для многих алгоритмов машинного обучения. Обычно это происходит потому, что, когда необработанное NaN присутствует в целевой переменной на этапе обновления многих алгоритмов ML, например, для вычисления производных, NaN распространяется. Хотя я не могу сказать слишком много о том, какой шаг в XGBoost делает это.

Например, аналитическое решение для линейной регрессии.

import numpy as np
import numpy.linalg as la
from scipy import stats

y = np.array([0, 1, 2, 3, np.nan, 5, 6, 7, 8, 9])
x = stats.norm().rvs((len(y), 3))

# Main effects estimate
m_hat = la.inv(x.T @ x) @ x.T @ y
>>> [nan nan nan]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...