python - 当类别中只有一行时,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”),编码器似乎没有区分目标值差异。这是设计使然吗?
解决方案
你应该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
推荐阅读
- reactjs - 在 NodeJS 中读取 Firebase 数据库的位置
- android - TypeError:_this2.setState 不是函数,无法绑定状态
- sql - SQL Server - 如何在 CASE THEN 语句中同时使用 null 和 value?
- java - 使用 CardView BaseAdapter OnItemClick 自定义 ListView
- python - Colab 上的 TensorFlow Eager Execution
- ruby-on-rails - 如何检查rails中的参数类型?
- php - 如何为 wordpress 主题添加自定义页眉和页脚
- rest - 如何从 Blazor 应用调用休息服务
- html - 在 HTML 中获取动态换行符
- cmake - 如何将 CTest 与 Node js 命令一起使用,用于测试使用 emscripten 从 C++ 编译的 JS 文件,并使用 Catch2?