自动分箱、计算WOE和IV是数据预处理中常用的技术,可以帮助我们更好地理解数据,提高模型的预测能力。在本攻略中,我们将介绍如何使用Python实现自动分箱、计算WOE和IV的过程。
1. 数据准备
首先,我们需要准备一份数据集。在本攻略中,我们将使用一个名为“credit”的数据集,其中包含了一些客户的个人信息和信用评分。我们的目标是根据这些信息预测客户的信用违约情况。
import pandas as pd
# 读取数据集
data = pd.read_csv('credit.csv')
# 查看数据集的前5行
print(data.head())
2. 自动分箱
接下来,我们将使用Python实现自动分箱的过程。自动分箱是将连续变量离散化的过程,可以将连续变量转换为离散变量,从而更好地理解数据。
import pandas as pd
import numpy as np
sklearn.tree import DecisionTreeClassifier
# 定义自动分箱函数
def auto_bin(data, x, y, n=20, q=0.01, min_samples=100):
"""
自动分箱函数
:param data: 数据集
:param x: 自变量
:param y 因变量
:param n: 分箱数量
:param q: 分箱阈值
:param min_samples: 最小样本数
:return: 分箱结果
"""
# 将数据按照自变量进行排序
data = data[[x, y]].sort_values(x).reset(drop=True)
# 计算每个分位点的值
cut_points = np.arange(0, 1, q)
cut_points = np.unique(np.quantile(data[x], cut_points))
# 如果分位点数量小于分箱数量,则将分箱数量设置为分位点数量
if len(cut_points) < n:
n = len(cut_points)
# 使用决策树进行分箱
clf = DecisionTreeClassifier(max_leaf_nodes=n, min_samples_leaf=min_samples)
clf.fit(data[[x]], data[y])
bins = clf.tree_.threshold[clf.tree_.threshold > -2]
# 如果分箱数量小于预设数量,则将分箱数量设置为实际数量
if len(bins) < n - 1:
n = len(bins) + 1
# 将分箱结果转换为DataFrame格式
bins = np.insert(bins, 0, -np.inf)
bins = np.append(bins, np)
bins = pd.DataFrame({'bin': range(1, len(bins)), 'min': bins[:-1], 'max': bins[1:]})
# 计算每个分箱的WOE和IV值
bins['good'] = data[ysum()
bins['bad'] = data[y].count() - bins['good']
bins['total'] = bins['good'] + bins['bad']
bins['good_pct'] = bins['good'] / bins['good'].sum()
bins['bad_pct'] = bins['bad'] / bins['bad'].sum()
bins['total_pct'] = bins['total'] / bins['total'].sum()
bins['woe'] = np.log(bins['good_pct'] / bins['bad_pct'])
bins['iv'] = (bins['good_pct'] - bins['bad_pct']) * bins['woe']
iv = bins['iv'].sum()
# 返回分箱结果和IV值
return bins,
# 使用自动分箱函数对数据进行分箱
bins, iv = auto_bin(data, 'age', 'default')
# 查看分箱结果
print(bins)
# 查看IV值
print(iv)
3. 计算WOE和IV
接下来,我们将使用Python计算每个分箱的WOE和IV值。WOE(Weight of Evidence)是一种衡量自变量对因变量的影响程度的指标,IV(Information Value)是一种衡量自变量对模型预测能力的影响程度的指标。
import pandas as pd
import numpy as np
#义计算WOE和IV的函数
def calc_woe_iv(data, x, y):
"""
计算WOE和IV值
:param data: 数据集
:param x: 自变量
:param y: 因变量
:return: WOE和IV值
"""
# 计算每个箱的WOE和IV值
bins = data.groupby(x, as_index=False)[y].agg({'good': 'sum', 'bad': lambda x: x.count() - x.sum()})
bins['total'] = bins['good'] + bins['bad']
bins['good_pct'] = bins['good'] / bins['good'].sum()
bins['bad_pct'] = bins['bad'] / bins['bad'].sum()
bins['total_pct'] = bins['total'] / bins['total'].sum()
bins['woe'] = np.log(bins['good_pct'] / bins['bad_pct'])
bins['iv'] = (bins['good_pct'] - bins['bad_pct']) * bins['woe']
iv =['iv'].sum()
# 返回WOE和IV值
return bins, iv
# 使用计算WOE和IV的函数对数据进行计算
bins, iv = calc_woe_iv(data, 'age_bin', 'default')
# 查看分箱结果
print(bins)
# 查看IV值
print(iv)
总结
自动分箱、计算WOE和IV是数据预处理中常用的技术,可以帮助我们更好地理解数据,提高模型的预测能力。在本攻略中,我们介绍了如何使用Python实现自动分箱、计算WOE和IV的过程。这些技术可以应用于各种类型的数据集,帮助我们更好地理解数据,提高模型的预测能力。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python自动分箱,计算woe,iv的实例代码 - Python技术站