2. 机器学习基础回顾:监督学习、分类与回归、过拟合与欠拟合、交叉验证

机器学习基础这块,我个人习惯把它比作建房子的地基。别急着往上盖XGBoost,先搞清楚我们脚下踩的是什么。这一节咱们把几个核心概念再过一遍,我保证不会扔一堆公式砸你——实战中怎么用,我就怎么讲。

2.1 监督学习:有老师带着学

什么是监督学习?说白了就是给机器看一堆“题目+标准答案”,让它学会自己猜答案。

我第一次接触这个概念是在做一个信贷逾期预测项目。手里有10万个客户,每个客户的年龄、收入、负债这些信息我都知道,而且我还知道他们最后有没有按时还钱。这就是典型的监督学习场景:

  • 输入(特征):年龄、收入、负债、职业、历史逾期次数
  • 输出(标签):是否逾期(0或1)

核心要点:监督学习必须要有标签数据。没有标签,那就是另一回事了(无监督学习),但信用评分建模几乎全是监督学习的活。

我个人习惯把监督学习分成两大家族:分类和回归。别觉得这两者很玄乎,它们其实就是预测目标的类型不同罢了。

监督学习全流程(信用评分视角) 原始数据 打标签(逾期/正常) 训练集(70%-80%) 测试集(20%-30%) 选择模型(如XGBoost) 在训练集上拟合模型 在测试集上评估 分类任务 预测离散类别:逾期/非逾期 输出:概率或标签(0/1) 回归任务 预测连续数值:授信额度 输出:数值(如5000元)

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) 复杂度与数据量匹配

怎么解决?我分享三个我个人经常用的策略:

  1. 正则化:给模型的复杂度加个惩罚项。XGBoost里有gamma、lambda、alpha这些参数,目的就是让你别把树长太深。
  2. 早停(Early Stopping):看到验证集指标不再提升了,立刻停止训练。我一般设置patience=10轮。
  3. 减少特征或增加数据:噪音特征太多,你就砍掉;数据量不够,就想办法多拿点样本——现实中这往往最难。

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具体参数时,咱们会一个个填上。你先把这里面提到的关键词理清楚,后面的内容就顺了。