ValueError: X имеет 1709 объектов на выборку; ожидая 2444
Я использую этот код:
import pandas as pd
import numpy as np
from nltk.tokenize import word_tokenize
import re
Использование векторизации TFIDF
from sklearn.feature_extraction.text import TfidfVectorizer
tv=TfidfVectorizer(max_df=0.5,min_df=2,stop_words='english')
Загрузка файлов данных
df=pd.read_json('train.json',orient='columns')
test_df=pd.read_json('test.json',orient='columns')
df['seperated_ingredients'] = df['ingredients'].apply(','.join)
test_df['seperated_ingredients'] = test_df['ingredients'].apply(','.join)
df['seperated_ingredients']=df['seperated_ingredients'].str.lower()
test_df['seperated_ingredients']=test_df['seperated_ingredients'].str.lower()
cuisines={'thai':0,'vietnamese':1,'spanish':2,'southern_us':3,'russian':4,'moroccan':5,'mexican':6,'korean':7,'japanese':8,'jamaican':9,'italian':10,'irish':11,'indian':12,'greek':13,'french':14,'filipino':15,'chinese':16,'cajun_creole':17,'british':18,'brazilian':19 }
df.cuisine= [cuisines[item] for item in df.cuisine]
Делать предварительную обработку
ho=df['seperated_ingredients']
ho=ho.replace(r'#([^\s]+)', r'\1', regex=True)
ho=ho.replace('\'"',regex=True)
ho=tv.fit_transform(ho)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(ho,df['cuisine'],random_state=0)
from sklearn.linear_model import LogisticRegression
clf= LogisticRegression(penalty='l1')
clf.fit(X_train, y_train)
clf.score(X_test,y_test)
from sklearn.linear_model import LogisticRegression
clf1= LogisticRegression(penalty='l1')
clf1.fit(ho,df['cuisine'])
hs=test_df['seperated_ingredients']
hs=hs.replace(r'#([^\s]+)', r'\1', regex=True)
hs=hs.replace('\'"',regex=True)
hs=tv.fit_transform(hs)
ss=clf1.predict(hs) # this line is giving error.
Получение вышеупомянутой ошибки при прогнозировании. Кто-нибудь знает, что я делаю не так?
1 ответ
Вы не должны повторно устанавливать tfidf-vectorizer, а использовать тот же векторизатор с той же формой словаря для кодирования тестовых данных. Есть описания методов из документов:
fit_transform(raw_documents, y=None)
Learn vocabulary and idf, return term-document matrix.
This is equivalent to fit followed by transform, but more efficiently implemented.
transform(raw_documents, copy=True)
Transform documents to document-term matrix.
Uses the vocabulary and document frequencies (df) learned by fit (or fit_transform).
У тебя есть ValueError: X has 1709 features per sample; expecting 2444
Поскольку векторизатор был заменен тестовыми данными и был создан новый словарь, тестовые данные были закодированы в массив другой формы. Просто проверьте размер словаря до и после второго fit_transform с помощью print(len(tv.vocabulary_))
, Кроме того, словарь tf-idf, вероятно, был переупорядочен во время переоборудования.
ho=df['seperated_ingredients']
ho=ho.replace(r'#([^\s]+)', r'\1', regex=True)
ho=ho.replace('\'"',regex=True)
ho=tv.fit_transform(ho)
затем используйте предварительно обученный векторизатор tf-idf для кодирования данных с помощью функции преобразования:
hs=test_df['seperated_ingredients']
hs=hs.replace(r'#([^\s]+)', r'\1', regex=True)
hs=hs.replace('\'"',regex=True)
hs=tv.transform(hs)
Преобразование осуществляется с использованием того же словаря, поэтому выходной массив имеет правильную форму.