为什么 dask_ml.preprocessing.OrdinalEncoder.transform 会产生非有序编码的结果?

问题描述

我对 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 之前,需要将列标识为类别。