【问题标题】:Dask DummyEncoder not returning all the columnsDask DummyEncoder 未返回所有列
【发布时间】:2019-01-22 13:48:42
【问题描述】:

我尝试将 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_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 的行为方式。如果有人能指出一种在熊猫中做同样事情的方法,我们也将不胜感激。

【问题讨论】:

    标签: python pandas dask one-hot-encoding


    【解决方案1】:

    来自 dask 的 DummyEncoder columns 参数文档:

    虚拟编码的列。 必须是分类 dtype
    默认情况下,Dummy 对所有分类 dtype 列进行编码。

    另外,它说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
    

    【讨论】:

    • 我错过了,不知道如何。道歉。
    • @Asif 无需道歉。很高兴我能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    相关资源
    最近更新 更多