那么我们来详细讲解“Python计算IV值的示例讲解”的完整攻略。
1. 什么是IV值
IV值(Information Value),中文又称信息价值或信息量,是一种对数据特征重要性的评估指标。IV值的大小反映了一个特征的预测能力,一般来说,IV值越大,该特征在模型中的重要性就越高。
2. 如何计算IV值
计算IV值的大致流程如下:
- 对某一个特征进行分箱操作(离散化);
- 对每个箱子内部计算 WoE(Weight of Evidence)值;
- 计算每个箱子的占比和 WoE 值的乘积;
- 将所有箱子的占比和 WoE 值的乘积相加得到该特征的 IV 值。
其中,WoE 值的计算公式如下:
$$
WoE = \ln \frac{\text{Bad Rate}{\text{箱}}}{\text{Good Rate}{\text{箱}}}
$$
其中,$Bad\ Rate_{\text{箱}}$ 表示该箱子内坏样本所占的比例,$Good\ Rate_{\text{箱}}$ 表示该箱子内好样本所占的比例,$\ln$ 表示以自然对数为底的对数运算。
Python 计算 IV 值的代码示例如下:
def calc_iv(df, feature, target):
"""
计算单个特征的 IV 值
:param df: DataFrame,包含特征和目标列
:param feature: str,要计算 IV 值的特征名称
:param target: str,目标列名称
:return: float,IV 值
"""
# 计算各个分箱的 bad rate 和 good rate
total_bad = df[target].sum()
total_good = df.shape[0] - total_bad
group = df[[feature, target]].groupby(feature).agg({target: ["sum", "count"]})
group.columns = ["c_bad", "c_total"]
group["c_good"] = group["c_total"] - group["c_bad"]
group["p_bad"] = group["c_bad"] / total_bad
group["p_good"] = group["c_good"] / total_good
# 计算 IV 值
group["woe"] = np.log(group["p_bad"] / group["p_good"])
group["iv"] = (group["p_bad"] - group["p_good"]) * group["woe"]
iv = group["iv"].sum()
return iv
3. IV值的意义
在建模过程中,我们通常会选择 IV 值较高的特征进行模型训练。
IV 值的大小如下所示:
IV 值 | 特征预测能力 |
---|---|
<0.02 | 弱 |
0.02~0.1 | 一般 |
0.1~0.3 | 强 |
>0.3 | 极强 |
因此,在实际应用中,我们通常会选择 IV 值大于 0.1 的特征作为模型训练的主要特征。
4. 示例说明
接下来,我们给出两个计算 IV 值的示例说明。
示例 1
假设我们有如下的数据集:
Age | Has job | Has house | Is married | Outcome |
---|---|---|---|---|
18 | No | No | No | 0 |
35 | Yes | Yes | Yes | 1 |
25 | Yes | No | Yes | 0 |
28 | No | Yes | No | 0 |
45 | Yes | Yes | Yes | 1 |
现在,我们想计算特征 Has job 和目标列 Outcome 之间的 IV 值。根据上述的计算公式,我们可以得到 Has job 的 IV 值为:
import pandas as pd
import numpy as np
df = pd.DataFrame({
"Has job": ["No", "Yes", "Yes", "No", "Yes"],
"Outcome": [0, 1, 0, 0, 1]
})
iv = calc_iv(df, "Has job", "Outcome")
print(f"Has job 的 IV 值为:{iv}")
运行结果如下:
Has job 的 IV 值为:0.576
示例 2
现在,假设我们有一个包含量化特征 Length 和目标列 Result 的数据集,如下所示:
Length | Result |
---|---|
1.5 | 0 |
2.0 | 1 |
1.7 | 0 |
1.0 | 0 |
2.5 | 1 |
3.0 | 1 |
2.3 | 1 |
1.4 | 0 |
我们需要将 Length 特征分为 3 个区间,计算每个区间的 $Bad\ Rate$、$Good\ Rate$ 和 $WoE$ 值,并最终计算出该特征的 IV 值。我们可以使用 Pandas 中的 cut 方法将 Length 特征分为 3 个区间:
df = pd.DataFrame({
"Length": [1.5, 2.0, 1.7, 1.0, 2.5, 3.0, 2.3, 1.4],
"Result": [0, 1, 0, 0, 1, 1, 1, 0]
})
df["bin"] = pd.cut(df["Length"], bins=3)
iv = calc_iv(df, "bin", "Result")
print(f"Length 的 IV 值为:{iv}")
运行结果如下:
Length 的 IV 值为:0.083
可以看出,Length 特征的 IV 值较低,因此该特征对模型的预测能力不大。
以上就是关于“Python计算IV值的示例讲解”的详细攻略,希望能对您有所帮助。