使用Sklearn训练波斯语文本情感分析模型后预测报错咨询
解决ValueError: X.shape[1] = 8 should be equal to 1500的问题
嘿,我一眼就发现了两个关键问题导致这个报错,咱们逐个拆解:
问题1:训练时保存的不是SVM分类器,而是测试集的预测结果
看你训练代码里的这段:
with open('svm_rbf_classifier.pkl', 'wb') as fid: _pickle.dump(y_pred, fid)
你把测试集的预测结果y_pred(一个数组)误存成了"分类器",但实际上你应该保存训练好的classifier_rbf模型!这会导致后续加载时,classifier_rbf根本不是有效的SVM模型,直接影响后续预测逻辑。
问题2:预测时错误使用fit_transform,而非transform
在预测代码里:
X = vectorizer.fit_transform([comment]).toarray()
fit_transform会重新拟合TF-IDF向量器——也就是针对这条新评论重新构建词汇表,所以生成的特征只有8个(这条评论里的有效词数量),完全和训练时的1500维特征空间不匹配。正确做法是只用transform,复用训练好的向量器的词汇表来转换新文本。
修正后的完整代码
训练阶段(保存正确的模型与向量器):
vectorizer = TfidfVectorizer(max_features=1500, sublinear_tf=True, use_idf=True, stop_words=stop_words) X = vectorizer.fit_transform(data).toarray() le = LabelEncoder() le.fit(["pos", "neu", "neg"]) y = le.transform(data_labels) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) classifier_rbf = SVC(kernel='rbf', gamma=1, C=1) classifier_rbf.fit(X_train, y_train) y_pred = classifier_rbf.predict(X_test) # 修正:保存训练好的SVM分类器 with open('svm_rbf_classifier.pkl', 'wb') as fid: _pickle.dump(classifier_rbf, fid) # 保存训练好的TF-IDF向量器 with open('tfidf_vectorizer.pkl', 'wb') as fid: _pickle.dump(vectorizer, fid) print(classification_report(y_test, y_pred)) print() print(accuracy_score(y_test, y_pred))
预测阶段(用transform复用特征空间):
import _pickle from sklearn.svm import SVC from sklearn.feature_extraction.text import TfidfVectorizer with open('tfidf_vectorizer.pkl', 'rb') as fid: vectorizer = _pickle.load(fid) with open('svm_rbf_classifier.pkl', 'rb') as fid: classifier_rbf = _pickle.load(fid) comment = 'من نسبت به نتایجی که تیم این روزا کسب میکنه نگرانم' # 修正:只用transform,避免重新拟合词汇表 X = vectorizer.transform([comment]).toarray() predicted = classifier_rbf.predict(X) print(predicted)
额外提醒
别忘了保存LabelEncoder哦!不然预测出来的数字标签(0/1/2)没法对应回"pos"/"neu"/"neg"的情感标签,你可以用pickle把它也保存下来,预测时加载后用le.inverse_transform(predicted)转换回原标签。
内容的提问来源于stack exchange,提问作者Nariman Esmaiely Fard
相关产品推荐
相关产品推荐

