阅读书籍为《Hands-On Machine Learning with Scikit-Learn & TensorFlow》王静源等翻译的中文译版《机器学习实战,基于 Scikit-Learn 和 TensorFlow》
1. 基于简单线性回归模型的两种模型训练方法
线性回归模型中的三个基本公式:
1.线性回归模型预测:
2.线性回归模型预测(向量化):
3.线性回归模型的MSE成本函数:
在本书第二章中我们学习到:回归模型最常见的 性能指标是均方根误差(RMSE),故我们在训练模型时需要找到使均方根误差最小的参数矩阵,实际的操作中均方误差(MSE)可以同样达到衡量性能的标准且更容易计算。(能使函数最小化的值,同样也可以使其平方根最小)
-
“ 闭式”方程法-利用标准方程直接计算出最适合训练集的模型参数(训练集上成本函数最小化的模型参数)
标准方程(仅适用于线性回归):
下面我们来实际测试其有效性:首先使用 y=4+3x+高斯噪音 生成一百个随机点: x = 2 * np.random.rand(100, 1) y = 4 + 3*x + np.random.randn(100, 1) plt.scatter(x, y)
接下来使用标准方程计算参数矩阵 x_b = np.c_[np.ones((100, 1)), x] theta_best = np.linalg.inv(x_b.T.dot(x_b)).dot(x_b.T).dot(y)
我们设定的参数是4,和3,得到了4.16和3.02,结果已经很接近了,因为我们添加了高斯噪音所以结果不可能完全一致。使用计算出来的最佳参数矩阵预测结果 x_new = np.array([[0], [2]]) x_new_b = np.c_[np.ones((2,1)), x_new] y_p = x_new_b.dot(theta_best)
使用标准方程通过矩阵来计算最佳参数矩阵,计算复杂度在2.4到3次方之间,但值得庆幸的一点是,参数矩阵一旦计算出来,其预测的时间复杂度就是线性的。迭代优化法-梯度下降(逐渐调整 模型参数直至训练集上的成本函数最小,最终趋同与第一种方法计算出来的模型参数)
梯度下降是指:首先使用一个随机的参数矩阵,然后逐步改进 ,每次试探着踏出一小步(步长就是我们所说的学习率),每次都尝试降低一点成本函数,直到算法收敛出一个最小值。
梯度下降的陷阱:局部最小并不是全局最小,我们需要找出全局最小的点。
梯度下降的流程:
- 计算关于参数的成本函数的偏导数(求得梯度向量,确定下降的方向):
- 使用计算出来的梯度向量乘以学习率确定下一步步长,然后更新参数矩阵:
梯度下降的方法有三:
- 批量梯度下降:每一步都使用全部的训练集数据进行计算更新(太慢)。
- 随机梯度下降:每一步只是用训练集中的一个随机数据进行更新(不准确)。
- 小批量梯度下降:每一步选取训练集中一定数量的数据进行计算更新。
- 计算关于参数的成本函数的偏导数(求得梯度向量,确定下降的方向):
线性回归算法中模型调整策略比较:
算法 | M很大 | 是否支持核外 | n很大 | 超参数 | 是否需要缩放 | scikit-Learn |
---|---|---|---|---|---|---|
标准方程 | 快 | 否 | 慢 | 0 | 否 | 线性回归 |
批量梯度下降 | 慢 | 否 | 快 | 2 | 是 | n/a |
随机梯度下降 | 快 | 是 | 快 | >=2 | 是 | SCD回归 |
小批量梯度下降 | 快 | 是 | 快 | >=2 | 是 | n/a |
2. 多项式回归中的讨论
-
多项式回归(用线性模型拟合非线性数据的一个简单方法就是将每个特征的幂次方添加为一个新特征,然后在这个拓展过的特征集上训练线性模型。这种方法被称为多项式回归。)
首先我们生成一个非线性带噪音的数据集 m = 100 x = 6*np.random.rand(m,1) - 3 y = 0.5 * x**2 + x + 2 + np.random.randn(m, 1) plt.scatter(x,y)
对于这个数据集,简单的线性模型已经明显不能符合要求,我们将使用scikit-Learn的 PolynomialFeatures类对训练集数据进行转换,将每个特征的平方(二次多项式) 作为新特征加入训练集(本数据集中只有一个特征)。 ploy = PolynomialFeatures(degree=2, include_bias=False) #此处的degree=特征的个数+1,这个函数可以将一个包含N 个特征的数组转换为包含(n+d)/(d!n!)个特征的数组,使用时应注意特征组合的数量爆炸。 X = ploy.fit_transform(x) print(X)
现在的X数据集包含原本的特征x和平方后的特征,现在对扩展后的训练集匹配一个 线性回归的模型: l_r = LinearRegression() l_r.fit(X, y) a = l_r.coef_[0][1] b = l_r.coef_[0][0] c = l_r.intercept_ y_1 = a*x**2 + b*x + c plt.scatter(x,y) plt.scatter(x, y_1)
-
学习曲线判断拟合情况
拟合情况可以从模型在训练集和测试集的泛化能力上看出:在训练集上好,但在测试集上不好为过拟合,如果在训练集和测试集上都不好为拟合不足;除了这种方法外,还可以通过学习曲线来判断拟合情况。
学习曲线:这个曲线绘制的是模型在训练集和测试集上,关于“训练集大小”的性能函数。(好的模型应该是训练误差和验证误差尽可能接近且都非常小)
用我们刚才的数据绘制学习曲线:蓝色为训练集,黄色为验证集:
这是一个拟合不足的学习曲线,当训练集的规模不断扩时,训练集误差一开始很小后来不断增加到达高点1后趋于平稳,测试集的误差一开始很大,但后来降低到1左右时趋于平稳,虽两者十分接近,但误差值很大。需要注意的是,当我们的模型对于训练数据拟合不足时,添加再多的数据也无济于事,应该着手于增加模型的复杂度。
这是一个过度拟合的学习曲线,当训练集的规模不断扩时,训练集误差一开始很小后来不断增加到达高点后趋于平稳,测试集的误差一直都跟验证集误差相距很远,差别很多,这是过度拟合的典型特征。对于这种情况我们应该着手于扩大训练集规模或降低模型复杂度(接下来一小节介绍几个降低模型复杂度的方法)。 -
降低过拟合风险的几个正则化技巧
1.岭回归(吉洪诺夫正则化,Ridge Regression)
岭回归是线性回归的正则化版,在线性回归的成本函数中增加一个正则项。
岭回归的成本函数如下:
注意:正则项只能在训练的时候添加到成本函数中,一旦训练完成,我们需要使用未经正则化的性能指标来评估模型性能;岭回归(大多数正则化模型)对输入特征的大小十分敏感,所以执行前,我们需要对数据进行缩放。2.套索回归(Lasso Regression)
这是线性回归的另一种正则化,叫做最小绝对收缩和选择算子回归。添加了一个与岭回归中不同的正则项:
套索回归的一个重要特点是,它倾向于完全消除最不重要的那个特征。3.弹性网络(Elastic Net)
弹性网络是岭回归于套索回归的中间领域,其正则项就是岭回归与套索回归的正则项的混合:
4.早期停止法
对于梯度下降这一类迭代学习的算法中,在验证误差达到最小值时停止训练。
对于随机梯度下降和小批量梯度下降来说,曲线不会有批量下降那么平滑,所以很难知道知否已将达到最小。解决的办法是等验证误差超过最小值一段时间之后再停止(确定刚才那个最小值是最佳停止点,往后不会再有更好的点出现),然后将模型参数回滚到验证误差最小的位置。不同情况下适用的正则化方法:
岭回归 | 套索回归 | 弹性回归 | 早期停止法 |
---|---|---|---|
大多数情况下的默认选择 | 实际使用的特征数量较少 | 实际使用的特征数量较少(一般情况下弹性优于套索) | 小批量梯度下降和随机梯度下降 |
3. logistic(逻辑)回归
逻辑回归被应用于估算一个实例属于某个特定类别的概率,如果预估概率超过百分五十,则判断是;如果预估概率低于百分之五十,则判断为否;这样就成为一个二元分类器。
可以理解为线性回归加上一个sigmoid概率映射函数,得到一个0到1的概率再通过与阈值0.5对比得出是否结果。
逻辑回归没有已知闭式方程(标准方程来计算最佳参数矩阵)只能通过梯度下降解决。
4. softmax(多元逻辑)回归
给定一个实例X,多元逻辑回归模型首先计算出每个类别K的分数(就是线性回归的计算公式,这里是指对每个类别都进行线性回归的计算),然后对这些K的分数应用softmax函数(归一化函数),估算出每个类别的概率。对这些类别对应的概率进行排序,选择概率最大的那个类别作为最终分类结果。
值得注意的是,虽然多元逻辑回归是一个多分类器,但是算法基于互斥的类别上,一次只有一个输出。我们可以分别植物的不同种类但却不能分别一个照片中的多个人。
类别K的softmax分数:
softmax函数(归一化函数):
softmax回归分类器预测(之所以直接对K的分数取最大,是因为归一化时K的分数在分子位置,分子最大也就是softmax值最大):
模型的训练与逻辑回归相似,没有现成的闭式方程,只能使用梯度下降。