toad.transform.WOETransformer WOE编码

2025-12-03 18:46:55

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 转换结果的可视化工具,帮助直观理解特征转换效果。