#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]
)