类别编码器中的证据权重实际上是如何计算的?
How is Weight of Evidence actually calculated in category encoders?
我正在尝试手动计算 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]})
这是我用来计算 WoE 分数的代码
woe = WOEEncoder(cols=['cat'], random_state=42)
X = df['cat']
y = df.target
encoded_df = woe.fit_transform(X, y)
相同的结果是:
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
所以,
'a' 编码为 -0.538997
'b' 编码为 0.559616
'c' 编码为 0.154151
当我手算分数时,它们是不同的,我取
ln(% of non events / % of events).
比如说,为了计算a的WoE,
% of non events = targets which are 0 for 'a'/ total targets for group 'a'
因此,非事件的百分比 = 3/4 = 0.75
% of events = targets which are 1 for 'a' / total targets for group 'a'
So, % of events = 1/4 = 0.25
Now, 0.75/0.25 = 3
因此,WoE(a) = ln(3) = 1.09 与上述编码器不同
由于是开源项目,可以查看功能代码:
http://contrib.scikit-learn.org/category_encoders/_modules/category_encoders/woe.html#WOEEncoder
要获得与 WOEEncoder 类似的结果,您的代码中存在两个主要问题:
WOEEncoder 有一个参数'regularization',默认值为 1。您应该创建一个正则化为 0 的 WOEEncoder 对象以获得相同的结果
第二个问题是你对woe公式的理解有误。
对于 'a':
的情况,正确的(在 WOEEEncoder 中实现)是
% 的非事件 = '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
如果执行修改后的代码:
woe = WOEEncoder(cols=['cat'], random_state=42, regularization=0)
X = df['cat']
y = df.target
encoded_df = woe.fit_transform(X, y)
您将看到类似的结果:
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
我正在尝试手动计算 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]})
这是我用来计算 WoE 分数的代码
woe = WOEEncoder(cols=['cat'], random_state=42)
X = df['cat']
y = df.target
encoded_df = woe.fit_transform(X, y)
相同的结果是:
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
所以, 'a' 编码为 -0.538997 'b' 编码为 0.559616 'c' 编码为 0.154151
当我手算分数时,它们是不同的,我取
ln(% of non events / % of events).
比如说,为了计算a的WoE,
% of non events = targets which are 0 for 'a'/ total targets for group 'a'
因此,非事件的百分比 = 3/4 = 0.75
% of events = targets which are 1 for 'a' / total targets for group 'a'
So, % of events = 1/4 = 0.25
Now, 0.75/0.25 = 3
因此,WoE(a) = ln(3) = 1.09 与上述编码器不同
由于是开源项目,可以查看功能代码:
http://contrib.scikit-learn.org/category_encoders/_modules/category_encoders/woe.html#WOEEncoder
要获得与 WOEEncoder 类似的结果,您的代码中存在两个主要问题:
WOEEncoder 有一个参数'regularization',默认值为 1。您应该创建一个正则化为 0 的 WOEEncoder 对象以获得相同的结果
第二个问题是你对woe公式的理解有误。 对于 'a':
的情况,正确的(在 WOEEEncoder 中实现)是% 的非事件 = '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
如果执行修改后的代码:
woe = WOEEncoder(cols=['cat'], random_state=42, regularization=0)
X = df['cat']
y = df.target
encoded_df = woe.fit_transform(X, y)
您将看到类似的结果:
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