4. 目标变量定义与好坏样本划分
任务说明
本案例基于申请人的历史最大逾期天数(overdue_days)定义二分类目标变量 target:逾期天数 ≥ 90 天记为坏客户(1),否则为好客户(0)。随后统计好坏样本数量与占比,为后续评分卡建模提供标签基础。
实现代码
import pandas as pd
# 1. 构造示例申请数据(含客户ID与最大逾期天数)
data = {
"cust_id": [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010],
"overdue_days": [ 0, 15, 30, 60, 89, 90, 120, 180, 240, 365],
}
df = pd.DataFrame(data)
# 2. 定义好坏标签:逾期天数 >= 90 为坏客户(1),否则为好客户(0)
BAD_THRESHOLD = 90
df["target"] = (df["overdue_days"] >= BAD_THRESHOLD).astype(int)
# 3. 统计好坏样本数量与占比
counts = df["target"].value_counts().sort_index()
ratio = df["target"].value_counts(normalize=True).sort_index()
summary = pd.DataFrame({
"label": ["好客户(0)", "坏客户(1)"],
"count": [counts.get(0, 0), counts.get(1, 0)],
"ratio": [round(ratio.get(0, 0.0), 4), round(ratio.get(1, 0.0), 4)],
})
print(df)
print("\n好坏样本统计:")
print(summary)
运行方式
依赖 pandas,安装后直接运行脚本:
pip install pandas
python target_define.py
验证方法与通过条件
- 检查
df["target"]:overdue_days为 0、15、30、60、89 的行应为 0;90、120、180、240、365 的行应为 1。 - 检查
summary:count之和应等于样本总数 10,ratio之和应为 1.0。 - 本示例数据下,好客户 5 条、坏客户 5 条,占比均为 0.5,与代码逻辑一致。
关键点
- 阈值
BAD_THRESHOLD是业务口径,实际项目中需与风控策略一致(常见为 M3+,即逾期 90 天以上)。 - 使用
astype(int)将布尔结果转为 0/1,便于后续逻辑回归等模型直接使用。 - 真实数据中若好坏样本严重不平衡,需在建模阶段考虑采样或权重调整。