Python计算IV值的示例讲解

  • Post category:Python

那么我们来详细讲解“Python计算IV值的示例讲解”的完整攻略。

1. 什么是IV值

IV值(Information Value),中文又称信息价值或信息量,是一种对数据特征重要性的评估指标。IV值的大小反映了一个特征的预测能力,一般来说,IV值越大,该特征在模型中的重要性就越高。

2. 如何计算IV值

计算IV值的大致流程如下:

  1. 对某一个特征进行分箱操作(离散化);
  2. 对每个箱子内部计算 WoE(Weight of Evidence)值;
  3. 计算每个箱子的占比和 WoE 值的乘积;
  4. 将所有箱子的占比和 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值的示例讲解”的详细攻略,希望能对您有所帮助。