Ошибка в прогнозировании настроений в Scikit LogisticRegression - PullRequest
0 голосов
/ 04 июня 2018
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 предикат = model.predict (sample_test_matrix)

~ \ Anaconda3 \ lib \ site-packages \ sklearn \ linear_model \ base.py в предикате (self, X)

            Predicted class label per sample.

---------->Scores = self.decision_function (X)

       if len(scores.shape) == 1:

         indices = (scores > 0).astype(np.int)

Решение_функции (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 голосов
/ 04 июня 2018

Я полагаю, что проблема, с которой вы сталкиваетесь, связана с использованием метода fit_transform() в вашем наборе тестов вместо просто метода transform().Метод CountVectorizer () учитывает словарный словарь всех токенов в необработанных документах.

Это означает, что когда вы вызываете 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'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...