机器学习实用指南:训练和损失函数

弹性网络(elasticnet)
弹性网络介于 ridge 回归和 lasso 回归之间。它的正则项是 ridge 回归和 lasso 回归正则项的简单混合,同时你可以控制它们的混合率 $r$,当 $r=0$ 时,弹性网络就是 ridge 回归,当 $r=1$ 时,其就是 lasso 回归。具体表示如公式 4-12。
公式 4-12:弹性网络损失函数
$$ j( heta)=mse( heta)+ralphasumlimits_{i=1}^nleft| heta_i ight|+frac{1-r}{2}alphasumlimits_{i=1}^n heta_i^2 $$
那么我们该如何选择线性回归,岭回归,lasso 回归,弹性网络呢?一般来说有一点正则项的表现更好,因此通常你应该避免使用简单的线性回归。岭回归是一个很好的首选项,但是如果你的特征仅有少数是真正有用的,你应该选择 lasso 和弹性网络。就像我们讨论的那样,它两能够将无用特征的权重降为零。一般来说,弹性网络的表现要比 lasso 好,因为当特征数量比样本的数量大的时候,或者特征之间有很强的相关性时,lasso 可能会表现的不规律。下面是一个使用 scikit-learn elasticnet(l1_ratio指的就是混合率 $r$)的简单样本:
>>> from sklearn.linear_model import elasticnet >>> elastic_net = elasticnet(alpha=0.1, l1_ratio=0.5) >>> elastic_net.fit(x, y) >>> elastic_net.predict([[1.5]]) array([ 1.54333232])
早期停止法(early stopping)
对于迭代学习算法,有一种非常特殊的正则化方法,就像梯度下降在验证错误达到最小值时立即停止训练那样。我们称为早期停止法。图 4-20 表示使用批量梯度下降来训练一个非常复杂的模型(一个高阶多项式回归模型)。随着训练的进行,算法一直学习,它在训练集上的预测误差(rmse)自然而然的下降。然而一段时间后,验证误差停止下降,并开始上升。这意味着模型在训练集上开始出现过拟合。一旦验证错误达到最小值,便提早停止训练。这种简单有效的正则化方法被 geoffrey hinton 称为“完美的免费午餐”
图 4-20:早期停止法
提示
随机梯度和小批量梯度下降不是平滑曲线,你可能很难知道它是否达到最小值。 一种解决方案是,只有在验证误差高于最小值一段时间后(你确信该模型不会变得更好了),才停止,之后将模型参数回滚到验证误差最小值。
下面是一个早期停止法的基础应用:
from sklearn.base import clone sgd_reg = sgdregressor(n_iter=1, warm_start=true, penalty=none,learning_rate=constant, eta0=0.0005) minimum_val_error = float(inf) best_epoch = none best_model = none for epoch in range(1000): sgd_reg.fit(x_train_poly_scaled, y_train) y_val_predict = sgd_reg.predict(x_val_poly_scaled) val_error = mean_squared_error(y_val_predict, y_val) if val_error < minimum_val_error: minimum_val_error = val_error best_epoch = epoch best_model = clone(sgd_reg)
注意:当warm_start=true时,调用fit()方法后,训练会从停下来的地方继续,而不是从头重新开始。
逻辑回归
正如我们在第1章中讨论的那样,一些回归算法也可以用于分类(反之亦然)。 logistic 回归(也称为 logit 回归)通常用于估计一个实例属于某个特定类别的概率(例如,这电子邮件是垃圾邮件的概率是多少?)。 如果估计的概率大于 50%,那么模型预测这个实例属于当前类(称为正类,标记为“1”),反之预测它不属于当前类(即它属于负类 ,标记为“0”)。 这样便成为了一个二元分类器。
概率估计
那么它是怎样工作的? 就像线性回归模型一样,logistic 回归模型计算输入特征的加权和(加上偏差项),但它不像线性回归模型那样直接输出结果,而是把结果输入logistic()函数进行二次加工后进行输出(详见公式 4-13)。
公式 4-13:逻辑回归模型的概率估计(向量形式)
$$ hat{p}=h_ heta(mathbf{x})=sigma( heta^t cdot mathbf{x}) $$
logistic 函数(也称为 logit),用 $sigma()$ 表示,其是一个 sigmoid 函数(图像呈 s 型),它的输出是一个介于 0 和 1 之间的数字。其定义如公式 4-14 和图 4-21 所示。
公式 4-14:逻辑函数
$$ sigma(t)=frac{1}{1+exp(-t)} $$
图4-21:逻辑函数
一旦 logistic 回归模型估计得到了 $mathbf{x}$ 属于正类的概率 $hat{p}=h_ heta(mathbf{x})$,那它很容易得到预测结果 $hat{y}$(见公式 4-15)。
公式 4-15:逻辑回归预测模型
$$ hat{y}= egin{cases} 0, &hat{p}<0.5 1,&hat{p}geq0.5 end{cases} $$
注意当 $t<0$ 时 $sigma(t)>> from sklearn import datasets >>> iris = datasets.load_iris() >>> list(iris.keys()) ['data', 'target_names', 'feature_names', 'target', 'descr'] >>> x = iris[data][:, 3:] # petal width >>> y = (iris[target] == 2).astype(np.int)
接下来,我们训练一个逻辑回归模型:
from sklearn.linear_model import logisticregression log_reg = logisticregression() log_reg.fit(x, y)
我们来看看模型估计的花瓣宽度从 0 到 3 厘米的概率估计(如图 4-23):
x_new = np.linspace(0, 3, 1000).reshape(-1, 1) y_proba = log_reg.predict_proba(x_new) plt.plot(x_new, y_proba[:, 1], g-, label=iris-virginica) plt.plot(x_new, y_proba[:, 0], b--, label=not iris-virginica
图 4-23:概率估计和决策边界
virginica 花的花瓣宽度(用三角形表示)在 1.4 厘米到 2.5 厘米之间,而其他种类的花(由正方形表示)通常具有较小的花瓣宽度,范围从 0.1 厘米到 1.8 厘米。注意,它们之间会有一些重叠。在大约 2 厘米以上时,分类器非常肯定这朵花是virginica花(分类器此时输出一个非常高的概率值),而在1厘米以下时,它非常肯定这朵花不是 virginica 花(不是 virginica 花有非常高的概率)。在这两个极端之间,分类器是不确定的。但是,如果你使用它进行预测(使用predict()方法而不是predict_proba()方法),它将返回一个最可能的结果。因此,在 1.6 厘米左右存在一个决策边界,这时两类情况出现的概率都等于 50%:如果花瓣宽度大于 1.6 厘米,则分类器将预测该花是 virginica,否则预测它不是(即使它有可能错了):
>>> log_reg.predict([[1.7], [1.5]]) array([1, 0])
图 4-24 表示相同的数据集,但是这次使用了两个特征进行判断:花瓣的宽度和长度。 一旦训练完毕,logistic 回归分类器就可以根据这两个特征来估计一朵花是 virginica 的可能性。 虚线表示这时两类情况出现的概率都等于 50%:这是模型的决策边界。 请注意,它是一个线性边界。每条平行线都代表一个分类标准下的两两个不同类的概率,从 15%(左下角)到 90%(右上角)。越过右上角分界线的点都有超过 90% 的概率是 virginica 花。
图 4-24:线性决策边界
就像其他线性模型,逻辑回归模型也可以 $ell_1$ 或者 $ell_2$ 惩罚使用进行正则化。scikit-learn 默认添加了 $ell_2$ 惩罚。
注意
在 scikit-learn 的logisticregression模型中控制正则化强度的超参数不是 $alpha$(与其他线性模型一样),而是它的逆:$c$。 $c$ 的值越大,模型正则化强度越低。
softmax 回归
logistic 回归模型可以直接推广到支持多类别分类,不必组合和训练多个二分类器(如第 3 章所述), 其称为 softmax 回归或多类别 logistic 回归。
这个想法很简单:当给定一个实例 $mathbf{x}$ 时,softmax 回归模型首先计算 $k$ 类的分数 $s_k(mathbf{x})$,然后将分数应用在softmax函数(也称为归一化指数)上,估计出每类的概率。 计算 $s_k(mathbf{x})$ 的公式看起来很熟悉,因为它就像线性回归预测的公式一样(见公式 4-19)。
公式 4-19:k类的 softmax 得分
$$ s_k(mathbf{x})= heta^t cdot mathbf{x} $$
注意,每个类都有自己独一无二的参数向量 $ heta_k$。 所有这些向量通常作为行放在参数矩阵 $theta$ 中。
一旦你计算了样本 $mathbf{x}$ 的每一类的得分,你便可以通过softmax函数(公式 4-20)估计出样本属于第 $k$ 类的概率 $hat{p}_k$:通过计算 $e$ 的 $s_k(mathbf{x})$ 次方,然后对它们进行归一化(除以所有分子的总和)。
公式 4-20:softmax 函数
$$ hat{p_k}=sigma{(mathbf{s}(mathbf{x}))}k= frac{expleft(s_k(mathbf{x}) ight)} {sum_{j=1}^{k}expleft(s_j(mathbf{x}) ight)} $$
$k$ 表示有多少类
$mathbf{s}(mathbf{x})$ 表示包含样本 $mathbf{x}$ 每一类得分的向量
$sigma{(mathbf{s}(mathbf{x}))_k}$ 表示给定每一类分数之后,实例 $mathbf{x}$ 属于第 $k$ 类的概率
和 logistic 回归分类器一样,softmax 回归分类器将估计概率最高(它只是得分最高的类)的那类作为预测结果,如公式 4-21 所示。
公式 4-21:softmax 回归模型分类器预测结果
$$ hat{y}=argmax sigma{(mathbf{s}(mathbf{x}))_k}=argmax s_k(mathbf{x})=argmax left( heta_k^t cdot mathbf{x} ight) $$
argmax运算返回一个函数取到最大值的变量值。 在这个等式,它返回使 $sigma{(mathbf{s}(mathbf{x}))_k}$ 最大时的 $k$ 的值
注意
softmax 回归分类器一次只能预测一个类(即它是多类的,但不是多输出的),因此它只能用于判断互斥的类别,如不同类型的植物。 你不能用它来识别一张照片中的多个人。
现在我们知道这个模型如何估计概率并进行预测,接下来将介绍如何训练。我们的目标是建立一个模型在目标类别上有着较高的概率(因此其他类别的概率较低),最小化公式 4-22 可以达到这个目标,其表示了当前模型的损失函数,称为交叉熵,当模型对目标类得出了一个较低的概率,其会惩罚这个模型。 交叉熵通常用于衡量待测类别与目标类别的匹配程度(我们将在后面的章节中多次使用它)
公式 4-22:交叉熵
$$ j(theta)=-frac{1}{m}sumlimits_{i=1}^msumlimits_{k=1}^ky_k^{(i)}logleft(hat{p}_k^{(i)} ight) $$
如果对于第 $i$ 个实例的目标类是 $k$,那么 $y_k^{(i)}=1$,反之 $y_k^{(i)}=0$。
可以看出,当只有两个类($k=2$)时,此损失函数等同于 logistic 回归的损失函数(对数损失;请参阅公式 4-17)。
交叉熵
交叉熵源于信息论。假设你想要高效地传输每天的天气信息。如果有八个选项(晴天,雨天等),则可以使用3位对每个选项进行编码,因为 $2^3=8$。但是,如果你认为几乎每天都是晴天,更高效的编码“晴天”的方式是:只用一位(0)。剩下的七项使用四位(从 1 开始)。交叉熵度量每个选项实际发送的平均比特数。 如果你对天气的假设是完美的,交叉熵就等于天气本身的熵(即其内部的不确定性)。 但是,如果你的假设是错误的(例如,如果经常下雨)交叉熵将会更大,称为 kullback-leibler 散度(kl 散度)。
两个概率分布 $p$ 和 $q$ 之间的交叉熵定义为:$h(p,q)=-sum_xp(x)log q(x)$(分布至少是离散的)
这个损失函数关于 $ heta_k$ 的梯度向量为公式 4-23:
公式 4-23:k类交叉熵的梯度向量
$$ abla_{ heta_k}j(theta)=frac{1}{m}sumlimits_{i=1}^mleft(hat{p}_k^{(i)}-y_k^{(i)} ight)mathbf{x}^{(i)} $$
现在你可以计算每一类的梯度向量,然后使用梯度下降(或者其他的优化算法)找到使得损失函数达到最小值的参数矩阵 $theta$。
让我们使用 softmax 回归对三种鸢尾花进行分类。当你使用logisticrregression对模型进行训练时,scikit learn 默认使用的是一对多模型,但是你可以设置multi_class参数为“multinomial”来把它改变为 softmax 回归。你还必须指定一个支持 softmax 回归的求解器,例如“lbfgs”求解器(有关更多详细信息,请参阅 scikit-learn 的文档)。其默认使用 $ell_12$ 正则化,你可以使用超参数 $c$ 控制它。
x = iris[data][:, (2, 3)] # petal length, petal width y = iris[target] softmax_reg = logisticregression(multi_class=multinomial,solver=lbfgs, c=10) softmax_reg.fit(x, y)
所以下次你发现一个花瓣长为 5 厘米,宽为 2 厘米的鸢尾花时,你可以问你的模型你它是哪一类鸢尾花,它会回答 94.2% 是 virginica 花(第二类),或者 5.8% 是其他鸢尾花。
>>> softmax_reg.predict([[5, 2]]) array([2]) >>> softmax_reg.predict_proba([[5, 2]]) array([[ 6.33134078e-07, 5.75276067e-02, 9.42471760e-01]])
图 4-25:softmax 回归的决策边界
图 4-25 用不同背景色表示了结果的决策边界。注意,任何两个类之间的决策边界是线性的。 该图的曲线表示 versicolor 类的概率(例如,用 0.450 标记的曲线表示 45% 的概率边界)。注意模型也可以预测一个概率低于 50% 的类。 例如,在所有决策边界相遇的地方,所有类的估计概率相等,分别为 33%。
练习
如果你有一个数百万特征的训练集,你应该选择哪种线性回归训练算法?
假设你训练集中特征的数值尺度(scale)有着非常大的差异,哪种算法会受到影响?有多大的影响?对于这些影响你可以做什么?
训练 logistic 回归模型时,梯度下降是否会陷入局部最低点?
在有足够的训练时间下,是否所有的梯度下降都会得到相同的模型参数?
假设你使用批量梯度下降法,画出每一代的验证误差。当你发现验证误差一直增大,接下来会发生什么?你怎么解决这个问题?
当验证误差升高时,立即停止小批量梯度下降是否是一个好主意?
哪个梯度下降算法(在我们讨论的那些算法中)可以最快到达解的附近?哪个的确实会收敛?怎么使其他算法也收敛?
假设你使用多项式回归,画出学习曲线,在图上发现学习误差和验证误差之间有着很大的间隙。这表示发生了什么?有哪三种方法可以解决这个问题?
假设你使用岭回归,并发现训练误差和验证误差都很高,并且几乎相等。你的模型表现是高偏差还是高方差?这时你应该增大正则化参数 $alpha$,还是降低它?
你为什么要这样做:
使用岭回归代替线性回归?
lasso 回归代替岭回归?
弹性网络代替 lasso 回归?
假设你想判断一副图片是室内还是室外,白天还是晚上。你应该选择二个逻辑回归分类器,还是一个 softmax 分类器?
在 softmax 回归上应用批量梯度下降的早期停止法(不使用 scikit-learn)。

Arduino控制DS1302时钟芯片(ds1302引脚图及功能和应用电路)
小间距LED显示屏在会议室有什么神通?
广东省中医院采用手术机器人,推动医疗智能技术新升级
三星GalaxyNote10的CAD渲染图曝光
网络综合布线错误会有哪些情况
机器学习实用指南:训练和损失函数
运动无线蓝牙耳机哪款好,运动蓝牙跑步耳机品牌排行榜
马斯克:今年年底前推出全自动驾驶技术
详细介绍RF芯片测试夹具在微波测量中的应用及仿真对比
三菱PLC如何控制变频器详细方法解析
Windows10更新太频繁,所以将会推出让你“暂停”更新的更新的新功能
LCD电视背光、I/O端口及电源的电路保护设计
第二十三届中国国际高新技术成果交易会在深圳拉开帷幕
发光二极管限流电阻一般多大 发光二极管的限流电阻怎么确定
威盛出售部分x86技术给上海兆芯集成电路
CAN总线通信防护电路设计
5G为电信联通合并提供最佳时机
英特尔实现大规模生产3D封装技术Foveros
君鉴科技IME2023上海展精彩收官 多套行业解决方案引关注
AWTK GUI框架可轻松做出炫酷效果的GUI引擎