可以在训练集中编码分类数据,但不能在测试集中编码

Can encode categorical data in train set but not in the test set

我需要对我的测试集上的分类值进行编码,但它以某种方式抛出 TypeError: argument must be a string or number。我不知道为什么会这样,因为我可以对我的火车组这样做。我的意思是它们是 train/test 功能集,因此它们完全相同,当然,它们的区别只是行数。我不知道如何解决这个问题,我尝试为每个使用不同的 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,而只能转换。而且您似乎没有将对训练数据所做的预处理应用于测试数据,这也是一个错误。

编辑

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