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

我正在尝试创建一个AI,它可以读取我的数据集,并判断输入数据是否为1或0

我的数据集有一个定性数据列和一个布尔值列。以下是其中的一个样本:

dataset

导入库:

import pandas as pdimport numpy as npimport seaborn as snsimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_scorefrom sklearn.metrics import classification_reportimport reimport 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 TfidfVectorizervectorization = 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) # 这里我遇到了错误

在使用逻辑回归算法进行预测之前,一切都运行正常。

错误:

ValueError: X has 112 features per sample; expecting 23

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

ValueError: X has 92 features per sample; expecting 45

我对机器学习是新手,所以在使用这些算法时我并不完全清楚自己在做什么,但我尝试打印了xv_test变量,以下是输出样本(也经常变化):

xv_test output

有什么想法吗?


回答:

这是因为你错误地对测试数据应用了.fit_transform();在这种情况下,你很幸运地得到了一个编程错误,从而提醒你方法上出了问题(但并不是总是这样的)。

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

xv_train = vectorization.fit_transform(X_train)

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

xv_test = vectorization.transform(X_test)

这样,测试集中的特征将与训练集中的特征相同,这才是正确的做法。

请注意文档中这两种方法的区别(强调我的):

fit_transform:

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

transform:

将文档转换为文档-词矩阵。

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

并记住,我们永远不会使用测试集来学习任何东西。

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

术语“fit”和“测试数据”总是(总是…)不兼容的;混合使用它们会造成混乱。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注