明确问题与目标

先搞清楚要解决什么问题,比如预测房价,判断垃圾邮件,输出是单个值还是多个值?

数据收集

从各种渠道获取数据:数据库、日志、传感器、公开数据集等,数据的质量通常比模型的复杂度更重要。

数据清洗与预处理

处理缺失值、处理异常值、编码类别特征(one-hot、label encoding 等)、特征缩放(标准化/归一化)文本、图像等需要额外的特征提取或表示(如词向量、图像resize等)

划分数据集

  • 训练集(train):用来“学习”参数
  • 验证集(validation):用来调参、选模型
  • 测试集(test):只在最终评估时使用

常见比例:6/2/2、7/1.5/1.5 等(具体视数据量而定)。

选择模型

根据问题选择合适的模型,比如:

线性回归模型

分类

1、多元线性回归
在这里插入图片描述

2、多项式回归
先把特征做多项式扩展,再用普通线性回归
在这里插入图片描述

评价指标

是评价模型预测与泛化性能的核心指标

MAE(均方误差)
在这里插入图片描述
对异常值不敏感——误差10和误差100,贡献是10倍而不是100倍

MSE(均方误差)
因为开平方了,对异常值更敏感
在这里插入图片描述

RMSE(均方根误差)
在这里插入图片描述
MSE的平方项对异常值的惩罚比RMSE和MAE更狠,所以如果你想让模型极度厌恶大误差,用MSE做损失函数更直接

R2

在这里插入图片描述
衡量回归模型对数据变异的解释程度,数值在0到1之间,越接近1说明模型拟合得越好,因为MSE会受数值单位影响,而R2则是纯粹只关注比例,比如

真实值 预测值 平均值
100万 110万 200万
200万 190万 200万
300万 280万 200万

TSS(总平方和) = 20000,
RSS(残差平方和)= 600
R² = 1 - 600/20000 = 0.97

模型解释了97%的房价波动,拟合效果非常好。

正则化

Lassos(L1)
所有非零权重都有惩罚;弱特征的权重更容易被压成 0,相当于在损失函数后面加一个λ∣w∣

Ridge(L2)
所有非零权重都有惩罚;权重越大,惩罚越重,权重越小,惩罚越小,所以弱特征的权重会被压带接近于 0,相当于在损失函数后面加一个λw2

损失函数

损失函数的来源主要就是从评价指标中选出一个合适的指标,通常选用MSE,因为通过梯度公式可知,RMSE的梯度多了一个 1/RMSE 的分母项,当模型快收敛了,RMSE接近0,梯度会变得非常大,导致参数更新步长突然变大,所以MSE综合来说更适合做损伤函数
在这里插入图片描述

线性模型 - 解析法

线性回归模型最优解的求解过程是带正则化的最小二乘法,以一元多项式为例,给定数据点(Xi,Yi),希望用一个 k 阶多项式拟合
在这里插入图片描述
目标是找到参数向量:w = [w0,w1,w2,w3,w4…wk]使得预测值尽可能接近真实值,评估标准就是通过损失函数来确定,损失函数越小代表模型性能越好,损失函数是
在这里插入图片描述
所以求解最优解过程就是围绕这个顺手函数求解的过程,求解过程如下

首先带入写成矩阵形式y^ =Xw,其中X是全部多项式部分取值的矩阵
在这里插入图片描述
多项式函数值y取值是向量
在这里插入图片描述
假如多项式项数是20,样本数是30,那么权重W就是一个20维向量,函数值Y是一个300维向量,参数X就是就是一个300* 20的二维矩阵,他们满足关系 Y = WX,从数学角度,就是一个20维的向量,经过300* 20的二维矩阵映射变换转为了一个300维的向量,目前X和Y都是已知的,损失函数的形式如下,所以这里就是求未知的w的最优解函数,带入矩阵的最小二乘法公式,推导过程略
在这里插入图片描述
即可通过训练集数据计算出线性回归最优解参数向量

如果是考虑正则化的话,那么评价标准公式就变成了
在这里插入图片描述
对引入正则化的损失函数求最优解,求出来的结果就是
在这里插入图片描述

引入正则化机制
正则化是相当于在损伤函数的基础上加了一个惩罚项,在默认写法里,每一个参数 的惩罚权重是一样的(并没有“高阶参数惩罚得更重的内在机制)

比如我们模拟一个案例y=sinx + randomNum, randomNum取值[-0.5,0.5] ,我们随机生成300个x,x取值范围在[-2,2],我们选择一个20阶多项式模型,按模拟结果反推我们训练处的最优解模型应该是y=asinx(x + b)这种模式,可近似套用泰勒展开式,结果为
在这里插入图片描述
虽然我们指定的是20阶,但实际上前4个参数基本就能确定一个y=asinx(x + b)函数了,后面更高维的参数则是为了去更好的覆盖那些噪音点,表现出来的形式就是让函数不再是一个光滑的曲面,而是剧烈抖动的曲线,这样确实能更好的拟合噪音,但同时也牺牲了通用性,所以在训练分数很高,但测试得分通常就不太好看了,所以正则化则是更倾向于惩罚那些高阶项,因为低阶项虽然系数大,但低阶项是函数的基本骨架,如果调整低阶项系数会使得损失函数误差整体大幅提升,这样会得不偿失,而高阶项虽然系数不大,但同时对损失函数的贡献也不大,引入正则化惩罚机制后,就不会再毫无顾忌使用高阶项系数去弥补那点微不足道的误差,所以会更倾向于惩罚高阶项

解析法的缺点
我选定一个 20 阶多项式的模型,用 3 万个训练数据训练,如果用解析法的话运算成本过于庞大,所以更适合使用梯度下降法求解,那该模型的损失函数是一个21维的向量,此处的过程完全同上,区别在于解析法是直接套式解出最优解,而梯度下降法则是像下山一样,通过各处几乎最抖的破下到入口处,即损失函数最小的极值点就是参数的最优解

线性模型 - 梯度下降法

假设我们有一个二次型损失函数,包含三个权重参数w1,w2,w3

纯数学思路

我们选用一个更直观函数模型f(x) = (x2 − 2)2, 来给大家演示这个过程 ,这个函数非常简单,我们一眼就能看出它的最小值是负根号2和正根号2,但我们先假装看不出来,通过梯度下降法逐步推导步骤如下

  • 首先计算该函数梯度,一元函数的梯度即为它的导数 f(x) = 3x3 - 4x
  • 套用学习率公式,Xnew = Xold −αf ′(Xold),并指定学习率为0.1
  • 随机选个起点开始走,比如从 x = 0 出发,当前的梯度为-6,用梯度下降更新下一步的x为0.6
  • 从 x = 1 开始走,当前的梯度为-2.7,用梯度下降更新下一步的x = 1 + -2.7*0.05 = 1.33
  • 从 x = 1.33 再走,当前的梯度为-1.8,用梯度下降更新下一步的x为1.40
  • 依次类推,这些 x 一步步地向 1.44靠近,但同时但每一步走得越来越小,因为函数这个函数的结构特点就是越接近最小值,梯度(导数)越是趋近于0,我们让它走100步,就基本能逼近最优解了
标准批量梯度下降案例

首先要确定模型,比如我们这里先提前确定下来需要用的是简单线性回归模型,该模型的损失函数模式就长这个样子,假如我们选的线性模型有2个权重参数w1和w2
在这里插入图片描述
因为xi 和 yi都是已知的了,而w1、w2、b是未知的,也是需要我们求最优解,所以这里本质就是求一个最优[w1,w2]使得L(w,b)最小,最好是接近于0,假设我们只有三个样本(1,2,7) (1,4,9), (2,5,12),带入这个式子就更直观了
在这里插入图片描述
同样分别对w1和w2求偏导,式子如下
在这里插入图片描述
学习率使用默认值0.001,此处的梯度下降公式是
在这里插入图片描述

随机给w1和w2一个初始值(0,0)

  • 第一轮,带入(0,0),因为我们这里偏执b默认是0,预测值y也是(0,0,0),所以带入损失函数是91.3,带入w1和w2的梯度公式求得他们在(0,0)这个点的梯度值分别是−26.7,−70.7,带入梯度下降公式,首轮更新后w1和w2的值更新为(0.026,0.0707)
  • 第二轮,权重参数w从点位(0.026,0.0707)开始出发,带入w1和w2的梯度公式求得他们在(0.026,0.0707)这个点的梯度值分别是-25.8,−67.9,带入梯度下降公式,首轮更新后w1和w2的值更新为(0.052,0.139),损失函数下降到了85.2
  • 第三轮,权重参数w从点位(0.052,0.139)开始出发,带入w1和w2的梯度公式求得他们在(0.052,0.139)这个点的梯度值分别是-24.9,−65.5,带入梯度下降公式,首轮更新后w1和w2的值更新为(0.077,0…204),损失函数下降到了47.2

整个训练流程,w1和w2参数逐步往最优解靠近,损伤函数不断降低,大于在1000轮下降后逼近最优解
在这里插入图片描述
批量梯度下降的问题

运算成本依然过高,上面的演示太粗略了,我们把第0轮的运算完整呈现出来就是

1.先算预测值 y1^ =0, y2^ =0, y3^ =0,和实际值(7,9,12)的误差就是(-7,-9,-12)
2.带入梯度公式计算
在这里插入图片描述
虽然本案例只有2个参数,但虽然本案例只有2个参数,但可以想象,当模型有成百上千个参数时,我们需要计算当前参数点下所有样本的预测值和真实值的差值,然后分别带入各个参数在当前点位的梯度公式,所以运算量依然是相当庞大的

学习率取值注意点
学习率参数是一个非常核心的参数,取值的大小直接影响我们训练过程,比如我们上面选用0.001的学习率,经过1000次求出最优解是比较合理的选择, 求解过程细节图如下
在这里插入图片描述

学习率过小,那么运算步骤会显著增大,如果学习率过大,可能永远找不到的风险,例如如果学习率使用0.01,就会出现如下情况
在这里插入图片描述
所以学习率的选择上通常准寻一些标准化的大小

  • 对普通回归 / 小模型 / 标准化后的特征:
  • SGD/动量:η 在 1e-3 ~ 1e-1 之间试
  • Adam:1e-3 是非常常见的起点
  • 对深度网络(尤其是图像任务):
  • SGD with momentum:0.1、0.01 是常见起点
  • Adam:1e-3、3e-4

梯度下降注意点
损失函数越大的时候,比如各个权重参数还是初始化状态,和最优解距离比较远的时候,因为此时初始化的权重参数点位可能本身就在一个函数上比较陡峭的点位,同样的步长,因为初始化所在的点位比较陡峭,也就是当前点位梯度通常会比较大,所以刚开始的时候梯度下降幅度是非常明显的,但后面逐步靠近最优解的过程,函数会趋于平稳,也就是梯度会越来越小,下降的也会越来越缓慢

逻辑回归

最大似然概念

比如四个病人,病人1和病人2患病,模型给出患病的概率是0.9和0.8,病人3和病人4未患病,模型给出患病的概率是0.1和0.2,那么最大似然计算得出是0.9*0.8 * ( 1 - 0.1) * (1- 0.2) = 0.5184同一批样本的情况下,模型输出概率值的最大似然可以有效衡量模型对训练数据集拟合程度的核心

概念

逻辑回归是一种用于二分类问题的监督学习模型,用于判断样本属于哪一类,比如是否生病,是否垃圾邮件,输出不是直接给“类别”,而是给出一个属于正类的概率。工作机制是先把输入特征做线性组合,然后通过sigma函数然后把这个线性结果映射到 [0,1] 区间,表示概率,对应的公式主要就是

  • z = wT +b
  • σ(z) = 1 / (1 + e-Z)

模型形式

zi = w1x1 + w2x2 + w3*x3

y^ = σ(zᵢ) = 1 / (1 + e-zi)

数据区分度

预测某个行为是否发生,x1是点击次数,x2是停留时长,这两个指标只是表面更可能购买,但并不是非常强的信号,那么模型的也会输出类似 0.6、0.7 这种概率,同时表现在数据图上,也是这几个点位为交织在一起的,而不是离散区分的,比如(1,1,0), (2,1,0), (3,2,1) (4,3,1)

强烈的信号表现在数据图上通常就是点位呈现离散趋势,比如做贷款逾期预测,特征可能包括逾期次数、收入水平、负债率、信用分,模型的就可以输出0.9以上的概率

损失函数

逻辑回归的损伤函数和线性函数不同,不是
模型输出概率值的最大似然可以有效衡量模型对训练数据集拟合程度的核心,但无法达到真实值偏差越大,惩罚会越重,真实值偏差越小,惩罚会越小的效果,所以我们对最大似然再取 log,把乘法变成加法,便于优化,再取负号,把“最大化概率”变成“最小化损失”,损失函数内容如下
在这里插入图片描述
对于单个样本则是直接除以N,公式如下
在这里插入图片描述
实战案例

  • 比如真实标签是 1,但你预测的概率很小,比如p = 0.01,那么损失函数的值就是L=−log(0.01) ,是一个很大的值,意味着惩罚很重
  • 如果真实标签是 0,但你预测成 0.99,那么损伤函数值就是log(1−0.99) = -log(0.01),也是一个很大的值,意味着惩罚很重
  • 如果真实标签是 1,但你预测成 0.99,那么损伤函数值就是log(1−0.99) = -log(0.99),是一个接近0的值,意味着惩罚很轻

注意点
损失函数值较小,可以证明模型在训练集上拟合得好,证明它已经掌握了这批训练样本的规律;但如果训练样本过于单一、覆盖面太窄,那么模型即使训练得很好,到了新数据上也可能表现一般,所以想要保证模型实战性能,就必要要保证训练数集质量的基础上让模型预测结果损失函数值尽可能小

梯度下降法

对逻辑回归损失函数求导,对 y^ 求导
在这里插入图片描述
对线性函数z求导
在这里插入图片描述

所以损失函数对z的梯度,通过链式求导法则得出dL / dz = y^ - y

线性模型z的损失函数对w1、w2、w3的梯度分别是x1,x2,x3,所以由链式法则推出dLi/ dwi = (y^ - y)xi

梯度下降实战

比如我们预测客户是否下单的逻辑回归函数,x1是点击次数,x2是停留时长,有如下几个样本(1,1,0), (2,1,0), (3,2,1) (4,3,1),罗列出运算所需数据
在这里插入图片描述
假设有2个参数x1,x2,截距b

  • 首轮初始值w1,w2,b为(0,0,0),线性模型z = 0,带入sigma函数得σ = 0.5,也就是预测值为0.5,带入损失函数−log(0.5)=0.6931
  • 第一轮计算出w1和w2点位损失函数的梯度分别为-0.25和-0.5,更新后的参数w1=0.05, w2=0.025,b=0,带入这四个样本,分别求出线性模型的值z1 = 0.1, z2 =0.125 z3 =0.2 ,z4 = 0.275,再把z分别带入sigma函数 ,σ1 =0.5250, σ2=0.5312, σ3= 0.5498, σ4=0.5684,把这四个值带入交叉熵损失公式,然后除以4.得到的结果就是0.676
  • 循环往复,大约在第500次的时候求得最优解,损失函数最小是0.5350,此时对四个样本的预测值大约是(0.6498, 0.6762, 0.7080, 0.7540)
    在这里插入图片描述

分类模型常用指标

全部数据样本ALL,预测结果划分四类,TP(真阳性)、FP(假阳性)、FN(假阴性)、TN(真阴性)

准确率 Accuracy:比如你有 100 个病人,模型猜对了 80 个,那准确率就是 80%
精确率 Precision:所有被模型预测成有病的人里面,真正有病的有多少,比如50个预测有病的人45个人真的有病,精确率就是90%
召回率 Recall:召回率 Recall,比如有病的人是60人,找出来了45个有病的,召回是75%
F1:衡量Precision 和 Recall 平衡得怎样

损失函数是在模型训练过程中使用的优化目标,用来引导参数更新,把模型往“更好的方向”拉;Accuracy、Precision、Recall、F1 则是训练完成后用来评价模型真实预测能力的指标,相当于给模型“打分”。

KNN

概念

KNN不同于逻辑回归、线性回归这类,并不是是参数化模型,同样的也不会对已有的数据集进行学习,只是把训练数据存起来,它的工作机制是当接收到你抛给它的新样本后通过当前样本在数据集中的位置和临近元素来对这个新样本定性和预测,比如用KNN 做房价预测,常见特征
x=[面积,房龄,楼层,距地铁,…],y=这套房子的总价或单价,有历史成交数据的N套房,每套有特征 Xi和价格 Yi,新上架了一套房源只有特征,我们可以通过KNN模型给这套新房源辅助定价,基于KNN这种特点,我们通过用用一个二维数组(矩阵)来存所有样本的特征向量,比如

# 假设有 4 个样本,每个样本 3 维特征
X = np.array([
    [1.0, 2.1, 3.3],  # 样本 13 维向量
    [0.9, 1.8, 3.0],  # 样本 2
    [3.2, 0.1, 0.4],  # 样本 3
    [2.9, 0.2, 0.5],  # 样本 4
])  # X.shape == (4, 3)

样本间距离的计算公式

欧氏距离(默认)

特征空间里“直线距离”,多维勾股定理。

曼哈顿距离
像在棋盘上走,只能横竖走

余弦距离
常用于文本向量、推荐系统等“方向比长度重要”的场景。

KNN的归一化和标准化

比如使用KNN默认距离计算公式欧氏距离,有两套别墅房源,面积相同都是5000平米,但房龄一个1年,一个30年,然而在房屋面积这个大额数值影响下,房屋年龄的数组权重明显和房屋年龄对实际价格的影响不匹配,所以使用归一化,也就是对于特征有明确取值范围的,可以使用归一化,比如这个区域最大户型面积是1万,最老房型是50年,所以使用归一化把特征压缩到一个[0,1]区间里,把这两套房源特征分别被压缩到同一起跑线,两套房型被压缩后是[0.5, 0.02], [0.5, 0.6]

参数加权

归一化后,面积和房龄的影响被拉齐到同一起跑线了,这种情况下再去加权计算,比如高档别墅的无论使用寿命还是黄金居住期都远高于普通商品房,国外更是很多百年以上老别墅目前还在居住,所以相比于寿命,房屋面积对居住体验的影响更大,所以面积和房龄的权重分别是1和-0.2,所以,所以这里如果是普通商品房,人们更关注房屋年限,通常老破大不如小而美,所以房屋年限权重会更高,面积和时间的权重分别是1和和-0.34带入上面2套,计算最终值为0.492和0.38

位置权重

当训练样本数据经过归一化/标准化和加权处理后就可以被KNN存储了,KNN会存储这些训练好的样本特征值和真实结果,当用于预判新数据时,KNN会比较这些新数据和样本数据的距离,找出附近最相似的 K 个已知样本,根据这些邻居的标签来判断新数据是否患有心脏病,其中这个K是可以由开发者来制定的核心参数,比如指定K=5,那就是参考离它最近的五个样本数,比如最近5个邻居都有心脏病或都没心脏病那么预测结果就显而易见,但如果最近的5个邻居三个有病,两个没病呢,那么模型机会采用少数服从多少原则,认为这个有病

总结

所以样本数据转换为向量后,然后进行归一化或标准化和参数加权处理后,就能直接能存入knn用于后面待预测数据的参照系,

感知机

概念

我们拿一批已经标注好的邮件训练感知机,模型通过不断调整特征权重,学习出一条能够区分垃圾邮件和正常邮件的分类边界。训练后,那些在垃圾邮件中更常见、且对区分两类邮件更有帮助的特征词,比如“免费”“中奖”“链接”“感叹号”等,通常会得到较高的正向权重。之后新邮件如果包含这些特征,模型计算出的分数就会更高,从而更可能被判定为垃圾邮件。

注意点

感知机学习的哪些特征组合起来,更容易把垃圾邮件和正常邮件分开,在训练样本中,如果一个特征总是帮助把垃圾邮件和正常邮件区分开,它的权重会变大,所以它本质上是监督学习下的线性分类边界学习,比如“免费”常见于垃圾邮件,但“免费试用”、“免费课程”也可能出现在正常业务邮件里,所以感知机学到的是:“免费”这个词在当前数据分布下,对判定垃圾邮件有较强贡献

而对于这种特征词,是否出现,出现多少次,这些特征的权重多大,偏置项是多少,都会一起决定最终分数。总分 = 各特征值 × 对应权重 + 偏置

总结

感知机通过监督学习从已标注邮件中学习一组特征权重,找到能区分垃圾邮件和正常邮件的线性边界;那些在垃圾邮件中更具有区分性的特征,如“免费”“中奖”“链接”等,通常会被赋予较高的正向权重,从而使包含这些特征的新邮件更容易被判为垃圾邮件

决策树

直接上案例,历史数据:我们手头有10位已结清贷款客户的记录,如下表

客户ID 是否有房 婚姻状况 月收入(元) 实际结果
1 已婚 8000 好客户
2 未婚 12000 好客户
3 已婚 5000 好客户
4 未婚 3000 坏客户
5 未婚 4000 坏客户
6 已婚 7000 好客户
7 未婚 6000 好客户
8 未婚 2000 坏客户
9 已婚 10000 好客户
10 已婚 15000 好客户

10个客户中,好客户7个,坏客户3个,熵公式Entropy = -p(好)log₂p(好) - p(坏)log₂p(坏)

带入公式 (7/10)*log₂(7/10) - (3/10)*log₂(3/10),初始熵 ≈ 0.881

分别计算三个特征的“信息增益

  • 是否有房:有房(4人):全部是好客户(4好0坏)→ 熵 = 0,无房(6人):3好3坏 → 熵 = 1.0,加权平均熵 = (4/10)*0 + (6/10)*1.0 = 0.6
  • 婚姻状况:已婚(5人):4好1坏 → 熵 ≈ 0.722,未婚(5人):3好2坏 → 熵 ≈ 0.971,加权平均熵 = (5/10)*0.722 + (5/10)*0.971 = 0.8465,信息增益 = 0.881 - 0.8465 = 0.0345
  • 特征C:月收入(按6000元分界),收入>6000(5人):5好0坏 → 熵 = 0,收入≤6000(5人):2好3坏 → 熵 ≈ 0.971,加权平均熵 = (5/10)*0 + (5/10)*0.971 = 0.4855,信息增益 = 0.881 - 0.4855 = 0.3955

息增益排名:月收入(0.3955) > 是否有房(0.281) > 婚姻状况(0.0345),所以,决策树会第一个问“月收入是否大于6000元?”,因为这个问题最能有效区分好坏客户,所以决策树的第一层就构建好了

接下来开始构建第二层,剩下的五个用户里面需要重新计算剩下两个特征的信息增益,这5个人里

  • 有房2人(2好0坏),无房3人(0好3坏)。当前熵是 -2/5·log₂(2/5) - 3/5·log₂(3/5) ≈ 0.971。分裂后,有房组熵=0,无房组熵=0,加权平均熵=0。信息增益 = 0.971 - 0 = 0.971。
  • 婚姻状况:已婚2人(1好1坏),未婚3人(1好2坏)。计算后信息增益肯定小于0.971,大约是0.8

所以第二层选择是否有房这个特征来做判断条件

第三层就选用后剩的是否结婚来做判断了
在这里插入图片描述
决策树不是拍脑袋,它是用信息增益这样的数学工具,从数据中自动找出“先问哪个问题最有效”。规则透明可解释:银行可以明确告诉王五:“您被拒是因为月收入低于6000、没有房产且未婚,这三个条件同时满足时,我们的历史数据显示违约率高达100%。可以处理复杂情况:如果数据量更大(比如100万条),决策树能自动发现更多隐藏规则,比如“高学历+年轻+无房”可能比“低学历+中年+有房”风险更低。但注意,如果某个特征信息增益小于0,那么这个特征会被认为是无异于特征,不会被引入决策树

总结特征计算与节点分裂流程
假设有4个特征(A、B、C、D),构建一棵满二叉树

  • 第1层(根节点,1个节点):用全部数据,计算4个特征的信息增益,选最优特征(比如A)分裂。
  • 第2层(2个节点):每个节点上,分别用该节点自己的数据子集,计算剩余3个特征(B、C、D)的信息增益,各自选最优特征(比如左节点选B,右节点选C)分裂。
  • 第3层(4个节点):每个节点上,分别用该节点自己的数据子集,计算剩余2个特征(比如左左节点剩下C、D)的信息增益,各自选最优分裂。
  • 第4层(8个节点):每个节点上,分别用该节点自己的数据子集,计算剩余1个特征的信息增益,决定是否分裂。
  • 第5层(16个节点):所有特征都用完了,或者数据已经纯净,停止分裂,成为叶节点。

每个节点都是独立的“小世界”,只关心自己手上的数据和剩余特征,注意以上是决策树的常规算法,特征是可以被重复使用的,比如CART和ID3和C4.5,比如第一层通过月收入是否大于6000划分出了2个结果集(大于6000和小于6000的),这2份结果集作为第二层的节点,第二层的右叶子节点可能依然会计算月收入特征的信息增益,也就是结果小于6000的结果集可能依然会计算月收入特征的信息增益,比如以月收入4500来划分为会获取较高的信息增益

允许特征复用,好处很明显,现实世界的数据分布往往是“非单调”的。月收入与贷款风险的关系并不是一条简单的直线。低收入人群风险高,超高收入人群风险也未必低(比如过度消费、高杠杆投资),反而是中等偏上收入的人群最稳定。如果不允许复用:月收入在第一层被用完后,后续就只能靠其他特征来修正。如果其他特征(如婚姻状况、学历)与风险的关联性不强,模型就很难捕捉到“收入在3000-5000之间风险高,但5000-8000风险低,8000-15000风险又升高”这种复杂模式。树可以在不同深度、不同分支上,用不同的阈值反复切割“月收入”这个特征。这相当于把一条连续的曲线,用多个分段线性函数去逼近,拟合能力自然更强。

如果完全禁止特征复用,树能够极其灵活地捕捉特征在不同区间内的非线性规律。如果禁止复用,树的表达能力将大打折扣,根本无法应对工业界复杂的业务数据,但不加以限制,树过度分类生长,相当于用不同的阈值反复切割某项这个特征,用多个分段线性函数去逼近,容易出现过拟合,所以

如果选用特征过多,那么也会同样容易出现树深度过深,容易出现过拟合,所以工业界是如何平衡二者关系达成最优解的呢?

  • 限制树的最大深度(max_depth),最简单粗暴的方案, 比如强制规定树最多只能长到 5 层或 8 层
  • 限制叶子节点的最小样本数(min_samples_leaf): 比如规定一个叶子节点里至少要包含 10 个或 50 个样本。如果某次分裂会导致某个分支的样本数少于这个值,就禁止这次分裂。这能有效避免模型去学习那些极少数的“噪声”规律。
  • 限制最小信息增益,比如我们提前规定,只有当一次分裂带来的信息增益(或基尼指数的下降量)大于等于某个特定值(比如 0.01)时,才允许这次分裂发生

既然复用特征有好处也有坏处,工业界不会直接“一刀切”,而是通过一系列手段来控制风险、保留收益:限制树深度 直接防止树无限生长,限制叶节点样本数 防止叶节点只拟合几个噪声点,限制分裂带来的增益 如果增益太小,就不允许分裂,剪枝 树长好后,从下往上砍掉没用的分支,集成学习 用多棵“弱”树投票,而不是依赖一棵“强”树

在实际应用中,几乎没人会用一棵允许特征复用的深树去做预测。大家用的是随机森林或梯度提升树——它们由成百上千棵“弱”树组成,每棵树深度很浅(比如3-5层),但合在一起性能极强,而且天然抗过拟合。

随机森林

三个臭皮匠,顶个诸葛亮”,说的就是群体智慧的力量。单个皮匠可能见识有限、容易钻牛角尖,但多个皮匠凑在一起(随机森林),各自从不同角度出主意、互相纠偏,最终拿出的方案往往比一个天才(单棵高精度决策树)更稳妥、更靠谱。随机森林的底层逻辑,本质上就是这个古老的民间智慧在现代算法里的完美复刻

训练数据:10,000条历史申请记录,包含15个特征
目标变量:是否违约(1=违约,0=正常还款)
正负样本比例:约15%违约,85%正常(典型的类别不平衡)

特征类别 特征名称 类型 说明
个人基本信息 年龄 连续 22-60岁
学历 离散 高中/大专/本科/硕士及以上
婚姻状况 离散 未婚/已婚/离异
收入与资产 月收入 连续 3000-80000元
是否有房 二值 0=无,1=有
是否有车 二值 0=无,1=有
信用历史 信用评分 连续 300-850分(人行征信)
逾期次数(近2年) 连续 0-20次
信用卡使用率 连续 0%-100%
贷款相关 贷款金额 连续 5-50万
贷款期限 离散 12/24/36/60个月
贷款用途 离散 装修/教育/购车/旅游/其他
行为特征 近6个月查询次数 连续 0-30次
本行存款余额 连续 0-200万
本行产品持有数 连续 0-8个

第一步:构建随机森林(训练过程)
假设我们构建一个包含 100棵决策树 的随机森林,每棵树的最大深度限制为 8层。

从10,000条数据中有放回地抽取10,000条。由于是有放回抽样,大约会有:
约6,321条是原始数据中的“老面孔”
约3,679条是“新面孔”(即原始数据中未被抽到的袋外样本)

特征 最佳分裂点 基尼系数下降值
月收入 > 8000元 0.042
逾期次数 > 3次 0.089 ← 最优
信用评分 > 620分 0.055
贷款金额 > 20万 0.021

在根节点分裂时,从15个特征中随机选取 √15 ≈ 4 个特征作为候选。假设这次抽到的4个特征是:月收入、逾期次数、信用评分、贷款金额。选择“逾期次数 > 3次”作为根节点分裂条件。
继续分裂:

  • 左子节点(逾期次数 ≤ 3次):数据量约7,200条。再次随机选4个特征(可能包含与根节点不同的特征),继续分裂。
  • 右子节点(逾期次数 > 3次):数据量约2,800条。同样随机选特征,继续分裂。
    如此递归,直到达到最大深度(8层)或节点样本数小于阈值(如50条),第1棵树构建完成。

第2棵树:完全不同的视角
样本随机:再次有放回抽样,这次抽到的样本组合与第1棵树完全不同。
特征随机:在根节点,可能抽到的是 信用评分、信用卡使用率、本行存款余额、贷款期限 这4个特征。
经过计算,这次根节点可能选择 “信用评分 > 580分” 作为分裂条件。
关键点:第2棵树的根节点和第1棵树完全不同。这意味着两棵树看待数据的“视角”不一样,它们各自的偏见和错误方向也不同。

第3棵树到第100棵树
以此类推,每棵树都在不同的数据子集和特征子集上生长。有些树可能特别看重“月收入”,有些树可能特别看重“本行存款余额”,有些树可能把“学历”和“婚姻状况”组合起来判断。
最终,我们得到了100棵结构各异、各有偏好的决策树。

用随机森林做预测,一个新的申请人“张三”来申请贷款。他的信息如下:

特征 张三的数据
年龄 32岁
学历 本科
婚姻状况 已婚
月收入 12,000元
是否有房
是否有车
信用评分 680分
逾期次数 1次
信用卡使用率 45%
贷款金额 15万
贷款期限 36个月
贷款用途 装修
近6个月查询次数 3次
本行存款余额 25万
本行产品持有数 3个

我们把张三的数据喂给100棵树,每棵树独立做出判断:

树的编号 根节点分裂特征 树的判断路径(简化) 预测结果
第1棵树 逾期次数 > 3次? 张三逾期1次 → 走左分支 → 月收入>8000?是 → 信用评分>650?是 → … → 好客户 ✅ 好客户
第2棵树 信用评分 > 580分? 张三680分 → 走右分支 → 信用卡使用率>60%?否 → 本行存款余额>10万?是 → … → 好客户 ✅ 好客户
第3棵树 月收入 > 5000元? 张三12000元 → 走右分支 → 贷款金额>30万?否 → 年龄>40?否 → … → 好客户 ✅ 好客户
第47棵树 本行产品持有数 > 2个? 张三3个 → 走右分支 → 近6个月查询次数>5次?否 → 学历=本科?是 → … → 好客户 ✅ 好客户
第48棵树 贷款用途=购车? 张三用途=装修 → 走左分支 → 婚姻状况=离异?否 → 是否有房?是 → … → 好客户 ✅ 好客户
第89棵树 信用卡使用率 > 70%? 张三45% → 走左分支 → 逾期次数>0?是(1次)→ 贷款期限>24个月?是(36个月)→ … → 坏客户 ❌ 坏客户

经过100棵树的投票:

预测结果 票数
✅ 好客户(不违约) 87票
❌ 坏客户(违约) 13票

最终决策:张三被判定为好客户,贷款审批通过。

6. 定义损失函数和优化方法
损失函数:衡量模型预测与真实标签之间差距的函数
回归常用 MSE(均方误差)
二分类常用交叉熵(Binary Cross Entropy)
优化方法:如何调整参数使损失变小
常用梯度下降及其变种(SGD、Adam、RMSProp 等)

7. 模型训练(参数学习)
核心过程是“反复试错、逐步改进”:

从训练集中取一批样本(一个 batch),用当前模型做预测,计算损失(预测和真实之间的误差),通过反向传播等方法计算梯度,根据梯度更新模型参数(权重、偏置等)。重复以上步骤多个 epoch(完整遍历训练集的次数),目标是让训练集上的损失越来越小,同时尽量避免过拟合。

回归树

案例

我们有 8 个学生,目标是预测他们的考试分数,特征有两个:学习时长(小时)与是否刷题(1=刷,0=不刷)

学生 学习时长 是否刷题 分数
A 1 0 45
B 2 0 50
C 2 1 58
D 3 1 65
E 4 1 72
F 5 1 78
G 6 1 85
H 7 1 90

从根节点开始,计算样本的平均分是68分

[45, 50, 58, 65, 72, 78, 85, 90]

尝试各种切分,试着找一个特征和一个阈值,把样本切成两堆后,误差最

  • 切法 1:按学习时长 ≤ 3 分裂,左边A, B, C, D, E, F,平均分(45+50+58+65)/4=54.5,右边E, F, G, H,平均分(72+78+85+90)/4=81.25,目前看是最优切法,因为左右两边方差最小
  • 按学习时长 ≤ 5 分裂,左边A, B, C, D, E, F,平均分(45+50+58+65+72+78)/6=61.33,右边G, H,平均分(85+90)/2=87.5,左边数据有点杂,方差也比较大
  • 按是否刷题分裂,左边:不刷题A, B,分数:45, 50,右边:刷题C, D, E, F, G, H分数:58, 65, 72, 78, 85, 90,平均值:74.67,右边数据有点杂,方差也比较大

综上所述,切法1是最优解

概念

回归树通过递归地选择特征及其切分阈值,使得每个子节点内的目标值方差尽可能小,从而将相近输出的样本聚集到同一叶子节点,并用叶子节点的均值作为预测结果。

梯度提升树

可以看做是是一连串的树组成的串型处理链路,取一个学习率值,默认是0.1

  • 第一棵树是取样本方差平均值作为,计算每个样本和平均数的残差作为初始残差,纠正后的值 = 样本初始值 - 学习率 *初始残差,第一颗树把纠正后的值带入第二课树
  • 第二棵树:接手“烂摊子”,计算“新残差”,计算每个样本和平均数的残差作为初始残差和一颗树和传入的新预测样本作为本轮计算的残差,纠正后的值带入第二课树,第二棵树更新后的最终预测分 = 第一颗传入的预测样本值 - 学习率 * 本轮的残差
  • 依次类推,直到预测值主键逼近真实值

上述流程可以看出,每棵树都是这条流水线上的一环,哪怕是第一颗误差最大数也是这条生态链上不可获取的一环,是后面的树误差不断缩小的重要基础

无监督模型

上面的线性回归、逻辑回归、KNN、决策树都是无监督模型,监督模型的特点是有“输入 + 正确答案”,比如通过邮件内容判断是否垃圾邮件,通过房屋信息判断房价,通过图片判断猫狗

比如KNN和K-Means比较像,都通过距离来分类,而K-Means是像是老师把全班同学按身高、体重自动分成几组,KNN像是来了一个新同学,问他你最像哪几个老同学,比如可以做如下几个分类,近30天购买次数、近30天消费金额、平均客单价、浏览次数、加购次数

梯度下降算法

批量梯度下降

在机器学习学习梯度下降求解线性回归模型中已经接触这个算法了,缺点就是每下降到一个点位,都要求解全体训练样本的梯度平均值,样本数过大时计算成本是比较高的,

SGD梯度下降

动量梯度下降

传统SGD梯度下降存在的问题
SGD梯度存在鞍点、抖动剧烈等问题

公式
在这里插入图片描述
其中θt 是第t步参数,gt =∇f(θt)是第 t 步梯度,vt是动量,β:动量系数,常取 0.9,η:学习率,其中初始动量设为 (0,0),是因为动量代表历史梯度累积的“速度”,而一开始没有历史信息,所以速度初始化为零,动量越来越大,不代表参数下降速度一定越来越快,还受学习率η大小、梯度方向抵消,梯度值大小

可以把动量想成车的惯性,刚开始下坡,车会越滚越快,但坡度变平后,车不会一直加速,出现反向坡度还会减速,下降过头了错过了最优点后,还会反向回退逐步逼近最优点,通过公式就能看出来

如果前面积累了较大的动量,哪怕当前梯度已经提示“该减速了”,参数还是可能继续往前走一小段。这就像车有惯性一样,不会立刻停下,这可以很好弥补sgd无法解决鞍点问题的不足,但如果此处不是鞍点而是真正的最小值点,那么后续还会反向回退逐步逼近最优点,也就是参数可能会因为惯性冲过头之后会在梯度的作用下反向修正,来回幅度逐渐变小,最终逼近最优点,。

案例
f(x,y) = x2+100y2

它的梯度是:
∇f(x,y)=(2x, 200y)

如果是使用传统的批量梯度下降法,我们使用SGD法列举前几个来看

  • 初始点(1,1),梯度(2,200),
  • 首次下降,套用梯度下降公式(1,1) - 0.01(2,200))(0.98, -1)
  • 第二次下降,套用公式同上,得到(0.9604,1)
  • 第三次下降(0.941192,−1)

可见x的值可以缓慢下降,但是y的值会距离跳跃,因为y的权重参数太大,导致y的值距离震荡,而动量法可有效解决这个问题,我们使用动量法列举前几个来看

  • 初始点θ0 = (1,1),动量v0 = (0, 0), v1 =0.9(0,0)+0.1(2,200)=(0.2,20),当前点梯度g0 = (2,200), 因为学习率取的是0.01,所以θ1 =θ0 −0.01v1 =(1,1)−0.01(0.2,20) = (0.998,0.8),
  • 在θ1 = (0.998,0.8)处,g1 = (2×0.998, 200×0.8) = (1.996,160),动量v2 =0.9v1 + 0.1g1 = (0.3796,34), θ2 =θ1 −0.01v2 = (0.998,0.8)−0.01(0.3796,34) =(0.994204,0.46)
  • 在θ2 (0.994204,0.46)处,g2 = (2×0.994204, 200×0.46)=(1.988408,92),v3 =0.9v2 +0.1g2 =0.9(0.3796,34)+0.1(1.988408,92) =(0.5404808,39.8),θ3 =θ2 −0.01v3, θ3 =(0.988799192,0.062)

这个例子中使用SGD,y 方向会在-1和1这两个点位来回震荡,使用了动量法把历史梯度积累起来,可以减少来回震荡,动量法通过引入历史梯度的指数加权平均,平滑更新方向,从而抵消高频震荡,减少来回摆动。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐