阶段:S8-综合实践 | 预计耗时:2-3 小时 | 前置:S8-01 CIFAR-10 完整项目 新依赖:
pip install lightgbm scikit-learn pandas -i https://pypi.tuna.tsinghua.edu.cn/simple代码:model-learn/s8_lightgbm.py| 数据:Adult 收入普查(约 5MB,UCI 直接下载) 与职业路线的关系:这是 训练数据集.md 第 1 名"金融量化/风控"路线的第一块砖
学习目标
- 破除"深度学习万能":表格数据上梯度提升树(GBDT)仍是工业界王者,且 CPU 秒级训练——低配机的黄金赛道
- 掌握 LightGBM 最小工作流:加载 → 类别特征 → 训练 → AUC 评估
- 理解 AUC 与业务指标的关系(呼应 S6-01:不平衡数据不能只看准确率)
核心知识
1. 为什么表格数据不用神经网络
- 表格特征之间关系简单、样本量常在万级——GBDT 又快又准又可解释
- LightGBM 单机 CPU 即可,几十秒出结果;神经网络在同任务往往更慢更差
- 金融风控还要求可解释(监管),树模型配合特征重要性输出正好
2. Adult 数据集
经典二分类:根据年龄/职业/教育等 14 个特征预测"年收入是否 > 50K"。约 3.2 万样本,类别比 76:24(轻微不平衡——正好用 AUC)。
3. AUC 直觉
"随机抽一个正样本和一个负样本,模型给正样本更高分的概率"。0.5=瞎猜,1.0=完美;Adult 上 LightGBM 轻松到 0.92+。
实验任务
任务 1:跑通最小工作流(60 分钟)
# s8_lightgbm.py —— 表格数据王者初体验
import pandas as pd, lightgbm as lgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
URL = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"
cols = ["age","workclass","fnlwgt","education","edu_num","marital","occupation",
"relationship","race","sex","gain","loss","hours","country","income"]
df = pd.read_csv(URL, names=cols, na_values=" ?", skipinitialspace=True)
y = (df.pop("income") == ">50K").astype(int) # 标签 0/1
X = df.fillna("Unknown") # 缺失值处理(第一个特征工程决定)
for c in X.columns: # 类别列转 category dtype,LightGBM 原生支持
if X[c].dtype == object: X[c] = X[c].astype("category")
Xtr, Xva, ytr, yva = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
m = lgb.LGBMClassifier(n_estimators=300, learning_rate=0.05, random_state=42)
m.fit(Xtr, ytr, eval_set=[(Xva, yva)])
print("AUC =", roc_auc_score(yva, m.predict_proba(Xva)[:, 1]))
print(pd.Series(m.feature_importances_, index=X.columns).sort_values(ascending=False).head(8))
任务 2:特征工程第一课(30 分钟)
改动一个特征看 AUC 变化(一次一个变量):
- gain(资本收益)和 loss 改成"是否有"的 0/1(绝大多数行是 0——稀疏特征压缩)
- age 分箱成 10 岁一档
记录每次 AUC 变化进观察记录表。
任务 3:对照实验(20 分钟)
用 sklearn 的 LogisticRegression(记得先把 category 列 one-hot)跑同任务——对比两个模型的 AUC 与耗时。这就是"表格数据选型"的第一手证据。
验收标准
衔接下一阶段
表格路线就位 → S8-03 0.5B 模型 LoRA 微调:最后一站,把"训练"接到你正在学的 LangGraph/LLM 世界。