我有一个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]])
这里有什么想法吗?
谢谢!
答案 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')