TF-IDF 变换后由于测试集和训练集的特征数量不同而导致的错误

时间:2021-03-23 01:07:40

标签: python python-3.x machine-learning scikit-learn tf-idf

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

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

dataset

进口:

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 变量,这是输出示例(也经常更改):

xv_test output

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

我们从不.fit().fit_transform() 应用于看不见的(测试)数据。应该只对训练数据进行一次拟合,就像您在此处所做的那样:

xv_train = vectorization.fit_transform(X_train)

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

xv_test = vectorization.transform(X_test)

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

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

fit_transform

<块引用>

学习词汇和idf,返回document-term矩阵。

transform

<块引用>

将文档转换为文档-术语矩阵。

使用通过 fit(或 fit_transform)学习的词汇和文档频率 (df)。

记住,我们从来没有使用测试集来学习任何东西。

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

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