类别编码器中的证据权重实际上是如何计算的?

Mat*_*att 2 python preprocessor encoder machine-learning data-science

我正在尝试手动计算 WoE,但无法获得与 Category_encoders WOEEncoder 计算的结果相同的结果。这是我想要计算分数的数据框:

df = pd.DataFrame({'cat': ['a', 'b', 'a', 'b', 'a', 'a', 'b', 'c', 'c'], 'target': [1, 0, 0, 1, 0, 0, 1, 1, 0]})
Run Code Online (Sandbox Code Playgroud)

这是我用来计算 WoE 分数的代码

woe = WOEEncoder(cols=['cat'], random_state=42)
X = df['cat']
y = df.target
encoded_df = woe.fit_transform(X, y)
Run Code Online (Sandbox Code Playgroud)

相同的结果是:

0   -0.538997
1   0.559616
2   -0.538997
3   0.559616
4   -0.538997
5   -0.538997
6   0.559616
7   0.154151
8   0.154151
Run Code Online (Sandbox Code Playgroud)

因此,'a' 被编码为 -0.538997 'b' 被编码为 0.559616 'c' 被编码为 0.154151

当我手工计算分数时,它们是不同的,我取

ln(% of non events / % of events).
Run Code Online (Sandbox Code Playgroud)

例如,为了计算 a 的 WoE,

% of non events = targets which are 0 for 'a'/ total targets for group 'a'
Run Code Online (Sandbox Code Playgroud)

因此,非事件百分比 = 3/4 = 0.75

% of events = targets which are 1 for 'a' / total targets for group 'a'
Run Code Online (Sandbox Code Playgroud)
So, % of events = 1/4 = 0.25

Now, 0.75/0.25 = 3

Run Code Online (Sandbox Code Playgroud)

因此,WoE(a) = ln(3) = 1.09,这与上面的编码器不同。

lbc*_*mer 5

由于它是一个开源项目,所以可以看到该函数的代码:

http://contrib.scikit-learn.org/category_encoders/_modules/category_encoders/woe.html#WOEEncoder

要获得与 WOEEncoder 类似的结果,您的代码中存在两个主要问题:

  1. WOEEncoder 有一个参数“正则化”,默认值为 1。您应该创建一个正则化 = 0 的 WOEEncoder 对象以获得相同的结果

  2. 第二个问题是你对痛苦公式的解释错误。对于“a”的情况,正确的一个(在 WOEEncoder 中实现)是:

    非事件的百分比 = 'a' 为 0 的目标 / 为 0 的目标总数

    事件百分比 = 'a' 为 1 的目标 / 为 1 的目标总数

    欠 = ln(事件百分比/非事件百分比)

对于“a”的情况,会产生:

% of non events = 3/5
% of events = 1/4

ln(% of events / % of non events ) = ln(5/12) = -0.8754687373538999
Run Code Online (Sandbox Code Playgroud)

如果执行修改后的代码:

woe = WOEEncoder(cols=['cat'], random_state=42, regularization=0)
X = df['cat']
y = df.target
encoded_df = woe.fit_transform(X, y)
Run Code Online (Sandbox Code Playgroud)

你会看到类似的结果:

0   -0.875469
1   0.916291
2   -0.875469
3   0.916291
4   -0.875469
5   -0.875469
6   0.916291
7   0.223144
8   0.223144
Run Code Online (Sandbox Code Playgroud)