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)
这样,测试集中的特征将与训练集中的特征相同,因为它应该放在首位。
注意文档中两种方法的区别(重点是我的):
Learn vocabulary and idf, return document-term matrix.
Transform documents to document-term matrix.
Uses the vocabulary and document frequencies (df) learned by fit (or fit_transform).
回想一下,我们从来没有使用 test 集来学习任何东西。
所以,简单的通用助记规则,几乎适用于任何地方:
术语“拟合”和“测试数据”总是(总是...)不兼容;将它们混合在一起会造成严重破坏。
我正在尝试创建一个 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)
这样,测试集中的特征将与训练集中的特征相同,因为它应该放在首位。
注意文档中两种方法的区别(重点是我的):
Learn vocabulary and idf, return document-term matrix.
Transform documents to document-term matrix.
Uses the vocabulary and document frequencies (df) learned by fit (or fit_transform).
回想一下,我们从来没有使用 test 集来学习任何东西。
所以,简单的通用助记规则,几乎适用于任何地方:
术语“拟合”和“测试数据”总是(总是...)不兼容;将它们混合在一起会造成严重破坏。