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,便于后续逻辑回归等模型直接使用。
  • 真实数据中若好坏样本严重不平衡,需在建模阶段考虑采样或权重调整。