预训练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
相关产品推荐
相关产品推荐

