我正在尝试创建一个AI,它可以读取我的数据集,并判断输入数据是否为1或0
我的数据集有一个定性数据列和一个布尔值列。以下是其中的一个样本:
导入库:
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变量,以下是输出样本(也经常变化):
有什么想法吗?
回答:
这是因为你错误地对测试数据应用了.fit_transform()
;在这种情况下,你很幸运地得到了一个编程错误,从而提醒你方法上出了问题(但并不是总是这样的)。
我们从不对未见(测试)数据应用.fit()
或.fit_transform()
。拟合应该只对训练数据进行一次,就像你在这里做的那样:
xv_train = vectorization.fit_transform(X_train)
对于未见(测试)数据的后续转换,我们只使用.transform()
。所以,你的下一行应该是
xv_test = vectorization.transform(X_test)
这样,测试集中的特征将与训练集中的特征相同,这才是正确的做法。
请注意文档中这两种方法的区别(强调我的):
学习词汇和idf,返回文档-词矩阵。
将文档转换为文档-词矩阵。
使用通过fit(或fit_transform)学习的词汇和文档频率(df)。
并记住,我们永远不会使用测试集来学习任何东西。
所以,一个简单的通用助记规则,几乎在任何地方都适用:
术语“fit”和“测试数据”总是(总是…)不兼容的;混合使用它们会造成混乱。