toad.transform.WOETransformer WOE编码
toad.transform.WOETransformer 是 toad 库中一个重要的类,特别适用于金融风控、信用评分卡建模等需要特征工程和变量转换的场景。
1. toad.transform.WOETransformer 类概述
toad.transform.WOETransformer 是 toad 库中用于权重证据(WOE)转换的核心类。WOE 是一种用于特征工程的方法,特别适用于处理分类变量和连续变量,以增强模型的预测能力和可解释性。WOE 将特征的每个分箱映射为一个新的数值,表示该分箱相对于目标变量的证据强度。
主要功能
WOE 转换:将特征的分箱结果转换为对应的 WOE 值,提升模型的线性可分性。支持多种分箱策略:结合 Combiner 类,可以灵活地进行特征分箱。信息值(IV)计算:评估特征对目标变量的区分能力。规则管理:支持导出和加载分箱与 WOE 规则,便于模型部署和监控。与其他 toad 模块集成:如与 PSI 计算、特征选择等模块无缝结合,提升特征工程效率。
2. 主要方法详解
1. fit_
fit_(X, y)[source]
描述:拟合 WOETransformer,根据给定的特征数据和目标变量计算 WOE 值。
参数说明:
X (DataFrame | array-like):
描述:需要进行 WOE 转换的特征数据。
y (str | array-like):
描述:目标变量数据或目标变量在 X 中的列名。用于计算 WOE 值时需要目标变量的分布。
select_dtypes (str | numpy.dtypes):
描述:指定要转换的特征类型,如 'object'、'number' 等。只有选定的数据类型的特征会被转换。
返回值:
self:返回拟合后的 WOETransformer 对象,便于链式调用。
2. transform_
transform_(rule, X, default='min')[source]
描述:根据拟合后的分箱与 WOE 规则,将特征数据转换为对应的 WOE 值。
参数说明:
rule (DataFrame | array-like | dict):
描述:分箱与 WOE 的规则,可以是分箱边界、标签或映射关系。
X (array-like):
描述:需要转换的特征数据。
default (str, 默认值 'min'):
描述:处理未知值(如缺失值)的策略。'min' 表示将未知值映射到最小的分箱,'max' 表示映射到最大的分箱。
返回值:
array-like:转换后的 WOE 值。
3. export
export(**kwargs)[source]
描述:导出分箱与 WOE 规则到字典或 JSON 文件,便于规则的保存和共享。
参数说明:
to_json (str | IOBase, 可选):
描述:指定导出为 JSON 文件的路径或文件对象。
返回值:
dict:如果未指定 to_json,返回分箱与 WOE 规则的字典形式。
4. fit
fit(X, *args, update=False, **kwargs)[source]
描述:拟合 WOETransformer,与 fit_ 方法类似,但可能包含更多的内部逻辑或参数处理。
参数说明:
X (array-like | DataFrame):
描述:需要进行 WOE 转换的特征数据。
update (bool, 可选):
描述:是否更新已有的分箱与 WOE 规则。如果为 True,将基于现有规则进行更新;否则,重新拟合。
*args, **kwargs:
描述:其他拟合参数,传递给 fit_ 方法。
返回值:
self:返回拟合后的 WOETransformer 对象。
5. fit_transform
fit_transform(X, y=None, **fit_params)[source]
描述:结合 fit 和 transform 两个步骤,拟合 WOETransformer 并转换数据。
参数说明:
X (array-like | DataFrame):
描述:需要进行 WOE 转换的特征数据。
y (array-like | str, 可选):
描述:目标变量数据或目标变量在 X 中的列名。
**fit_params (dict):
描述:额外的拟合参数,传递给 fit 方法。
返回值:
ndarray:转换后的数据数组,形状为 (n_samples, n_features_new)。
6. load
load(rules, update=False, **kwargs)[source]
描述:从字典或 JSON 文件加载分箱与 WOE 规则,便于规则的复用和共享。
参数说明:
rules (dict, 可选):
描述:分箱与 WOE 规则的字典形式。
from_json (str | IOBase, 可选):
描述:JSON 文件的路径或文件对象,包含分箱与 WOE 规则。
update (bool, 默认值 False):
描述:是否更新已有的分箱与 WOE 规则。如果为 True,将基于现有规则进行更新;否则,替换现有规则。
返回值:
self:返回加载后的 WOETransformer 对象。
7. set_output
set_output(*, transform=None)[source]
描述:设置转换后的输出格式。
参数说明:
transform ({"default", "pandas", "polars"}, default=None):
描述:配置转换后的输出格式。
'default':使用转换器的默认输出格式。'pandas':输出为 Pandas DataFrame。'polars':输出为 Polars DataFrame。None:保持当前配置不变。
返回值:
self:返回配置后的 WOETransformer 对象。
注意:新版本(1.4)增加了 'polars' 选项。
8. transform
transform(X, *args, **kwargs)[source]
描述:将数据根据已拟合的分箱与 WOE 规则进行转换,与 transform_ 方法类似。
参数说明:
X (DataFrame | array-like):
描述:需要转换的特征数据。
*args, **kwargs:
描述:其他转换参数,传递给 transform_ 方法。
返回值:
array-like:转换后的 WOE 值。
9. update
update(*args, **kwargs)[source]
描述:更新分箱与 WOE 规则。
参数说明:
rules (dict, 可选):
描述:分箱与 WOE 规则的字典形式。
from_json (str | IOBase, 可选):
描述:JSON 文件的路径或文件对象,包含分箱与 WOE 规则。
**kwargs:
描述:其他更新参数,传递给 set_rules 方法。
返回值:
self:返回更新后的 WOETransformer 对象。
10. format_bins
classmethod format_bins(bins, index=False, ellipsis=None)[source]
描述:将分箱边界格式化为标签。
参数说明:
bins (ndarray):
描述:分箱边界数组。
index (bool, 默认值 False):
描述:是否在标签前添加索引前缀。
ellipsis (int, 可选):
描述:标签长度阈值,超过此长度的标签将被省略。
返回值:
ndarray:格式化后的分箱标签数组。
11. parse_bins
classmethod parse_bins(bins)[source]
描述:将带标签的分箱边界解析为数组形式。
参数说明:
bins (ndarray):
描述:带标签的分箱边界数组。
返回值:
ndarray:解析后的分箱边界数组。
3. 使用示例
示例背景
假设我们有一个信用评分的数据集,其中包含多个连续型特征(如 income、age)和一个目标变量 target(0 表示非坏账,1 表示坏账)。我们希望通过 WOE 转换提升模型的预测能力,增强对目标变量的区分能力。
示例代码
import pandas as pd
import toad as td
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
# 1. 创建示例数据
data = pd.DataFrame({
'age': [25, 35, 45, 55, 65, 75, 85, 95],
'income': [3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000],
'credit_score': [600, 650, 700, 750, 800, 850, 900, 950],
'target': [0, 0, 1, 0, 1, 1, 0, 1] # 0: 非坏账, 1: 坏账
})
# 2. 初始化 Combiner
combiner = td.transform.Combiner()
# 3. 拟合分箱策略并转换数据
data['income_binned'] = combiner.fit_transform(X=data['income'], y=data['target'], **dict(method='chi', n_bins=4))
# 4. 初始化 WOETransformer,
woe_transformer = td.transform.WOETransformer()
# 5. 拟合 WOETransformer, 选择income_binned特征进行转换
woe_transformer.fit(data[['income_binned', 'target']], y='target')
# 6. 转换数据
data_woe = woe_transformer.transform(data)
# 7. 查看转换结果
print(data_woe)
# 8. 特征选择(可选)
selected_features_data, drop_features = td.selection.select(
frame=data_woe,
target='target',
empty=0.5, # 剔除空值比例超过50%的特征
iv=0.05, # 剔除IV低于0.05的特征
corr=0.8, # 剔除相关性高于0.8的特征
return_drop=True,
exclude=['age'] # 保留 'age' 特征
)
print("保留的特征:", selected_features_data.columns)
print("被剔除的特征:", drop_features)
# 9. 准备训练数据
X = selected_features_data.drop(columns=['target'])
y = selected_features_data['target']
# 10. 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
# 11. 训练逻辑回归模型
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
# 12. 预测概率
y_pred_prob = model.predict_proba(X_test)[:, 1]
# 13. 计算 AUC
auc = roc_auc_score(y_test, y_pred_prob)
print(f'AUC: {auc}')
示例解释
数据准备:
创建一个包含 age、income、credit_score 和 target 的示例数据集。
分箱:
使用 Combiner 类对 income 进行卡方分箱(chi),将 income 分为 4 个箱。使用 fit_transform 方法拟合分箱策略并转换数据,生成新的列 income_binned。
WOE 转换:
初始化 WOETransformer,选择转换的特征(如 income_binned)。使用 fit 方法根据分箱后的数据和目标变量拟合 WOE 转换规则。使用 transform 方法将特征数据转换为对应的 WOE 值,生成新的 DataFrame data_woe。
特征选择(可选):
使用 toad.selection.select 函数根据空值比例、IV 和相关性进行特征选择,保留最具预测能力的特征。
模型训练与评估:
拆分训练集和测试集,训练逻辑回归模型,并计算 AUC 评估模型性能。
示例输出
age income credit_score target income_binned
0 25 3000 600 0 -0.693147
1 35 4000 650 0 -0.693147
2 45 5000 700 1 0.000000
3 55 6000 750 0 0.000000
4 65 7000 800 1 0.693147
5 75 8000 850 1 0.693147
6 85 9000 900 0 0.000000
7 95 10000 950 1 0.000000
保留的特征: Index(['age', 'income', 'target', 'income_binned'], dtype='object')
被剔除的特征: {'empty': array([], dtype=float64), 'iv': array([], dtype=object), 'corr': array(['credit_score'], dtype=object)}
AUC: 1.0
4. 总结
toad.transform.WOETransformer 是 toad 库中一个功能强大且灵活的特征转换工具,专门用于将特征转换为权重证据(WOE)值。通过合理使用 WOETransformer,可以提升模型的线性可分性和预测能力,特别适用于信用评分卡建模和其他金融风控场景。
关键点回顾
WOE 的意义:WOE 值反映了特征分箱相对于目标变量的证据强度,能够提升模型的可解释性和性能。分箱策略多样:支持卡方分箱、等宽分箱、等频分箱和自定义分箱,满足不同业务需求。信息值(IV):用于评估特征对目标变量的区分能力,辅助特征选择。规则管理:支持导出和加载分箱与 WOE 规则,便于模型部署和监控。可视化支持:提供分箱与 WOE 转换结果的可视化工具,帮助直观理解特征转换效果。