输入和创建虚拟变量后,列丢失。我该如何解决这个问题?

问题描述 投票:0回答:1

简而言之:输入后,我的列在训练集和测试集之间是不同的。

制作火车、测试数据集的代码

random_state_value = 0

#Define target
X = data.drop(columns = 'income', axis=1)
y = data['income']

#Split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state = random_state_value)
#Impute missing data
imputer_cat = SimpleImputer(strategy = 'most_frequent')
imputer_num = SimpleImputer(strategy = 'median')

X_train[['workclass', 'occupation', 'native-country']] = imputer_cat.fit_transform(X_train[['workclass', 'occupation', 'native-country']])
X_train[['age']] = imputer_num.fit_transform(X_train[['age']])

X_test[['workclass', 'occupation', 'native-country']] = imputer_cat.fit_transform(X_test[['workclass', 'occupation', 'native-country']])
X_test[['age']] = imputer_num.fit_transform(X_test[['age']])
#Create dummy vars
X_train = pd.get_dummies(X_train, columns=['workclass', 'education', 'marital-status', 
                                     'occupation', 'relationship', 'race', 'gender', 'native-country'], drop_first = True)
X_test = pd.get_dummies(X_test, columns=['workclass', 'education', 'marital-status', 
                                     'occupation', 'relationship', 'race', 'gender', 'native-country'], drop_first = True)

y_train = pd.get_dummies(y_train, columns='income', drop_first = True)
y_test = pd.get_dummies(y_test, columns='income', drop_first = True)
y_test = y_test.values.ravel()
y_train = y_train.values.ravel()

我的分类变量缺少值。这就是我所做的。

1. 将数据分成训练集、测试集

2. 估算训练集和测试集中的每个值

3. 为分类变量制作虚拟变量

但是随后有些列消失了,并且X_test和X_train的长度不同。

长度不匹配

丢失的栏目

temp_test = X_test.columns.sort_values()
temp_train = X_train.columns.sort_values()

[col for col in temp_train if col not in temp_test]

这些是列。

为什么会出现这种情况?我该如何解决这个问题?

python machine-learning scikit-learn
1个回答
0
投票

您的问题可能是您的

pd.get_dummies
为它看到的每个类别生成一列。这意味着,如果您的训练和测试数据中存在不同的情况,则结果数据集中将包含其他列。

要解决您的问题,您可以

pd.Categorical
任意分类列,如下所示。然后修复训练数据的类别并使用该列生成虚拟数据。

categories = train_df['category'].unique()

train_df['category'] = pd.Categorical(train_df['category'], categories=categories)
train_dummies = pd.get_dummies(train_df['category'], prefix='category')

test_df['category'] = pd.Categorical(test_df['category'], categories=categories)
test_dummies = pd.get_dummies(test_df['category'], prefix='category')

这提供了一致的列,但它遗漏了测试中的训练数据中不存在的列。然而,这可能是最好的处理方式。

关于代码的一些单独注释。首先,如果您的

income
列不是分类的,则将其设为虚拟列是没有意义的。另外,您正在输入
age
列,但之后不使用它。最后,您可以考虑仅在训练数据上拟合和转换输入器,并仅在测试数据上进行转换。在我看来,这更有意义,因为您输入的是相同的值。

© www.soinside.com 2019 - 2024. All rights reserved.