XGBoost滚动验证(Walk Forward Validation)出现feature_names mismatch错误及分类任务指标选择咨询
股票趋势预测滚动验证问题解答
一、先解决特征不匹配的错误
你遇到的ValueError: feature_names mismatch是数据输入维度错误导致的,核心问题是传入模型的特征数量和训练时不匹配:
- 你的输入特征有3个:收盘价、成交量、当日趋势,所以模型训练时期望输入是3维特征(对应
['f0','f1','f2']) - 但你在代码里写了
pred = xgb_predict(history, test_x[0]),这里的test_x[0]只取了test_x的第一个特征,把3维特征硬生生砍成了1维,模型自然会抛出特征不匹配的错误
修复方法:
把test_x[0]改成完整的test_x,确保传入模型的是全部3个特征:
pred = xgb_predict(history, test_x)
另外检查你的xgb_predict函数,里面已经用了val = np.array(val).reshape(1, -1),这个处理是对的,修改参数后会自动把输入转换成(1,3)的形状,完全符合模型的要求。
二、评估指标的选择:必须用准确率而非RMSE
你的任务是二分类任务(预测次日股票涨跌,0/1是分类标签),RMSE(均方根误差)是专门用于回归任务(比如预测具体股价这类连续数值)的指标,完全不适合你的分类场景。
推荐的分类评估指标:
- 准确率(Accuracy):最直观的指标,计算正确预测的样本数占总样本数的比例,适合涨跌样本分布比较均衡的情况
- 精确率/召回率:如果涨跌天数差异很大(比如上涨天数远多于下跌),准确率会有误导性,这时候用精确率(预测上涨的样本中实际上涨的比例)和召回率(实际上涨的样本中被正确预测的比例)更合适
- F1分数:精确率和召回率的调和平均,能综合反映模型的分类表现
准确率的代码实现:
首先你需要修正predictions的存储逻辑(你现在存的是test[i],这是测试集的原始数据,不是预测结果),然后用sklearn的accuracy_score计算:
from sklearn.metrics import accuracy_score def validate(data, perc): predictions = [] train, test = train_test_split(data, perc) history = [x for x in train] for i in range(len(test)): test_x, test_y = test[i, :-1], test[i, -1] pred = xgb_predict(history, test_x) # 修正这里的参数 predictions.append(pred) # 存储预测结果,不是test[i] # 计算准确率 accuracy = accuracy_score(test[:, -1], predictions) return accuracy, test[:, -1], predictions # 调用并打印结果 accuracy, y, pred = validate(data, 0.2) print(accuracy)
另外注意你代码里的小笔误:print(rsme)应该改成print(rmse)(变量名拼写错误)。
内容的提问来源于stack exchange,提问作者user16561849
相关产品推荐
相关产品推荐

