TF-IDF变换后测试集和训练集特征个数不同导致的误差

Error due to different number of features in test and train sets after TF-IDF transform

我正在尝试创建一个 AI 来读取我的数据集并说明数据外的输入是 1 还是 0

我的数据集包含定性数据列和布尔值列。这是其中的一个示例:

进口:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
import re
import string

打开并清理数据集:

saisei_data = saisei_data.dropna(how='any',axis=0) 
saisei_data = saisei_data.sample(frac=1)
X = saisei_data['Data']
y = saisei_data['Conscious']
saisei_data

矢量化:

from sklearn.feature_extraction.text import TfidfVectorizer
vectorization = TfidfVectorizer()
xv_train = vectorization.fit_transform(X_train)
xv_test = vectorization.fit_transform(X_test)

示例算法 - 逻辑回归:

LR = LogisticRegression()
LR.fit(xv_train,y_train)
pred_lr=LR.predict(xv_test) # Here is where I get an error

一切正常,直到我使用逻辑回归算法进行预测。

错误:

ValueError: X has 112 features per sample; expecting 23

这似乎会变成类似的错误,例如:

ValueError: X has 92 features per sample; expecting 45

我是机器学习的新手,所以我真的不知道在使用算法时我在做什么,但是我尝试打印 xv_test 变量,这里是输出示例(也经常更改):

有什么想法吗?

那是因为您错误地将 .fit_transform() 应用到您的 test 数据;并且,在这种情况下,您很幸运,该过程产生了 编程 错误,从而提醒您您在方法论上做错了(情况并非总是如此)。

我们从不.fit().fit_transform()应用于看不见的(测试)数据。拟合应该只用训练数据完成一次,就像你在这里所做的那样:

xv_train = vectorization.fit_transform(X_train)

对于未见(测试)数据的后续转换,我们仅使用 .transform()。所以,你的下一行应该是

xv_test = vectorization.transform(X_test)

这样,测试集中的特征将与训练集中的特征相同,因为它应该放在首位。

注意文档中两种方法的区别(重点是我的):

fit_transform:

Learn vocabulary and idf, return document-term matrix.

transform:

Transform documents to document-term matrix.

Uses the vocabulary and document frequencies (df) learned by fit (or fit_transform).

回想一下,我们从来没有使用 test 集来学习任何东西。

所以,简单的通用助记规则,几乎适用于任何地方:

术语“拟合”和“测试数据”总是(总是...)不兼容;将它们混合在一起会造成严重破坏。