Прогноз рейтингов фильмов с использованием TF-IDF
У меня есть набор данных, имеющий формат
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 ответ
Вам следует 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 для преобразования - они будут одинаковыми.