在Scikit LogisticRegression中预测情绪的错误

时间:2018-06-03 21:50:26

标签: python machine-learning scikit-learn logistic-regression sentiment-analysis

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'])

检验样本数据

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(最近一次调用最后一次)

     

in()

----> 1 predict = model.predict(sample_test_matrix)

  预测中的

〜\ Anaconda3 \ lib \ site-packages \ sklearn \ linear_model \ base.py(self,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

1 个答案:

答案 0 :(得分:2)

我相信您遇到的问题是在测试集上使用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'])