You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决ValueError:输入特征数与RandomForestRegressor期望不符问题

解决特征数不匹配错误:ValueError: X has 31 features, but RandomForestRegressor is expecting 32 features as input

问题原因

模型训练时使用了32个特征,但预测传入的输入只有31个特征,特征数量不匹配导致报错。

解决方案

1. 先确认训练集特征数量

在训练代码中添加打印语句,明确训练时的特征数:

# 打印训练集和测试集的特征数量
print("X_train特征数:", X_train.shape[1])
print("X_test特征数:", X_test.shape[1])

运行后确认是否为32个特征,确保训练、测试集特征数一致。

2. 修正预测输入的特征数量

检查手动输入的预测数组,补全缺失的特征值(根据业务场景填充合理值,比如0、均值等):

# 修正后的预测输入,确保包含32个特征值(示例补全最后一个特征为0,需根据实际情况调整)
pred_input = [[8, 1.3, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0]]
pred_value = best_model.predict(pred_input)
print(pred_value)

3. 更规范的做法:用DataFrame确保特征匹配

手动输入数组易出错,建议用DataFrame构造预测输入,保证特征列名、顺序与训练集完全一致:

import pandas as pd

# 用训练集的列名构造预测DataFrame,确保特征顺序和数量匹配
pred_df = pd.DataFrame(
    [[8, 1.3, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0]],
    columns=X_train.columns
)
pred_value = best_model.predict(pred_df)
print(pred_value)

4. 封装模型到Pipeline(避免后续问题)

如果有特征预处理(如编码、缩放),用Pipeline封装整个流程,保存模型时连预处理步骤一起保存,彻底避免特征不匹配:

from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV
import pickle
import pandas as pd

# 封装模型到Pipeline(如有预处理步骤,可添加到Pipeline中)
pipe = Pipeline([
    ('regressor', RandomForestRegressor())
])

# 定义网格搜索参数(参数名前缀需和Pipeline步骤名一致)
parameters = {
    'regressor__n_estimators': [10, 50, 100],
    'regressor__criterion': ['squared_error','absolute_error','poisson']
}

grid_obj = GridSearchCV(estimator=pipe, param_grid=parameters)
grid_fit = grid_obj.fit(X_train, y_train)
best_model = grid_fit.best_estimator_

# 保存完整Pipeline模型
with open('predictor.pickle', 'wb') as file:
    pickle.dump(best_model, file)

# 预测时用DataFrame输入,确保特征一致
pred_df = pd.DataFrame(
    [[8, 1.3, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0]],
    columns=X_train.columns
)
pred_value = best_model.predict(pred_df)
print(pred_value)

内容的提问来源于stack exchange,提问作者nesly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:18:19