SVC文本分类单样本预测报错TypeError: unhashable type: 'csr_matrix'求助
报错原因
- 直接触发报错的原因:
TfidfVectorizer的vocabulary参数要求传入词到索引的映射字典,你直接传入了向量化后的X_train(csr_matrix稀疏矩阵类型),稀疏矩阵属于不可哈希类型,无法作为词汇表的合法输入,直接触发类型错误。 - 逻辑错误:预测阶段调用
fit_transform属于错误操作。fit操作会重新学习词汇表,导致单样本输出的特征维度、特征对应含义和训练模型时的输入完全不匹配,就算词汇表传对了也无法得到正确预测结果。 - 额外流程缺陷:你先对全量文本做TF-IDF向量化再拆分训练测试集,属于典型的数据泄露问题,测试集的信息会提前泄露到训练阶段,你得到的98.6%准确率存在虚高可能。
正确单样本预测实现
1. 修正后的完整训练流程(解决数据泄露+保存向量化器)
from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import SVC import pandas as pd # 加载数据集 df = pd.read_csv("你的数据集路径.csv") # 先拆分训练集测试集,禁止提前做全量向量化 X_text_train, X_text_test, y_train, y_test = train_test_split(df['text'], df['label'], test_size=0.2, random_state=42) # 初始化TF-IDF向量化器,仅在训练集文本上fit tfidf = TfidfVectorizer() X_train = tfidf.fit_transform(X_text_train) # 测试集仅调用transform,不要做fit操作 X_test = tfidf.transform(X_text_test) # 训练SVC模型 clf = SVC(kernel='linear') clf.fit(X_train, y_train) # 测试集验证准确率 print(clf.score(X_test, y_test))
2. 单样本预测代码
# 待预测的单条文本 sample_text = "需要预测的文本语句" # 直接用训练时fit好的tfidf实例调用transform,不要新建向量化器,不要加fit操作 sample_feature = tfidf.transform([sample_text]) # 输出预测标签 pred_label = clf.predict(sample_feature)[0] print(pred_label)
注意事项
- 单条文本必须放到列表中传入
transform方法,否则会按字符拆分文本,得到错误特征 - 全程使用训练阶段fit好的同一个
TfidfVectorizer实例,不需要新建,也不需要额外指定vocabulary参数
内容的提问来源于stack exchange,提问作者GUNTER
相关产品推荐
相关产品推荐

