在测试数据上使用 fit_transform 后 "Dimension mismatch" 的解释
Explanation of "Dimension mismatch" after using fit_transform on testing data
我正在阅读一些关于 NLP 的代码,看到 X_test
在分配时没有 fit_transform
(下面最后一行代码)。
当我尝试像 X_train
那样使用 fit_transform
并继续使用它返回的预测模型时:
ValueError: dimension mismatch
这个问题是关于那个案例的: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
当您使用 TfidfVectorizer().fit_transform()
时,它首先计算数据中独特词汇(特征)的数量,然后计算其频率。您的训练和测试数据没有相同数量的独特词汇。因此,如果您在每个训练和测试数据上 .fit_transform()
,则 X_test
和 X_train
的维度不匹配。因此,您的预测模型会丢失并给您带来维度不匹配错误。
如果你在 X_train
上 .fit_transform()
然后在 X_test
上 .transform()
,你只计算 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. ]])
归结为匹配模型的训练数据和测试数据之间的维度。
我正在阅读一些关于 NLP 的代码,看到 X_test
在分配时没有 fit_transform
(下面最后一行代码)。
当我尝试像 X_train
那样使用 fit_transform
并继续使用它返回的预测模型时:
ValueError: dimension mismatch
这个问题是关于那个案例的: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
当您使用 TfidfVectorizer().fit_transform()
时,它首先计算数据中独特词汇(特征)的数量,然后计算其频率。您的训练和测试数据没有相同数量的独特词汇。因此,如果您在每个训练和测试数据上 .fit_transform()
,则 X_test
和 X_train
的维度不匹配。因此,您的预测模型会丢失并给您带来维度不匹配错误。
如果你在 X_train
上 .fit_transform()
然后在 X_test
上 .transform()
,你只计算 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. ]])
归结为匹配模型的训练数据和测试数据之间的维度。