from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
train_matrix = vectorizer.fit_transform(train_data['review'])
test_matrix = vectorizer.fit_transform(test_data['review'])
训练LogisticRegressor
from sklearn.linear_model import LogisticRegression
sentiment_model = LogisticRegression()
sentiment_model = sentiment_model.fit(train_matrix,train_data['sentiment'])
Examin样本数据
sample_test_data = test_data[10:13]
sample_test_matrix = vectorizer.fit_transform(sample_test_data['review'])
predict = sentiment_model.predict(sample_test_matrix)
错误:
X每个样本具有85个特征;期待121676
ValueErrorTraceback(最近一次通话)
在()中
----> 1预测= model.predict(sample_test_matrix)
〜\ Anaconda3 \ lib \ site-packages \ sklearn \ linear_model \ base.py在预报(自己,X)中
Predicted class label per sample.
---------->分数= self.decision_function(X)
if len(scores.shape) == 1:
indices = (scores > 0).astype(np.int)
Decision_function(self,X)
if X.shape[1] != n_features:
raise ValueError("X has %d features per sample; expecting %d"
------------> % (X.shape[1], n_features))
scores = safe_sparse_dot(X, self.coef_.T,
ValueError:X每个样本具有85个功能;期待121676
最佳答案
我相信您遇到的问题是由于在测试集上使用了fit_transform()
方法而不是仅仅使用transform()
方法的结果。 CountVectorizer() fit method学习“原始文档中所有标记的词汇词典”。
这意味着当您在训练集上调用fit_transform()
时,它将生成一个稀疏矩阵,其特征数量等于它在您提供的输入文本中找到的不同单词标记的数量。当您再次在测试集上调用fit_transform()
时,它会根据测试集中的唯一单词生成具有不同维数的稀疏矩阵,而不是使用在训练数据上生成的原始矩阵。
然后,您可以将LogisticRegression
对象适合您的训练数据,但是当您尝试在测试数据上使用predict()
时,它会抱怨输入大小与您在训练时传递的内容不同,因为输入的数量不同特征。
编辑:当您调用以下内容时,也会发生这种情况:test_matrix = vectorizer.fit_transform(test_data['review'])
如果计划将数据分为训练集和测试集,则应避免为CountVectorizer
创建不同的拟合,因为稀疏矩阵的结果维将导致类似您遇到的问题。
TL; DR:
尝试更换这些
test_matrix = vectorizer.fit_transform(test_data['review'])
sample_test_matrix = vectorizer.fit_transform(sample_test_data['review'])
用这些
test_matrix = vectorizer.transform(test_data['review'])
sample_test_matrix = vectorizer.transform(sample_test_data['review'])
关于python - Scikit LogisticRegression中的情感预测错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50671283/