我尝试对OneHotEncoding
的数据使用DummyEncoder这样的数据。但是结果并不如预期。
dask的DummyEncoder示例:
from dask_ml.preprocessing import DummyEncoder
import pandas as pd
data = pd.DataFrame({
'B': ['a', 'a', 'a', 'b','c']
})
de = DummyEncoder()
de = de.fit(data)
testD = pd.DataFrame({'B': ['a','a']})
trans = de.transform(testD)
print(trans)
输出:
B_a
0 1
1 1
为什么它不显示B_b
,B_c
?但是当我这样更改testD
时:
testD = pd.DataFrame({'B': ['a','a', 'b', 'c']})
结果是:
B_a B_b B_c
0 1 0 0
1 1 0 0
2 0 1 0
3 0 0 1
sklearn的OneHotEncoder示例(在LabelEncoding之后):
from sklearn.preprocessing import OneHotEncoder
import pandas as pd
data = pd.DataFrame({
'B': [1, 1, 1, 2, 3]
})
encoder = OneHotEncoder()
encoder = encoder.fit(data)
testdf = pd.DataFrame({'B': [2, 2]})
trans = encoder.transform(testdf).toarray()
pd.DataFrame(trans, columns=encoder.active_features_)
输出:
1 2 3
0 0.0 1.0 0.0
1 0.0 1.0 0.0
我如何获得相同的结果?之所以这样想,是因为我将对列的一个子集进行编码,然后将所得的encode_df与从主df中删除的主列一起连接到主df。
因此,如下所示(主df):
A B C
0 M 1 10
1 F 2 20
2 T 3 30
3 M 4 40
4 F 5 50
5 F 6 60
预期输出:
A_F A_M A_T B C
0 0 1 0 1 10
1 1 0 0 2 20
2 0 0 1 3 30
3 0 1 0 4 40
4 1 0 0 5 50
5 1 0 0 6 60
编辑:
由于dask内部使用大熊猫,因此我相信它使用get_dummies
。 DummyEncoder
的行为方式。如果有人指出在熊猫中做同样的事情,也将不胜感激。
答案 0 :(得分:1)
从dask的文档中获得有关DummyEncoder
columns
参数的信息:
要虚拟编码的列。 必须是类别dtype 。
默认情况下,Dummy对所有类别dtype列进行编码。
此外,它说here,您必须始终使用Categorizer
,然后再使用某些编码器(包括DummyEncoder
)。
正确的方法:
from dask_ml.preprocessing import Categorizer, DummyEncoder
from sklearn.pipeline import make_pipeline
pipe = make_pipeline(
Categorizer(), DummyEncoder())
pipe.fit(data)
pipe.transform(testD)
输出的人:
B_a B_b B_c
0 1 0 0
1 1 0 0