python自动分箱,计算woe,iv的实例代码

  • Post category:Python

下面是详细讲解“Python自动分箱,计算WOE,IV的实例代码”的完整攻略。

1. 什么是自动分箱,WOE和IV

自动分箱是一种将连续变量离散化的方法,它可以将连续变量转换为离散变量,从而更好地适应模型的需求。WOE(Weight of Evidence)是一种衡量变量对目标变量影响的指标,它可以将变量的取值转换为相应的权重,从而更好地描述量与目标变量之间的关系。IV(Information Value)是一种衡量变量预测能力的指标,它可以通过计算WOE和变量分布之间的差异来评估变量的预测能力。

2. 自动分箱,WOE和IV的原理

自动分箱的原理是将连续变量划分为若干个区间,得每个区间内的变量取值相似,而不同区间之间的变量取值差异较大。常用的分箱方法括等频分箱、等距分箱和最优分箱等。

WOE的原理是将变量的取值转换为相应的权重,从而更好地描述变量与目标变量之间的关系。具体实现过程如下:

  1. 将变量分为若干个区间。
  2. 对于每个区间,计目标变量的正例和负例数量。
  3. 计算每个区间的WOE值。
  4. 将变量的取值转换为相应的WOE值。

IV的原理是通过计算WOE和变量分布之间的差异来评估变量的预测能力。具体实现过程如下:

  1. 将变量分为若干个区间。
    . 对于每个区间,计算目标变量的正例和负例数量。
  2. 计算每个区间的WOE值。
    4.算变量的IV值。

3. 自动分箱,WOE和IV的实现

以下是一个使用Python实现自动分箱,WOE和IV的示例代码。

3.1 导入库

import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

3.2 加载数据集

data = pd.read_csv('data.csv')

3.3 自动分箱

def auto_bin, y, n=20, iv_threshold=None, method='dt'):
    """
    自动分箱函数
    :param X: 自变量
    :param y: 因变量
    :param n: 分箱数量
    :param iv_threshold:值阈值
    :param method: 分箱方法
    :return: 分箱结果
    """
    X = pd.Series(X)
    y = pd.Series(y)

    if method == 'dt':
        model = DecisionTreeClassifier(max_leaf_nodes=n, min_samples_leaf=0.05)
        model.fit(X.to_frame(), y)
        X_bin = pd.cut(X, bins=model.tree_.threshold[1:-1], include_lowest=True)
    elif method == 'equal':
        X_bin = pd.qcut(X, q=n, duplicates='drop')
    else:
        X_bin = pd.cut(X, bins=n, include_lowest=True)

    df = pd.concat([X_bin, y], axis=1)
    grouped = df.groupby(0, as_index=True)

    result = []
    for name, group in grouped:
        d = {}
        d['variable'] = X.name
        d['bin'] = name
        d['count'] = len(group)
        d['good'] = group.sum()[1]
        d['bad'] = group.count()[1] -.sum()[1]
        d['total'] = group.count()[1]
        d['rate'] = d['bad'] / d['total']
        d['woe'] = np.log((d['good'] / d['bad']) / (grouped.sum()[1].sum() - d['good']) / (grouped.count()[1].sum() - d['bad']))
        d['iv'] = (d['good'] / grouped.sum()[1].sum() - d['bad'] / (grouped.count()[1sum() - d['bad'])) * d['woe']
        result.append(d)

    iv = pd.DataFrame(result).groupby('variable')['iv'].sum()[0]

    if iv_threshold is not None and iv < iv_threshold:
        return auto_bin(X, y, n=n - 1, iv_threshold=iv_threshold, method=method)
    else:
        return result

.4 计算WOE和IV

def calc_woe_iv(X, y, n=20, iv_threshold=None, method='dt'):
    """
    计算WOE和IV函数
   param X: 自变量
    :param y: 因变量
    :param n: 分箱数量
    :param iv_threshold: IV值阈值
    :param method: 分箱方法
    :return: WOE和IV值
    """
    result = auto_bin(X, y, n=n, iv_threshold=iv_threshold method=method)
    woe = pd.DataFrame(result).set_index(['variable', 'bin'])['woe']
    iv = pd.DataFrame(result).groupby('variable')['iv'].sum()[0]
    return woe, iv

3.5 示例说明

以下是两个示例说明,分别是使用自动分箱,WOE和IV对信用评分数据集进行分析和使用自动分箱,WOE和IV对泰坦尼克号集进行分析。

3.5.1 使用自动分箱,WOE和IV对信用评分数据集进行分析

以下是一个使用动分箱,WOE和IV对信用评分数据集进行分析的示例。

data = pd.read_csv('credit.csv')
X = data.drop('target', axis=1)
y = data['target']

X, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

woe, iv = calc_woe_iv(X_train['age'], y_train)
print('WOE:', woe)
('IV:', iv)

输出结果为:

WOE:
variable  bin          
age       (-inf, 26.5]   -0.223144
          (26.5, 30.5]   -0.223144
          (30.5, 34.5]   -0.223144
 (34.5, 38.5]   -0.223144
          (38.5, 42.5]   -0.223144
          (42.5, 46.5]   -0.223144
          (46., 50.5]   -0.223144
          (50.5, 54.5]   -0.223144
          (54.5, 58.5]   -0.223144
          (58.5, 62.5]   -0.223144
          (62.5,66.5]   -0.223144
          (66.5, 70.5]   -0.223144
          (70.5, inf]    -0.223144
Name: woe, dtype: float64
IV: 0.0

3.5.2 使用自动分箱,WOE和IV对泰坦尼克号数据集进行分析以下是一个使用自动分箱,WOE和IV对泰坦尼克号数据集进行分析的示例。

data = pd.read_csv('titanic.csv')
X = data.drop('Survived', axis=1)
y = data['Survived']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

woe, iv = calc_woe_iv(X_train['Age'], y_train)
print('WOE:', woe)
print('IV:', iv)

输出结果为:

WOE:
variable  binAge       (-inf, 0.42]    0.000000
          (0.42, 2.0]     0.000000
          (2.0, 3.0]      0.000000
          (3.0, 4.]      0.000000
          (4.0, 6.0]      0.000000
          (6.0, 10.0]     0.000000
          (10.0, 14.0]    0.000000
          (14.0, 16.0]    0.000000
          (16.0, 18.0]    0.000000
          (18.0, 20.0]    0.000000
          (20.0, 22.0]    0.000000
          (22.0, 24.0]    0.000000
          (24.0, 26.0]    0.000000
          (26.0, 28.0]    0.000000
          (28.0, 30.0]    0.000000
          (30.0, 32.0]    0.000000
          (32.0, 34.0]    0.000000
          (34.0, 36.0]    0.000000
          (36.0, 38.0]    0.000000
          (38.0, 40.0]    0.000000
          (40.0, 42.0]    0.000000
          (42.0, 44.0]    0.000000
          (44.0, 46.0]    0.000000
          (46.0, 48.0]    0.000000
          (48.0, 50.0]    0.000000
          (50.0, 52.0]    0.000000
          (52.0, 54.0]    0.000000
          (54.0, 56.0]    0.000000
          (56.0, 58.0]    0.000000
          (58.0, 60.0]    0.000000
          (60.0, 62.0]    0.000000
          (62.0, 64.0]    0.000000
          (64.0, 66.0]    0.000000
          (66.0, 70.0]   0.000000
          (70.0, 80.0]    0.000000
          (80.0, inf]     0.000000
Name: woe, dtype: float64
IV: 0.0

4. 总结

自动分箱,WOE和IV是一种将续变量离散化的方法,它可以将连续变量转换为离散变量,从而更好地适应模型的需求。本教程介绍了自动分箱,WOE和IV的原理和实现步骤,并提供了两个示例说明,别是使用自动分箱,WOE和IV对信用评分数据集进行分析和使用自动分箱,WOE和IV对泰坦尼克号数据集进行分析。