WOE编码
WOE(weight of evidence, 证据权重)编码属于有监督编码方式,将预测类别的集中度的属性作为编码的数值。
优点:
①将特征的值规范到相近的尺度上;
②经验上讲,WOE的绝对值波动范围在0.1~3之间;
③具有业务含义。
缺点:
需要每箱中同时包含好、坏两个类别。
WOE计算公式:
好 | 坏 | 好百分比 | 坏百分比 | |
---|---|---|---|---|
组1 | G1 | B1 | G1/G | B1/B |
组2 | G2 | B2 | G2/G | B2/B |
··· | ··· | ··· | ··· | ··· |
组N | GN | BN | GN/G | BN/B |
合计 | G = ∑ G i \bm G=\sum G_i G=∑Gi | B = ∑ B i \bm B=\sum B_i B=∑Bi |
W
O
E
i
=
l
o
g
(
G
i
/
G
B
i
/
B
)
WOE_i=log(\frac{G_i/\bm G}{B_i/\bm B})
WOEi=log(Bi/BGi/G)
调用示例
import category_encoders as encoders
enc = encoders.WOEEncoder()
X = ['a', 'a', 'b', 'b']
y = [1, 0, 0, 0]
result = enc.fit_transform(X, y)
print(result)
输出
0
0 0.510826
1 0.510826
2 -0.587787
3 -0.587787
对连续变量编码前,应进行分箱操作。woe值反映的是自变量每个分组下违约用户对正常用户占比和总体中违约用户对正常用户占比之间的差异,从而可以直观地认为woe值蕴含了自变量取值对目标变量(违约概率)的影响。
IV(information value, 信息值)
IV(information value, 信息值),可用于表示变量预测能力的强度。
第i个分组的IV计算公式:
I
V
i
=
(
G
i
/
G
−
B
i
/
B
)
∗
W
O
E
i
=
(
G
i
/
G
−
B
i
/
B
)
∗
l
o
g
(
G
i
/
G
B
i
/
B
)
IV_i=(G_i/\bm G-B_i/\bm B)\ast WOE_i =(G_i/\bm G-B_i/\bm B)\ast log(\frac{G_i/\bm G}{B_i/\bm B})
IVi=(Gi/G−Bi/B)∗WOEi=(Gi/G−Bi/B)∗log(Bi/BGi/G)
整个变量的IV计算公式:
I
V
=
∑
i
n
I
V
i
IV=\sum_i^n{IV_i}
IV=∑inIVi
Target编码
目标编码不仅基于特征值自身,还基于相应因变量的类别变量编码方法。
对于分类问题:将类别特征替换为给定某一特定类别值的因变量后验概率与所有训练数据上因变量的先验概率的组合。
对于连续目标:将类别特征替换为给定某一特定类别值的因变量目标期望值与所有训练数据上因变量的目标期望值的组合。
该方法严重依赖于因变量的分布,但是大大减少了生成编码后的特征数量。
主要计算公式:
s
m
o
o
v
e
=
1
1
+
e
x
p
(
−
n
−
m
i
n
_
s
a
m
p
l
e
s
_
l
e
a
f
s
m
o
o
t
h
i
n
g
)
smoove=\frac{1}{1+exp(-\frac{n-min\_samples\_leaf}{smoothing})}
smoove=1+exp(−smoothingn−min_samples_leaf)1
X
k
′
=
P
r
i
o
r
_
P
r
o
b
∗
(
1
−
s
m
o
o
v
e
)
+
s
m
o
o
v
e
∗
C
o
n
d
i
t
i
o
n
_
P
r
o
b
X'_k=Prior\_Prob\ast(1-smoove)+smoove\ast Condition\_Prob
Xk′=Prior_Prob∗(1−smoove)+smoove∗Condition_Prob
C
o
n
d
i
t
i
o
n
P
r
o
b
=
n
+
n
Condition_Prob=\frac{n^+}{n}
ConditionProb=nn+
min_samples_leaf:自定义,默认值是1.0,计算类别平均值时的最小样本数(即若该类别出现次数少,则将被忽略),用来控制过拟合;
smoothing:自定义,默认值是1.0,平衡分类平均值和先验平均值的平滑系数。值越高代表正则化越强;
X’k:类别特征X中类别为k的编码值;
Prior_Prob:目标变量的先验概率/期望;
n:类别特征X中,类别为k的样本数;
n+:不仅在类别特征X中具有类别k,而且具有正结果的样本数(分类问题)。
调用示例
import numpy as np
import pandas as pd
# category_encoders直接支持dataframe
import category_encoders as encoders
# 随机生成一些训练集
train_set = pd.DataFrame(np.array([['male', 10], ['female', 20],
['male', 10], ['female', 20],
['female', 15]]),
columns=['Sex', 'Type'])
train_y = np.array([False, True, True, False, False])
# 随机生成一些测试集,并有意包含未在训练集中出现过的类别与缺失值
test_set = pd.DataFrame(np.array([['female', 20], ['male', 20],
['others', 15], ['male', 20],
['female', 40], ['male', 25]]),
columns=['Sex', 'Type'])
test_set.loc[4, 'Type'] = np.nan
# 在训练集上训练
# handle_unknown和handle_missing仅接受'error', 'return_nan', 'value'
# 两者的默认值都为'value',表示对未知类别或缺失值填充训练集的因变量的平均值
encoder = encoders.TargetEncoder(cols=['Sex', 'Type'],
handle_unknown='value',
handle_missing='value').fit(train_set, train_y)
# 转换训练集
encoder_train = encoder.transform(train_set)
# 转换测试集
encoder_test = encoder.transform(test_set)
print(train_set)
print(train_y)
print(test_set)
print(encoder_train)
print(encoder_test)
输出
Sex Type
0 male 10
1 female 20
2 male 10
3 female 20
4 female 15
[False True True False False]
Sex Type
0 female 20
1 male 20
2 others 15
3 male 20
4 female NaN
5 male 25
Sex Type
0 0.473106 0.473106
1 0.341280 0.473106
2 0.473106 0.473106
3 0.341280 0.473106
4 0.341280 0.400000
Sex Type
0 0.341280 0.473106
1 0.473106 0.473106
2 0.400000 0.400000
3 0.473106 0.473106
4 0.341280 0.400000
5 0.473106 0.400000
参考博客:sklearn中多种编码方式