API 文档
Yihuier 提供简洁易用的 Python API,涵盖评分卡建模的完整流程。
核心类
Yihuier
主类,用于初始化评分卡建模项目并管理所有功能模块。
初始化
from yihuier import Yihuier
yh = Yihuier(data, target='dlq_flag')参数:
data(pd.DataFrame): 输入数据集target(str): 目标变量列名
属性:
data(pd.DataFrame): 数据集target(str): 目标变量名eda_module(EDAModule): 数据探索模块dp_module(DataProcessingModule): 数据预处理模块cluster_module(ClusterModule): 聚类分析模块binning_module(BinningModule): 分箱模块var_select_module(VarSelectModule): 变量选择模块me_module(ModelEvaluationModule): 模型评估模块si_module(ScorecardImplementModule): 评分卡实现模块pipeline_module(PipelineModule): 流水线模块
方法
get_numeric_variables()
获取数值型变量列表。
numeric_vars = yh.get_numeric_variables()
# ['v1', 'v2', 'v3', ...]返回: list[str] - 数值型变量列名列表
get_categorical_variables()
获取类别型变量列表。
categorical_vars = yh.get_categorical_variables()
# ['category1', 'category2', ...]返回: list[str] - 类别型变量列名列表
get_date_variables()
获取日期型变量列表。
date_vars = yh.get_date_variables()
# ['date1', 'date2', ...]返回: list[str] - 日期型变量列名列表
数据预处理模块
DataProcessingModule
数据预处理模块,提供缺失值处理、常变量删除等功能。
fillna_num_var()
填充数值型变量的缺失值。
yh.data = yh.dp_module.fillna_num_var(
col_list=['v1', 'v2', 'v3'],
fill_type='0'
)参数:
col_list(list[str]): 变量列表fill_type(str): 填充类型'0': 填充 0'mean': 填充均值'median': 填充中位数'class': 填充特殊类别(-999)
返回: pd.DataFrame - 填充后的数据集
fillna_cate_var()
填充类别型变量的缺失值。
yh.data = yh.dp_module.fillna_cate_var(
col_list=['category1', 'category2'],
fill_type='mode'
)参数:
col_list(list[str]): 变量列表fill_type(str): 填充类型'mode': 填充众数'class': 填充特殊类别('Unknown')
返回: pd.DataFrame - 填充后的数据集
delete_missing_var()
删除高缺失率变量。
yh.data = yh.dp_module.delete_missing_var(threshold=0.2)参数:
threshold(float): 缺失率阈值(0-1)
返回: pd.DataFrame - 删除后的数据集
const_delete()
删除常变量/同值化严重的变量。
yh.data = yh.dp_module.const_delete(threshold=0.9)参数:
threshold(float): 同值化阈值(0-1)
返回: pd.DataFrame - 删除后的数据集
target_missing_delete()
删除目标变量缺失的样本。
yh.data = yh.dp_module.target_missing_delete()返回: pd.DataFrame - 删除后的数据集
分箱模块
BinningModule
变量分箱模块,支持多种分箱方法和 WOE 转换。
binning_num()
数值型变量分箱。
bin_df, iv_value = yh.binning_module.binning_num(
col_list=['v1', 'v2', 'v3'],
max_bin=5,
method='ChiMerge',
min_binpct=0.05
)参数:
col_list(list[str]): 变量列表max_bin(int): 最大分箱数(默认 10)min_binpct(float): 最小分箱占比(默认 0)method(str): 分箱方法'ChiMerge': 卡方分箱(默认)'freq': 等频分箱'count': 等距分箱'monotonic': 单调性分箱
返回:
bin_df(list): 分箱结果列表iv_value(list): IV 值列表
binning_cate()
类别型变量分箱。
bin_df, iv_value, ks_value = yh.binning_module.binning_cate(
col_list=['category1', 'category2']
)参数:
col_list(list[str]): 变量列表
返回:
bin_df(list): 分箱结果列表iv_value(list): IV 值列表ks_value(list): KS 值列表
woe_df_concat()
拼接所有 WOE 结果表。
woe_df = yh.binning_module.woe_df_concat()返回: pd.DataFrame - WOE 结果表
woe_transform()
WOE 转换。
data_woe = yh.binning_module.woe_transform()返回: pd.DataFrame - WOE 转换后的数据集
变量选择模块
VarSelectModule
变量选择模块,提供多种变量选择策略。
select_xgboost()
基于 XGBoost 特征重要性选择变量。
xg_imp, xg_rank, xg_cols = yh.var_select_module.select_xgboost(
col_list=['v1', 'v2', 'v3', 'v4', 'v5'],
imp_num=3
)参数:
col_list(list[str]): 候选变量列表imp_num(int): 选择的变量数量
返回:
xg_imp(pd.DataFrame): 所有变量的特征重要性xg_rank(pd.DataFrame): 选中变量的特征重要性xg_cols(list[str]): 选中的变量列表
select_rf()
基于随机森林特征重要性选择变量。
rf_imp, rf_cols = yh.var_select_module.select_rf(
col_list=['v1', 'v2', 'v3', 'v4', 'v5'],
imp_num=3
)参数:
col_list(list[str]): 候选变量列表imp_num(int): 选择的变量数量
返回:
rf_imp(pd.DataFrame): 所有变量的特征重要性rf_cols(list[str]): 选中的变量列表
forward_delete_corr_ivfirst()
考虑 IV 值的相关变量删除。
final_vars = yh.var_select_module.forward_delete_corr_ivfirst(
col_list=['v1', 'v2', 'v3', 'v4'],
threshold=0.6
)参数:
col_list(list[str]): 候选变量列表threshold(float): 相关系数阈值
返回: list[str] - 筛选后的变量列表
forward_delete_corr_impfirst()
考虑特征重要性的相关变量删除。
final_vars = yh.var_select_module.forward_delete_corr_impfirst(
col_list=['v1', 'v2', 'v3', 'v4'],
type='xgboost',
threshold=0.6
)参数:
col_list(list[str]): 候选变量列表type(str): 特征重要性类型('xgboost' 或 'rf')threshold(float): 相关系数阈值
返回: list[str] - 筛选后的变量列表
plot_corr()
绘制相关性热力图。
yh.var_select_module.plot_corr(
col_list=['v1', 'v2', 'v3'],
threshold=0.6,
plt_size=(10, 8)
)模型评估模块
ModelEvaluationModule
模型评估模块,提供全面的模型性能评估。
plot_roc()
绘制 ROC 曲线。
yh.me_module.plot_roc(y_test, y_pred)参数:
y_label(np.ndarray): 真实标签y_pred(np.ndarray): 预测概率
plot_model_ks()
绘制 KS 曲线。
yh.me_module.plot_model_ks(y_test, y_pred)参数:
y_label(np.ndarray): 真实标签y_pred(np.ndarray): 预测概率
model_ks()
计算 KS 值。
ks_value = yh.me_module.model_ks(y_test, y_pred)参数:
y_label(np.ndarray): 真实标签y_pred(np.ndarray): 预测概率
返回: float - KS 值
cross_verify()
交叉验证。
yh.me_module.cross_verify(
X_train, y_train,
estimator=LogisticRegression(),
fold=5,
scoring='roc_auc'
)参数:
x(np.ndarray): 特征矩阵y(np.ndarray): 目标变量estimator: 评估器模型fold(int): 折数scoring(str): 评分指标
评分卡实现模块
ScorecardImplementModule
评分卡实现模块,提供评分卡刻度计算和分数转换。
cal_scale()
计算评分卡刻度参数。
A, B, base_score = yh.si_module.cal_scale(
score=600,
odds=50,
PDO=20,
model=lr_model
)参数:
score(float): 指定 odds 时的分数odds(float): 好坏比PDO(float): odds 翻倍时分数的减少量model: 训练好的逻辑回归模型
返回:
A(float): 参数 AB(float): 参数 Bbase_score(float): 基础分
score_df_concat()
生成变量得分表。
score_df = yh.si_module.score_df_concat(
woe_df=woe_df,
model=lr_model,
B=B
)参数:
woe_df(pd.DataFrame): WOE 结果表model: 逻辑回归模型B(float): 参数 B
返回: pd.DataFrame - 变量得分表
rule_verify()
验证 cutoff 有效性。
matrix = yh.si_module.rule_verify(
df=test_scores,
col_score='score',
target='dlq_flag',
cutoff=650
)参数:
df(pd.DataFrame): 包含分数和目标变量的数据col_score(str): 分数列名target(str): 目标变量列名cutoff(float): cutoff 阈值
返回: pd.DataFrame - 混淆矩阵
评分卡监控模块
ScorecardMonitorModule
评分卡监控模块,提供模型稳定性监控。
score_psi()
计算 PSI(Population Stability Index)。
psi_df = yh.sm_module.score_psi(
df1=model_data,
df2=online_data,
id_col='customer_id',
score_col='score',
x=200,
y=800,
step=20
)参数:
df1(pd.DataFrame): 建模样本数据df2(pd.DataFrame): 上线样本数据id_col(str): ID 列名score_col(str): 分数列名x(float): 分数区间左端点y(float): 分数区间右端点step(float): 分数区间步长
返回: pd.DataFrame - PSI 计算结果
完整示例
import pandas as pd
from yihuier import Yihuier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# 1. 加载数据
data = pd.read_csv('data.csv')
# 2. 初始化
yh = Yihuier(data, target='dlq_flag')
# 3. 数据预处理
numeric_vars = yh.get_numeric_variables()
yh.data = yh.dp_module.fillna_num_var(numeric_vars, fill_type='0')
yh.data = yh.dp_module.target_missing_delete()
# 4. 变量分箱
bin_df, iv_value = yh.binning_module.binning_num(
col_list=numeric_vars[:10],
max_bin=5,
method='ChiMerge'
)
# 5. WOE 转换
data_woe = yh.binning_module.woe_transform()
# 6. 变量选择
feature_cols = [col for col in data_woe.columns if col != yh.target]
xg_imp, _, xg_cols = yh.var_select_module.select_xgboost(
col_list=feature_cols,
imp_num=10
)
# 7. 模型训练
X = data_woe[xg_cols]
y = data_woe[yh.target]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
# 8. 模型评估
y_pred = model.predict_proba(X_test)[:, 1]
from sklearn.metrics import roc_auc_score
auc = roc_auc_score(y_test, y_pred)
ks = yh.me_module.model_ks(y_test, y_pred)
print(f"AUC: {auc:.4f}")
print(f"KS: {ks:.4f}")
yh.me_module.plot_roc(y_test, y_pred)
yh.me_module.plot_model_ks(y_test, y_pred)
# 9. 评分卡实现
A, B, base_score = yh.si_module.cal_scale(
score=600, odds=50, PDO=20, model=model
)
test_scores = base_score + X_test.dot(model.coef_[0]) * B
print(f"基础分: {base_score:.2f}")
print(f"分数范围: {test_scores.min():.2f} - {test_scores.max():.2f}")更多详情请参考: