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

预训练RandomForestClassifier预测时特征数量不匹配问题求助

解决RandomForestClassifier特征数不匹配的ValueError问题

问题核心原因

你遇到的报错本质是测试阶段重新拟合了文本向量化器(CountVectorizer)和TF-IDF转换器,导致测试数据的特征维度(14个)与训练时的(148409个)完全不匹配。训练时的向量化器基于大规模数据集生成了完整词汇表,而测试时单独对单样本拟合,仅保留了该样本的词汇特征,维度自然无法对齐。

解决方案

解决思路是:训练阶段不仅保存模型,还要保存CountVectorizer和TfidfTransformer这两个预处理组件;测试阶段直接加载这些组件转换输入文本,而非重新拟合。

修正后的训练代码

(注:原代码中TfidTransformer为拼写错误,已修正为TfidfTransformer)

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
import pickle

# 文本预处理:基于训练数据拟合向量化规则
vectorizer = CountVectorizer()
BoW_data = vectorizer.fit_transform(data['Text'])

tf_idf_transformer = TfidfTransformer().fit(BoW_data)
data_tf_idf = tf_idf_transformer.transform(BoW_data)

# 划分训练测试集
text_train, text_test, label_train, label_test = train_test_split(
    data_tf_idf, data['Label'], test_size=0.3
)

# 训练模型
RF_classifier = RandomForestClassifier()
RF_classifier.fit(text_train, label_train)

# 保存模型及预处理组件
with open("saved_model.pickle", 'wb') as f:
    pickle.dump(RF_classifier, f)
with open("vectorizer.pickle", 'wb') as f:
    pickle.dump(vectorizer, f)
with open("tfidf_transformer.pickle", 'wb') as f:
    pickle.dump(tf_idf_transformer, f)

修正后的测试代码

import pickle

# 加载训练好的预处理组件和模型
with open("vectorizer.pickle", 'rb') as f:
    vectorizer = pickle.load(f)
with open("tfidf_transformer.pickle", 'rb') as f:
    tf_idf_transformer = pickle.load(f)
with open("saved_model.pickle", 'rb') as f:
    RF_classifier = pickle.load(f)

# 处理输入文本:直接用训练好的规则转换,禁止重新fit
input_string = ["你的测试句子"]  # 必须传入列表/数组形式,即使是单样本
BoW_data = vectorizer.transform(input_string)
data_tf_idf = tf_idf_transformer.transform(BoW_data)

# 直接预测,无需多余的train_test_split操作
predict_result = RF_classifier.predict(data_tf_idf)
print(predict_result)

关键注意事项

  • 测试阶段绝对不能对预处理组件调用fit(),fit()仅用于从训练数据中学习特征规则,测试只需要用已有规则转换数据
  • 输入文本必须以列表/数组形式传入,不能直接传单个字符串
  • 原测试代码中train_test_split(test_size=1)完全多余,单样本拆分无意义,直接使用处理后的特征矩阵即可预测

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:01:13