Прогноз рейтингов фильмов с использованием TF-IDF - PullRequest
0 голосов
/ 26 января 2019

У меня есть набор данных, имеющий формат-

Movie_Name, TomatoCritics, Target_Variable

Здесь атрибут TomatoCritics имеет свободный текст от разных пользователей для разных фильмов.И Target_Variable - это двоичное значение (0 или 1), указывающее, должен ли этот фильм смотреть или нет.

Я использую TF-IDF для обработки этого, и мой код выглядит так -

import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfVectorizer


# Read textual training data-
text_training = pd.read_csv("Textual-Training_Data.csv")

# Read textual testing data-
text_testing = pd.read_csv("Textual-Testing_Data.csv")

# Get dimensions of training data-
text_training.shape
# (95, 3)

# Get dimensions of testing data-
text_testing.shape
# (224, 3)


# Check for missing values in training data-
text_training.isnull().values.any()
# True

# Check for missing values in testing data-
text_testing.isnull().values.any()
# True

# Remove any row having missing value from training data-
text_training_nona = text_training.dropna(axis = 0, how='any')

# Remove any row having missing value from testing data-
text_testing_nona = text_testing.dropna(axis = 0, how = 'any')

# Get dimensions of training data AFTER removing empty rows-
text_training_nona.shape
# (73, 3)

# Get dimensions of testing data AFTER removing empty rows-
text_testing_nona.shape
# (158, 3)


# Attributes to use for training and testing sets for ML-
cols_train = ['tomatoConsensus', 'goodforairplanes']
cols_test = ['tomatoConsensus', 'goodforairplanes']



# Split training dataset into features (X) and label (y) for training-
X_train = text_training_nona['tomatoConsensus']
y_train = text_training_nona['goodforairplanes']


# Split training dataset into features (X) and label (y) for testing-
X_test = text_testing_nona["tomatoConsensus"]
y_test = text_testing_nona['goodforairplanes']




# Initialize Count Vectorizer using TF-IDF ->
cv = TfidfVectorizer(min_df = 1, stop_words='english')

# Convert text to TF-IDF ->
X_train_cv = cv.fit_transform(X_train)
X_test_cv = cv.fit_transform(X_test)

# Multinomial Naive Bayes classifier-
mnb = MultinomialNB()

# Train model on training data-
mnb.fit(X_train_cv, y_train)

print(X_test_cv[0])
'''
(0, 1168)   0.20066499253877468
  (0, 31)   0.2419027475877309
  (0, 1090) 0.22790133982975397
  (0, 5)    0.2616366234663056
  (0, 877)  0.2616366234663056
  (0, 1279) 0.2419027475877309
  (0, 850)  0.1786670002268731
  (0, 1341) 0.2616366234663056
  (0, 2)    0.2616366234663056
  (0, 695)  0.2616366234663056
  (0, 1221) 0.2419027475877309
  (0, 884)  0.1786670002268731
  (0, 1070) 0.2616366234663056
  (0, 782)  0.2616366234663056
  (0, 252)  0.20066499253877468
  (0, 1259) 0.2419027475877309
  (0, 1093) 0.20816746395117927
  (0, 122)  0.2170410042381541
'''

y_pred = mnb.predict(X_test_cv[0])

Последняя строка с использованием mnb.predict() выдает ошибку-

ValueError: несоответствие размеров

Что не так?

Спасибо!

1 Ответ

0 голосов
/ 26 января 2019

Вы должны fit_transform один раз, а затем трансформироваться, используя существующий cv и обученный cv объект.Измените

X_train_cv = cv.fit_transform(X_train)
X_test_cv = cv.fit_transform(X_test)

на

X_train_cv = cv.fit_transform(X_train)
X_test_cv = cv.transform(X_test)

- и это должно решить вашу проблему.

Если вы снова позвоните fit_transofrm с дополнительными данными, возможно, он содержит другуюколичество уникальных слов, и он будет производить словарь другого размера - тогда размер mnb, обученный с другими данными, и другой размер словаря будет другим - вот что ValueError: несоответствие размеров .

Редактировать
Просто отметьте X_test_cv и X_train_cv для обоих случаев - если вы fit_transform для X_train и X_test, это дает разные формы, но если вы замените второй fit_transform для преобразования - они будут одинаковыми.

...