Asi*_*Ali 3 python pandas dask one-hot-encoding
我尝试对我的数据使用 dask DummyEncoderOneHotEncoding。但结果并不如预期。
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)
Run Code Online (Sandbox Code Playgroud)
输出:
B_a
0 1
1 1
Run Code Online (Sandbox Code Playgroud)
为什么不显示B_b,B_c?但是当我将其更改testD为:
testD = pd.DataFrame({'B': ['a','a', 'b', 'c']})
Run Code Online (Sandbox Code Playgroud)
结果是:
B_a B_b B_c
0 1 0 0
1 1 0 0
2 0 1 0
3 0 0 1
Run Code Online (Sandbox Code Playgroud)
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_)
Run Code Online (Sandbox Code Playgroud)
输出:
1 2 3
0 0.0 1.0 0.0
1 0.0 1.0 0.0
Run Code Online (Sandbox Code Playgroud)
我如何获得相同的结果?我想要这种方式的原因是因为我将对列的子集进行编码,然后将结果 encoding_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
Run Code Online (Sandbox Code Playgroud)
预期输出:
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
Run Code Online (Sandbox Code Playgroud)
编辑:
由于 dask 在内部使用 Pandas,我相信它使用get_dummies. 这DummyEncoder就是行为方式。如果有人能指出在熊猫中做同样的事情的方法,也将不胜感激。
来自 dask 的DummyEncoder columns参数文档:
要虚拟编码的列。必须是分类 dtype。
默认情况下,虚拟对所有分类 dtype 列进行编码。
此外,它在这里说在使用某些编码器(包括)之前必须始终使用 a 。CategorizerDummyEncoder
一个正确的方法来做到这一点:
from dask_ml.preprocessing import Categorizer, DummyEncoder
from sklearn.pipeline import make_pipeline
pipe = make_pipeline(
Categorizer(), DummyEncoder())
pipe.fit(data)
pipe.transform(testD)
Run Code Online (Sandbox Code Playgroud)
这将输出:
B_a B_b B_c
0 1 0 0
1 1 0 0
Run Code Online (Sandbox Code Playgroud)