pandas get_dummies 无法处理测试数据中看不见的标签

pandas get_dummies cannot handle unseen labels in test data

我有一个 Pandas DataFrame,train,我是单热编码。它看起来像这样:

    car
0   Mazda
1   BMW
2   Honda

如果我使用 pd.get_dummies,我会得到这个:

car_BMW car_Honda   car_Mazda
0   0       0           1
1   1       0           0
2   0       1           0 

目前一切顺利。

但是,我无权访问我的测试集,因此我需要处理 car 的值出现在测试中但未在 train 中出现的可能性。

假设test是这样的:

    car
0   Mazda
1   Audi

然后如果我在 test 上使用 pd.get_dummies,我得到:

car_Audi    car_Mazda
0   0           1
1   1           0

这是错误的,因为我有一个新专栏 car_Audi 并且缺少 car_BMW

我希望单热编码 test 的输出为:

car_BMW car_Honda   car_Mazda
0   0       0           1
1   0       0           0

所以它只是忽略了以前在测试中看不见的值。我绝对不想为以前在测试中看不到的值创建新列。

我查看了 sklearn.preprocessing.LabelBinarizer,但它输出了一个 numpy 数组,并且列的顺序不明确:

lb = LabelBinarizer()
train_transformed = lb.fit_transform(train_df)

还给我:

array([[0, 0, 1],
       [1, 0, 0],
       [0, 1, 0]])

有什么想法吗?

谢谢!

这不是一个很难解决的问题。 LabelBinarizer有个参数classes_想知道原始标签的位置可以查询:

train_transformed = lb.fit_transform(df)

print(train_transformed)
array([[0, 0, 1],
       [1, 0, 0],
       [0, 1, 0]])

print(lb.classes_)
array(['BMW', 'Honda', 'Mazda'], dtype='<U5')