Python 可以在列车集中编码分类数据,但不能在测试集中编码

Python 可以在列车集中编码分类数据,但不能在测试集中编码,python,machine-learning,scikit-learn,data-science,label-encoding,Python,Machine Learning,Scikit Learn,Data Science,Label Encoding,我需要对测试集上的分类值进行编码,不知何故它抛出TypeError:argument必须是字符串或数字。我不知道为什么会发生这种情况,因为我可以对我的火车组这样做。我的意思是,它们是训练/测试功能集,所以它们完全相同,区别它们的当然只是行数。我不知道如何解决这个问题,我尝试对每个标签使用不同的LabelEncoder,但它仍然无法解决错误。请有人帮帮我 为便于参考,分类数据在训练和测试特征集中的第8列 import pandas as pd import seaborn as sns impor

我需要对测试集上的分类值进行编码,不知何故它抛出
TypeError:argument必须是字符串或数字。我不知道为什么会发生这种情况,因为我可以对我的火车组这样做。我的意思是,它们是训练/测试功能集,所以它们完全相同,区别它们的当然只是行数。我不知道如何解决这个问题,我尝试对每个标签使用不同的LabelEncoder,但它仍然无法解决错误。请有人帮帮我

为便于参考,分类数据在训练和测试特征集中的第8列

import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestRegressor
import scipy.stats as ss

avo_sales = pd.read_csv('avocados.csv')

avo_sales.rename(columns = {'4046':'small PLU sold',
                            '4225':'large PLU sold',
                            '4770':'xlarge PLU sold'},
                 inplace= True)

avo_sales.columns = avo_sales.columns.str.replace(' ','')

x = np.array(avo_sales.drop(['TotalBags','Unnamed:0','year','region','Date'],1))
y = np.array(avo_sales.TotalBags)

X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)

impC = SimpleImputer(strategy='most_frequent')
X_train[:,8] = impC.fit_transform(X_train[:,8].reshape(-1,1)).ravel()

imp = SimpleImputer(strategy='median')
X_train[:,1:8] = imp.fit_transform(X_train[:,1:8])

le = LabelEncoder()
X_train[:,8] = le.fit_transform(X_train[:,8])
X_test[:,8] = le.fit_transform(X_test[:,8])

在测试集上,不应使用fit_transform,而应仅使用transform。看起来你没有将训练数据的预处理应用到测试数据中,这也是一个错误

编辑


当您在训练数据上使用fit_transform(例如SimpleImputer(strategy='most_frequent')时,您基本上是在计算最频繁值,以将其输入到包含nan的行中。这很好。如果您在测试集上使用fit_transform,那么您所做的就是作弊,因为您假设有很多实例可以计算最频繁的值(而您可能只预测一个实例)。正确的做法是使用在训练集中找到的最频繁值输入缺少的数据。这是通过仅使用变换来完成的。同样的逻辑适用于sklearn中可以找到的每一个其他fit_变换/变换,例如应用PCA或CountVectorizer时

首先感谢您的回答和解释,请原谅我的提问,您能解释一下为什么测试集上的
,您不应该使用fit_transform,而应该只使用transform
?它奏效了,但我仍然不明白为什么它可以解决这个问题