Объяснение «Несоответствие размеров» после использования fit_transform для данных тестирования - PullRequest
0 голосов
/ 24 октября 2019

Я читал некоторый код о НЛП и увидел, что X_test не имеет fit_transform при назначении (последняя строка кода ниже).

Когда я попытался сделать это с fit_transform, как X_train, и продолжил использовать прогнозную модель, он вернул:

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

Этот вопрос относится к этому случаю: SciPy и scikit-learn - ValueError: Несоответствие размеров

Мне хотелось бы получить простое объяснение того, почему это происходит, потому что я неЯ не понимаю этого ясно.

Ниже приведен код, который у меня есть:

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import accuracy_score

categories = ['alt.atheism', 'comp.graphics']
newsgroups_train = fetch_20newsgroups(subset='train', categories=categories,  
                                      remove=('headers', 'footers', 'quotes'))
newsgroups_test = fetch_20newsgroups(subset='test', categories=categories,  
                                     remove=('headers', 'footers', 'quotes'))
y_train = newsgroups_train.target
y_test = newsgroups_test.target
vectorizer = TfidfVectorizer()
X_train = vectorizer.fit_transform(newsgroups_train.data)
X_test = vectorizer.transform(newsgroups_test.data) #here is the cause of the error if it had 'fit_transform' instead

1 Ответ

0 голосов
/ 25 октября 2019

Когда вы используете TfidfVectorizer().fit_transform(), сначала подсчитывается количество уникального словаря (функции) в ваших данных, а затем его частоты. Ваши данные о тренировках и тестах не имеют одинакового количества уникальных слов. Таким образом, размеры ваших X_test и X_train не совпадают, если вы указали .fit_transform() для каждого из ваших поездов и данных испытаний. Следовательно, ваша прогнозирующая модель теряется и выдает ошибку несоответствия измерений.

Если вы .fit_transform() на X_train, а затем просто .transform() на X_test, вы учитываете только словарь, включенный в X_train,Это игнорирует любой словарь, включенный только в X_test, таким образом, соответствует количеству функций.

РЕДАКТИРОВАТЬ: Я написал небольшой пример.

from sklearn.feature_extraction.text import TfidfVectorizer

city = ['London Moscow Washington',
        'Washington Boston']

president = ['Adams Washington',
             'Jefferson']

vectorizer = TfidfVectorizer()

Сначала .fit_transform(city).

X_city = vectorizer.fit_transform(city)
X_city.toarray()

>>>array([[0.        , 0.6316672 , 0.6316672 , 0.44943642],
          [0.81480247, 0.        , 0.        , 0.57973867]])

Затем .transform(president) на основе приведенного выше соответствия.

vectorizer.transform(president).toarray()

>>>array([[0., 0., 0., 1.],
          [0., 0., 0., 0.]])

Наконец, .fit_transform(president).

X_president = vectorizer.fit_transform(president)
X_president.toarray()

>>>array([[0.70710678, 0.        , 0.70710678],
          [0.        , 1.        , 0.        ]])

Все сводится к сопоставлению измерения между данными поезда и испытания для вашей модели.

...