问题描述
我对 dask_ml.preprocessing.OrdinalEncoder.transform 的结果感到困惑:
from sklearn.preprocessing import OrdinalEncoder
from dask_ml.preprocessing import OrdinalEncoder as daskOrdinalEncoder
import numpy as np
import pandas as pd
N = 10
np.random.seed(1234)
df = pd.DataFrame({
"cat1": np.random.choice(list(string.ascii_uppercase)[0:3],size=N),"cat2": np.random.choice(list(string.ascii_uppercase)[0:3],})
df_dd = dd.from_pandas(df,npartitions=3)
原始的 OrdinalEncoder.transform 返回一个 numpy.ndarray(带有数值):
>>> OrdinalEncoder().fit_transform(df)
array([[2.,2.],[1.,0.],[0.,[2.,1.]])
dask-ml 对应物不仅通过返回一个 pandas.DataFrame 来破坏接口,它还简单地返回初始输入数据帧:
>>> daskOrdinalEncoder().fit_transform(df_dd).compute().equals(df)
True
我期望的是一个(Pandas 或 dask)DataFrame 或一个(Numpy 或 dask)数组,其中包含类似于 sklearn OrdinalEncoder 产生的数值。
解决方法
df_dd = df_dd.categorize(columns=["cat1","cat2"])
在应用 OrdinalEncoder 之前,需要将列标识为类别。