在测试数据上使用fit_transform后的“尺寸不匹配”说明

时间:2019-10-24 14:25:47

标签: python scikit-learn tf-idf

我正在阅读一些有关NLP的代码,发现X_test在分配时没有fit_transform(下面的代码最后一行)。

当我尝试使用fit_transform之类的X_train并继续使用预测模型时,它返回:

  

ValueError:尺寸不匹配

这个问题是关于这种情况的:SciPy and scikit-learn - ValueError: Dimension mismatch

我想简单解释一下它为什么会发生,因为我不清楚。

下面是我的代码:

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 :(得分:0)

使用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.        ]])

归结为匹配模型的训练数据和测试数据之间的维度。