Dask DummyEncoder 不返回所有列

Dask DummyEncoder not returning all the columns

我尝试对 OneHotEncoding 我的数据使用 dask 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_bB_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 中做同样事情的方法,我们也将不胜感激。

来自 DummyEncoder columns 参数的 dask 文档:

The columns to dummy encode. Must be categorical dtype.
Dummy encodes all categorical dtype columns by default.

此外,它说 here 在使用某些编码器(包括 DummyEncoder )之前,您 必须始终 使用 Categorizer

正确的做法:

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