XGBoost feature_names несоответствие временных рядов

#python #time-series #xgboost #stock

Вопрос:

Я пытаюсь предсказать тенденцию акций, где 1-увеличение акций, а 0-уменьшение акций в этот конкретный день. Мои входные функции-это цена закрытия, объем, тренд текущего дня, а мои выходные данные-тренд на следующий день. При применении XGBClassifier() Я сталкиваюсь с ошибкой:

 ValueError                                Traceback (most recent call last)
<ipython-input-101-d14cdb520e55> in <module>
      1 val = np.array(test[0, 0]).reshape(1, -1)
      2 
----> 3 pred = model.predict(val)
      4 print(pred[0])

~/opt/anaconda3/lib/python3.8/site-packages/xgboost/sklearn.py in predict(self, data, output_margin, ntree_limit, validate_features, base_margin)
    968         if ntree_limit is None:
    969             ntree_limit = getattr(self, "best_ntree_limit", 0)
--> 970         class_probs = self.get_booster().predict(
    971             test_dmatrix,
    972             output_margin=output_margin,

~/opt/anaconda3/lib/python3.8/site-packages/xgboost/core.py in predict(self, data, output_margin, ntree_limit, pred_leaf, pred_contribs, approx_contribs, pred_interactions, validate_features, training)
   1483 
   1484         if validate_features:
-> 1485             self._validate_features(data)
   1486 
   1487         length = c_bst_ulong()

~/opt/anaconda3/lib/python3.8/site-packages/xgboost/core.py in _validate_features(self, data)
   2058                             ', '.join(str(s) for s in my_missing))
   2059 
-> 2060                 raise ValueError(msg.format(self.feature_names,
   2061                                             data.feature_names))
   2062 

ValueError: feature_names mismatch: ['f0', 'f1', 'f2', 'f3'] ['f0']
expected f2, f1, f3 in input data
 

Мой код выглядит следующим образом:

 def xgb_predict(train, val):
    train = np.array(train)
    x, y = train[:, :-1], train[:, -1] 
    model = XGBClassifier()
    model.fit(x, y)
    
    val = np.array(val).reshape(1, -1)
    pred = model.predict(val)
    return pred[0]

xgb_predict(train, test[0, 0])
 

Я получаю сообщение об ошибке на 8-й строке. Большое вам спасибо за помощь:)

Изменить: Включен образец данных

Комментарии:

1. Добро пожаловать в SO! Просто из того, что вы опубликовали, я бы сказал, что вам нужно выбрать больше столбцов из ваших тестовых данных. Чтобы убедиться, что это так, не могли бы вы отредактировать свой вопрос, чтобы добавить образец ваших данных? Мое предположение состояло бы в том, чтобы изменить последнюю строку на xgb_predict(train, test[0, :])

2. Привет, спасибо за радушный прием! Я изменил свою последнюю строку, как вы сказали, но теперь ошибка гласит: «В данных обучения не было следующих полей: f3». Спасибо вам за помощь

3. Имеет смысл, так как последняя колонка является целевой. Я опубликовал ответ. Проверьте это, пожалуйста.

Ответ №1:

Выбор столбца для ваших тестовых данных должен быть выполнен так же, как и для данных о поездах. Это означает, что ваша последняя строка должна быть:

 xgb_predict(train, test[0, :-1])
 

таким образом, вы можете выбрать все столбцы/функции, кроме последнего, который является целевым значением.

Комментарии:

1. Большое вам спасибо, что это сработало! Не могли бы вы уточнить, почему это должно быть [:-1] вместо [0], пожалуйста? Это потому, что в моем оригинале я выбирал только 1 столбец, в то время как мне нужно было выбрать 4, чтобы соответствовать моим тренировочным данным?

2. Обратите внимание, что вы разделили свои данные обучения на x и y . x Содержит независимые переменные, ваши функции. Они y содержат целевое значение, основную истину. На этапе обучения вы используете и то, и другое, чтобы модель могла изучить закономерности в ваших данных. На этапе тестирования мы используем только функции (все столбцы, кроме последнего, из ваших исходных данных, например x , из обучающих данных) для модели, чтобы сделать прогноз. Целевое значение ваших тестовых данных используется только для проверки того, насколько хорошо работает ваша модель.

3. Извините, я все еще не понимаю, как узнать, как сопоставлять имена функций. например, Как бы я узнал, что в следующий раз нужно поставить [:-1] вместо [0]?

4. Вам не нужно знать имена функций. Эти имена функций создаются самим xgboost. Для тестирования вам просто нужно выбрать те же функции, которые вы использовали в обучении. Другими словами, тот же срез, который вы делаете во втором измерении во время обучения ( :-1 часть в train[:, :-1] ), должен быть выполнен при тестировании ( test[0, :-1] )