下面是详细讲解“Python自动分箱,计算WOE,IV的实例代码”的完整攻略。
1. 什么是自动分箱,WOE和IV
自动分箱是一种将连续变量离散化的方法,它可以将连续变量转换为离散变量,从而更好地适应模型的需求。WOE(Weight of Evidence)是一种衡量变量对目标变量影响的指标,它可以将变量的取值转换为相应的权重,从而更好地描述量与目标变量之间的关系。IV(Information Value)是一种衡量变量预测能力的指标,它可以通过计算WOE和变量分布之间的差异来评估变量的预测能力。
2. 自动分箱,WOE和IV的原理
自动分箱的原理是将连续变量划分为若干个区间,得每个区间内的变量取值相似,而不同区间之间的变量取值差异较大。常用的分箱方法括等频分箱、等距分箱和最优分箱等。
WOE的原理是将变量的取值转换为相应的权重,从而更好地描述变量与目标变量之间的关系。具体实现过程如下:
- 将变量分为若干个区间。
- 对于每个区间,计目标变量的正例和负例数量。
- 计算每个区间的WOE值。
- 将变量的取值转换为相应的WOE值。
IV的原理是通过计算WOE和变量分布之间的差异来评估变量的预测能力。具体实现过程如下:
- 将变量分为若干个区间。
. 对于每个区间,计算目标变量的正例和负例数量。 - 计算每个区间的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对泰坦尼克号数据集进行分析。