我尝试使用 dask DummyEncoder对于 OneHotEncoding
我的数据。但结果并不如预期。
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
如何获得相同的结果?我之所以这样想,是因为我将对列的子集进行编码,然后将生成的 encoded_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 内部使用 pandas,我相信它使用 get_dummies
。这就是 DummyEncoder
的行为方式。如果有人能指出一种在 Pandas 中做同样事情的方法,我们也将不胜感激。
最佳答案
来自 dask 的 DummyEncoder
columns
参数文档:
The columns to dummy encode. Must be categorical dtype.
Dummy encodes all categorical dtype columns by default.
另外,它说 here在使用某些编码器(包括 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
关于python - Dask DummyEncoder 不返回所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51862846/