0

我对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], size=N),
})
df_dd = dd.from_pandas(df, npartitions=3)

原始 OrdinalEncoder.transform 返回一个 numpy.ndarray (带有数值):

>>> OrdinalEncoder().fit_transform(df)
array([[2., 2.],
       [1., 0.],
       [0., 0.],
       [0., 2.],
       [0., 2.],
       [1., 2.],
       [1., 0.],
       [1., 0.],
       [2., 0.],
       [2., 1.]])

dask-ml 对应项不仅通过返回 pandas.DataFrame 来破坏接口,它还简单地返回初始输入 DataFrame:

>>> DaskOrdinalEncoder().fit_transform(df_dd).compute().equals(df)
True

我期望的是一个(Pandas 或 Dask)DataFrame 或一个(Numpy 或 Dask)数组,其中包含类似于 sklearn OrdinalEncoder 产生的数值。

4

1 回答 1

1
df_dd = df_dd.categorize(columns=["cat1", "cat2"])

在应用 OrdinalEncoder 之前,需要将列标识为类别。

注意:这里的 Dask ML 文档对此进行了解释。需要知道转换后的 Dask DataFrame 的形状。使用Categorical数据样式可以做到这一点。但是,如果您只是将数据保留为字符串,则情况并非如此。为什么形状很重要?Dask DataFrame ( df_dd) 需要该形状来了解将在转换后的数据中生成的列数,因为 Dask DataFrame 的所有分区必须具有相同的列数。如果我们只使用str数据类型,那么根据输出,Dask 不知道转换后期望有多少列。但是,如果您指定dtype,Categorical则 Dask 确切知道将生成哪些类别(列编码)。使用示例管道OneHotEncoder更详细的解释也可以在 Dask ML 文档中找到。类似的推理适用于OrdinalEncoder

于 2021-05-07T16:10:14.060 回答