2. 机器学习基础回顾:监督学习、分类与回归、过拟合与欠拟合、交叉验证
机器学习基础这块,我个人习惯把它比作建房子的地基。别急着往上盖XGBoost,先搞清楚我们脚下踩的是什么。这一节咱们把几个核心概念再过一遍,我保证不会扔一堆公式砸你——实战中怎么用,我就怎么讲。
2.1 监督学习:有老师带着学
什么是监督学习?说白了就是给机器看一堆“题目+标准答案”,让它学会自己猜答案。
我第一次接触这个概念是在做一个信贷逾期预测项目。手里有10万个客户,每个客户的年龄、收入、负债这些信息我都知道,而且我还知道他们最后有没有按时还钱。这就是典型的监督学习场景:
- 输入(特征):年龄、收入、负债、职业、历史逾期次数
- 输出(标签):是否逾期(0或1)
核心要点:监督学习必须要有标签数据。没有标签,那就是另一回事了(无监督学习),但信用评分建模几乎全是监督学习的活。
我个人习惯把监督学习分成两大家族:分类和回归。别觉得这两者很玄乎,它们其实就是预测目标的类型不同罢了。
2.2 分类 vs 回归
这两者的区别你想想看,其实特别直观:
| 对比维度 | 分类 | 回归 |
|---|---|---|
| 预测输出 | 离散标签(0/1,好/坏) | 连续数值(分数、金额) |
| 常见算法 | 逻辑回归、决策树、XGBoost | 线性回归、SVR、XGBoost |
| 评估指标 | 准确率、精确率、召回率、AUC | MSE、RMSE、MAE、R² |
| 信用评分场景 | 判断客户是否违约 | 预测客户违约概率(好理解成回归也行) |
实战小贴士:我在信用评分项目里,很少只做纯分类或纯回归。我通常是先输出违约概率(回归感觉),然后按阈值切分(分类动作)。XGBoost默认输出就是概率值,拿来就能用,这点很香。
2.3 过拟合与欠拟合:模型的两大坑
嗯,这里要注意,过拟合和欠拟合是我在项目中遇到最多的问题,没有之一。
过拟合:模型把训练数据里的噪音都记住了,结果泛化能力差。就像一个学生只会背题目的答案,题目稍微变一下就不会了。
我曾经在一个信贷数据集上,用了50多个特征,树深度设到15层,训练集AUC能做到0.99,但测试集只有0.62。这模型就是典型的“考霸型选手”——考场上全对,实战全废。
欠拟合:模型太简单,连训练数据的基本规律都没抓住。说白了就是还没学会就开始考试了。
| 问题类型 | 训练集表现 | 测试集表现 | 根本原因 |
|---|---|---|---|
| 过拟合 | 非常好(如AUC 0.99) | 差(如AUC 0.62) | 模型太复杂,数据太少或特征噪音多 |
| 欠拟合 | 差(如AUC 0.55) | 也差(如AUC 0.53) | 模型太简单,特征不足 |
| 刚好合适 | 不错(如AUC 0.85) | 也不错(如AUC 0.82) | 复杂度与数据量匹配 |
怎么解决?我分享三个我个人经常用的策略:
- 正则化:给模型的复杂度加个惩罚项。XGBoost里有gamma、lambda、alpha这些参数,目的就是让你别把树长太深。
- 早停(Early Stopping):看到验证集指标不再提升了,立刻停止训练。我一般设置patience=10轮。
- 减少特征或增加数据:噪音特征太多,你就砍掉;数据量不够,就想办法多拿点样本——现实中这往往最难。
2.4 交叉验证:把你的数据用出花来
交叉验证这个坑,我当初刚入行时也理解得很浅。以为就是把数据切几份来回跑跑就行——实际上它的核心价值在于:更稳定地评估模型表现。
K折交叉验证(K-Fold Cross Validation)
做法很简单:把数据分成K份,每次用K-1份训练,剩下一份验证,轮K次,取平均分。我常用的K值是5或10。
from sklearn.model_selection import cross_val_score
import xgboost as xgb
model = xgb.XGBClassifier(n_estimators=100, max_depth=3)
scores = cross_val_score(model, X, y, cv=5, scoring='roc_auc')
print(f'5折平均AUC: {scores.mean():.4f} (+/- {scores.std():.4f})')
输出结果一般像这样:
| 折数 | AUC | 说明 |
|---|---|---|
| 第1折 | 0.812 | 用第2-5份训练,第1份验证 |
| 第2折 | 0.798 | 用第1、3-5份训练,第2份验证 |
| 第3折 | 0.835 | 用第1-2、4-5份训练,第3份验证 |
| 第4折 | 0.807 | 用第1-3、5份训练,第4份验证 |
| 第5折 | 0.821 | 用第1-4份训练,第5份验证 |
| 平均 | 0.815 | 标准差0.014,比较稳定 |
请注意:交叉验证不是用来训练最终模型的,它只是帮你评估“如果我用这个参数组合,模型大概会表现如何”。你验证完了,确定好参数,还是要在全部数据上重新训练一次,这才是最终上线的模型。
留出法 vs 交叉验证
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 留出法(简单划分) | 数据量大(>10万样本) | 速度快,一次训练 | 评估结果波动大 |
| K折交叉验证 | 数据量中等(1万-10万) | 评估稳定,减少偶然性 | 训练时间增至K倍 |
| 留一法(LOO-CV) | 数据量很小(<1000) | 几乎无偏估计 | 计算成本极高 |
我的个人习惯:对于信用评分这类场景,数据量通常在几万到几十万之间。我一般先用5折交叉验证快速调参,最后再用一个独立验证集做最终确认。别信网上说的“必须10折”,5折在绝大多数情况下已经够用了——计算时间省一半,结果差异不大。
好了,机器学习基础这块咱们就聊到这儿。这些概念看着简单,但实战中每一条都可能让你翻车。我踩过的那些坑,后面讲XGBoost具体参数时,咱们会一个个填上。你先把这里面提到的关键词理清楚,后面的内容就顺了。