1.模型的过拟合和欠拟合

训练误差(training error)和泛化误差(generalization error)。通俗来讲,前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。

在机器学习里,我们通常假设训练数据集(训练题)和测试数据集(测试题)里的每一个样本都是从同一个概率分布中相互独立地生成的。基于该独立同分布假设,给定任意一个机器学习模型(含参数),它的训练误差的期望和泛化误差都是一样的。

一类是模型无法得到较低的训练误差,我们将这一现象称作欠拟合(underfitting);另一类是模型的训练误差远小于它在测试数据集上的误差,我们称该现象为过拟合(overfitting)。

1.1欠拟合

1)添加其它特征。组合,相关性,上下文特征,平台特征。

2)添加多项式特征,如线性模型中二次项和三次项。

1.2过拟合

1)重新清洗数据。

2)增大训练数据量。

3)减少特征维度。

4)正则化。减少某个特征的影响。

L2正则化。可以使其中一些w变得很小,接近0,削弱某个特征的影响。Ridge回归。MSE(x)+α正则项(平方和),等价于权重衰减。

L1正则化。是其中一些w直接变为0,删除这个特征的影响。LASSO回归。正则项为权值向量的1范数,绝对值和。

弹性网络,混合L2和L1.

5)Dropout。随机以概率p激活一部分神经元,丢弃一部分神经元。集成学习,bagging。

6)Early Stopping。验证错误达到最小时停止训练。

2.GBDT

G-gradient,B-Boosting,DT-decision tree

2.1gradient

除了第一轮模型拟合的目标值是真实值, 其余轮次拟合的都是负梯度,可以理解为就是残差=真值-预测值(损失函数为mse时相同)。

详细公式

本质上拟合的不是真实值的残差,而是使损失函数最小化,与bp同。因此其学习得到的模型低偏差,高方差。

2.2boosting

Boosting本质上属于加法模型,前向分步算法。

f(x)=∑Mm=1βmb(x;γm)

b(x;γm)为基本分类器,γm为基本分类器的参数,βm为基本分类器的权重

前向分步算法

2.3decision tree

基模型为CART回归决策树。分裂标准为均方误差。

CART决策树——CART算法 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/418306627))

3.Adam

ADaGrad-对频繁变化的参数小步长更新,稀疏的参数大步长更新。增加了分母,梯度平方累计和的平方根。

RMSProp-结合梯度平方的指数移动平均数来调节学习率的变化。

Adam-对梯度的一阶矩估计(梯度平均值)和二阶矩估计(梯度未中心化的方差)综合考虑,计算出更新步长。

Adam优化器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Adam:
def __init__(self, loss, weights, lr=0.001, beta1=0.9, beta2=0.999, epislon=1e-8):
self.loss = loss
self.theta = weights
self.lr = lr
self.beta1 = beta1
self.beta2 = beta2
self.epislon = epislon
self.get_gradient = grad(loss)
self.m = 0
self.v = 0
self.t = 0

def minimize_raw(self):
self.t += 1
g = self.get_gradient(self.theta)
self.m = self.beta1 * self.m + (1 - self.beta1) * g
self.v = self.beta2 * self.v + (1 - self.beta2) * (g * g)
self.m_cat = self.m / (1 - self.beta1 ** self.t)
self.v_cat = self.v / (1 - self.beta2 ** self.t)
self.theta -= self.lr * self.m_cat / (self.v_cat ** 0.5 + self.epislon)

def minimize(self):
self.t += 1
g = self.get_gradient(self.theta)
lr = self.lr * (1 - self.beta2 ** self.t) ** 0.5 / (1 - self.beta1 ** self.t)
self.m = self.beta1 * self.m + (1 - self.beta1) * g
self.v = self.beta2 * self.v + (1 - self.beta2) * (g * g)
self.theta -= lr * self.m / (self.v ** 0.5 + self.epislon)

可以看出,对更新的步长计算,能够从梯度均值及梯度平方两个角度进行自适应地调节,而不是直接由当前梯度决定。

常见优化算法