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

时间:2018-05-02 15:55:18

标签: python pandas one-hot-encoding

我有一个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

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

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

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

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

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

让我回来:

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

这里有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

这不是一个难以解决的问题。 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')