OneHotEncoder returns 意外结果

OneHotEncoder returns unexpected result

我有一个数组,如下所示:

[['Team A', 'Team B', 5000]
['Team C', 'Team D', 4000]]

使用这个 OneHotEncoder 来转换团队名称

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

ct = ColumnTransformer(
    transformers=[(
        'encoder',
        OneHotEncoder(),
        [0, 1]
    )],
    remainder='passthrough'
)

X = np.array(
    ct.fit_transform(X)
)

我希望 X 是这样的:

[[1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 5000]
[0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 4000]]

然而,当我打印出来时它看起来更像这样:

(0, 12) 1.0
(0, 17) 1.0
(0, 28) 5000.0
(1, 5)  1.0
(1, 25) 1.0
(1, 28) 4000.0

在这种情况下我错过了什么?如果我在开始时在 X 变量中包含更多列,我会得到预期的结果:

[['Team A' 'Team B' 2 0 1 0.0 0.0 0 1 2 0.0 1.0 5000]
 ['Team C' 'Team D' 2 3 0 nan nan 2 1 1 nan nan 4000]]

我不明白在这些情况下有什么不同?为什么当只有其他列发生变化时,我在同一列上得到不同的结果?

无法用您发布的示例数据重现该问题;对于

[['Team A', 'Team B', 5000]
['Team C', 'Team D', 4000]]

我得到 X

array([[1.0, 0.0, 1.0, 0.0, 5000],
       [0.0, 1.0, 0.0, 1.0, 4000]], dtype=object)

不过,最有可能的问题是 OneHoteEncoder 的默认设置 sparse=True(参见 docs)——您最终得到的表示看起来像一个稀疏的表示。如果您不想那样,请将 ColumnTransformer 中的 OneHotEncoder() 定义更改为 OneHotEncoder(sparse=False)(我无法重现它的原因可能是样本数据集太小,并且在这种情况下,稀疏表示根本不会起作用。