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

nxf*_*777 1 python machine-learning tf-idf python-3.x scikit-learn

我正在尝试创建一个 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
Run Code Online (Sandbox Code Playgroud)

打开并清理数据集:

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
Run Code Online (Sandbox Code Playgroud)

矢量化:

from sklearn.feature_extraction.text import TfidfVectorizer
vectorization = TfidfVectorizer()
xv_train = vectorization.fit_transform(X_train)
xv_test = vectorization.fit_transform(X_test)
Run Code Online (Sandbox Code Playgroud)

算法示例 - 逻辑回归:

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

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

错误:

ValueError: X has 112 features per sample; expecting 23
Run Code Online (Sandbox Code Playgroud)

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

ValueError: X has 92 features per sample; expecting 45
Run Code Online (Sandbox Code Playgroud)

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

xv_测试输出

有任何想法吗?

des*_*aut 6

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

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

xv_train = vectorization.fit_transform(X_train)
Run Code Online (Sandbox Code Playgroud)

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

xv_test = vectorization.transform(X_test)
Run Code Online (Sandbox Code Playgroud)

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

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

fit_transform:

学习词汇和idf,返回文档术语矩阵。

transform:

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

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

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

所以,简单的通用助记符规则,几乎无处不在:

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