首页 > 解决方案 > 当类别中只有一行时,category_encoders.TargetEncoder 的奇怪输出(python)

问题描述

我正在尝试使用 category_encoders.TargetEncoder 来编码分类特征。我的目标变量是一个连续数字。但是,目标编码器的输出非常奇怪,我无法解释。有人可以给我一个关于正在发生的事情的提示吗?

这是我的玩具代码。

from category_encoders import TargetEncoder

df = pd.DataFrame(['A', 'B', 'C', 'D', 'E', 'F', 'F', 'F', 'G', 'G', 'G'], columns=['cat'])
df['target'] = [921, 921, 3.5, 280, 0, 3.5, 3.5, 3.5, 200, 200, 200]

现在 df 看起来像

    cat target
0   A   921.0
1   B   921.0
2   C   3.5
3   D   280.0
4   E   0.0
5   F   3.5
6   F   3.5
7   F   3.5
8   G   200.0
9   G   200.0
10  G   200.0

然后我将编码器运行为:

encoder = TargetEncoder()
df['encoded'] = encoder.fit_transform(df["cat"], df['target'])

这里是我的输出

    cat target  encoded
0   A   921.0   248.727273
1   B   921.0   248.727273
2   C   3.5     248.727273
3   D   280.0   248.727273
4   E   0.0     248.727273
5   F   3.5     32.731807
6   F   3.5     32.731807
7   F   3.5     32.731807
8   G   200.0   205.808433
9   G   200.0   205.808433
10  G   200.0   205.808433

我不明白的是,对于其中包含 1 个值的类别(例如,类别“A”到“E”),编码器似乎没有区分目标值差异。这是设计使然吗?

标签: pythonpandasmachine-learningencodingfeature-engineering

解决方案


你应该OrdinalEncoder改用。以下是如何做到这一点:

import category_encoders as ce
from sklearn.preprocessing import LabelEncoder
import numpy as np

df = pd.DataFrame(['A', 'B', 'C', 'D', 'E', 'F', 'F', 'F', 'G', 'G', 'G'], columns=['cat'])
df['target'] = [921, 921, 3.5, 280, 0, 3.5, 3.5, 3.5, 200, 200, 200]

现在,您需要LabelEncoder像这样使用:

le = LabelEncoder()
encoded = le.fit_transform(np.ravel('target'))

最后做你想做的

ce_ord = ce.OrdinalEncoder(cols = ['cat'])
df['encoded_cat'] = ce_ord.fit_transform(df['cat'],df['target'])

返回

cat  target  encoded_cat
0    A   921.0            1
1    B   921.0            2
2    C     3.5            3
3    D   280.0            4
4    E     0.0            5
5    F     3.5            6
6    F     3.5            6
7    F     3.5            6
8    G   200.0            7
9    G   200.0            7
10   G   200.0            7

推荐阅读