简而言之:输入后,我的列在训练集和测试集之间是不同的。
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]
这些是列。
为什么会出现这种情况?我该如何解决这个问题?
您的问题可能是您的
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
列,但之后不使用它。最后,您可以考虑仅在训练数据上拟合和转换输入器,并仅在测试数据上进行转换。在我看来,这更有意义,因为您输入的是相同的值。