使用SVC多分类模型对全量DataFrame预测时遇特征数不匹配错误求助
解决SVC预测时特征数不匹配的问题
错误原因
你遇到的ValueError核心问题是两次使用了独立的CountVectorizer实例:
- 训练阶段的
tf是基于标注数据(已删除NaN行)拟合出的词汇表,对应8989个特征; - 预测全量数据时新创建的
tf_entire_df是基于所有文本重新拟合的,包含了更多未标注数据里的新词汇,导致特征数变成36976,和SVC模型训练时的输入维度不匹配。
解决方案:复用训练时的CountVectorizer
不要重新创建新的CountVectorizer,直接用训练阶段已经拟合好的tf实例来转换全量数据,这样生成的特征矩阵维度会和训练时完全一致。
修正后的全量预测代码:
# 直接使用训练时的tf实例执行transform,不要重新fit X_entire_df = tf.transform(df['documents']) # 正常执行预测 y_pred_entire_df = model.predict(X_entire_df)
关键说明
fit_transform()会同时完成构建词汇表和转换为词矩阵两个操作;transform()只会用已构建好的词汇表转换数据,自动忽略训练时未出现过的新词汇,确保输入特征数和模型训练时一致。
另外,补充修正你训练阶段的一个小问题:你提到步骤1是删除categories含NaN的行,但现有代码里没做这个操作,正确的训练阶段代码应该先过滤标注数据:
# 先过滤出有标注的数据 df_labeled = df.dropna(subset=['categories']) # 基于标注数据拟合CountVectorizer并转换 tf = CountVectorizer(tokenizer=word_tokenize) X = tf.fit_transform(df_labeled['documents']) y = df_labeled['categories'] # 拆分训练集测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
内容的提问来源于stack exchange,提问作者feroli
相关产品推荐
相关产品推荐

