轻松玩转 Scikit-Learn 系列 —— 梯度下降法

简介: 接触过机器学习的小伙伴都应该知道,梯度下降法并不是一个机器学习算法,而是一种基于搜索的最优化方法,在机器学习尤其是深度学习的凸优化中使用尤为广泛。给定一个损失函数,如果该函数是凸函数,在学习率合适的情况下,它能够快速搜索到极小值。类似的还有梯度上升法,只是变换下正负号而已,一个是最大化效用函数,一个是最小化损失函数或者成本函数。在求一个函数的最大值或最小值时,沿其梯度方向进行搜索可能是最有效也是最普遍的方法之一。

接触过机器学习的小伙伴都应该知道,梯度下降法并不是一个机器学习算法,而是一种基于搜索的最优化方法,在机器学习尤其是深度学习的凸优化中使用尤为广泛。给定一个损失函数,如果该函数是凸函数,在学习率合适的情况下,它能够快速搜索到极小值。类似的还有梯度上升法,只是变换下正负号而已,一个是最大化效用函数,一个是最小化损失函数或者成本函数。在求一个函数的最大值或最小值时,沿其梯度方向进行搜索可能是最有效也是最普遍的方法之一。

image.jpeg

我们拿单一变量的凸函数来举个栗子,如上图。假如搜索的初始点在极小值的右边,其梯度(即导数)为正,则其负梯度方向是从当前位置指向极小值点的方向;假如搜索的初始点在极小值的左边,则其负梯度方向也是为从当前的搜索位置指向局部极小值的。由相关数学证明也可推得连续凸函数的负梯度方向总是指向局部极小值点,正梯度方向总是指向其局部极大值点。同时,也必须控制梯度下降的步长,即需要在梯度之前加上一个系数——学习率,否则可能会导致两个不良后果。

  1. 在搜索极小值的过程中搜索点在极小值点的周围来回跳动,不断震荡,但是仍然可以收敛到极小值;
  2. 在搜索过程中,所计算的梯度越来越大,甚至导致计算上溢,搜索失败。如下图所示。

60.jpg


所以给梯度下降配上学习率,尤其是选择合适大小的学习率尤其重要。在深度学习中甚至专门有自适应调整学习率的算法,例如大名鼎鼎的 Adam,还有 AdaGrad 和 RMSProp 等,感兴趣的小伙伴去查阅下花书。

因为搜索初始点的关系,我们搜索到的极小值点可能并非是全局极小值点而只是局部极小值点,这依赖于搜索初始点的位置,广泛采用的解决方案就是进行多次搜索,每次都随机的在搜索域产生初始搜索点。重复搜索的次数越多,越有可能找到全局极小值点。

当在学习的过程中如果训练样本非常多的话,因为最终的代价函数是每个样本代价函数的总和,所以再求梯度的时候每个样本点都会参与进去,所以以上的梯度下降也叫做批量梯度下降。较大的训练数据集也意味着较大的计算成本,那我们利用以局部代替整体的思想,从训练数据集中随机抽取出一部分样本点来代替整个数据集,以减小计算开销,其实这就是深度学习中广泛采用的随机梯度下降法。废话有点多,接下来上代码。

61.jpg

之后实例化一个对象,训练模型求其准确率。

62.jpg


结果:

CPU times: user 2 ms, sys: 941 µs, total: 2.94 ms

Wall time: 1.38 ms

0.73551631052094557

实例化一个使用随机梯度下降的线性回归模型。

63.jpg


得到结果:

CPU times: user 902 µs, sys: 469 µs, total: 1.37 ms

Wall time: 766 µs

0.74803818104616793


一些细心的小伙伴看到我从 scikit-learn 的 linear_model 直接 import SGDRegressor(),实例化后直接拿去训练而在这过程中并没有传入其他的机器学习模型感到奇怪,因为前面说了梯度下降只是优化算法,而不是机器学习的模型学习算法。


的确是这样,正如注释里所说,scikit-learn 之所以可以这样做是因为它在 SGDRegressor() 中集成的是线性回归,在学习模型的过程中使用的随机梯度下降进行优化搜索,使用了随机梯度下降法的默认模型似乎比没有使用该算法的模型准确率稍微有所提高,训练速度也会稍微快了一些。

接下来我们介绍下一些可调整的超参数,并进行调参,顺便看下调过参后一些模型的表现。


  • loss:用于选择损失函数,默认 loss=’squared_loss’,表示损失函数为预测值与实际值差的平方和,其他还有 ‘huber’, ‘epsilon_insensitive’等;
  • penalty:正则项的惩罚方式,默认 penalty=’l2’, 使用 L2 正则,‘l1’ 和 ‘elasticnet’ ;
  • random_state:shuffle 数据时使用其来种随机种子;
  • n_iter:对训练数据集重复训练的次数,深度学习中常用 Epoch 表示;

更多超参数请小伙伴们自行查阅官方文档,我就不啰嗦啦!


设置 n_iter 超参如下,得到对应结果 。

64.jpg


CPU times: user 1.7 ms, sys: 659 µs, total: 2.36 ms

Wall time: 1.17 ms

0.74863538201180846


与 sgd_reg 相比只能算是略微的提高,那再变大试试。

65.jpg


CPU times: user 6.8 ms, sys: 789 µs, total: 7.59 ms

Wall time: 6.14 ms

0.73539011191275572

聪明的读者有没有发现这个问题,迭代次数增加,精确度并不一定增加 。为啥呢?


已知 n_iter 是训练数据集重复训练的次数,当 n_iter 过大时,很可能是在训练数据集上发生了过拟合,导致模型 sgd_reg3 的准确率与前者相比却有所下降。而且随着 n_iter 的变大,训练时间会延长。


没有免费的午餐定理表明:在所有可能的数据生成分布上平均之后,每一个分类算法在未事先观测的点上都有相同的错误率。换言之,在某种意义上,没有一个机器学习算法总是比其他的要好。最先进的算法和简单地将所有点归为同一类的简单算法有着相同的平均性能。


今天的分享就到这里了,关于 SGDRegressor 模型还有很多其他超参数的调整,请小伙伴们自己在下面亲手操作下,会收获更多哦。还是那句话,如果你们中有大神路过,还请高抬贵脚,勿踩勿喷。好了,期待与小伙伴们共同进步!

相关文章
|
18天前
|
机器学习/深度学习 数据采集 算法
Python机器学习:Scikit-learn库的高效使用技巧
【10月更文挑战第28天】Scikit-learn 是 Python 中最受欢迎的机器学习库之一,以其简洁的 API、丰富的算法和良好的文档支持而受到开发者喜爱。本文介绍了 Scikit-learn 的高效使用技巧,包括数据预处理(如使用 Pipeline 和 ColumnTransformer)、模型选择与评估(如交叉验证和 GridSearchCV)以及模型持久化(如使用 joblib)。通过这些技巧,你可以在机器学习项目中事半功倍。
24 3
|
23天前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
机器学习基础:使用Python和Scikit-learn入门
28 1
|
1月前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
【10月更文挑战第12天】本文介绍了如何使用Python和Scikit-learn进行机器学习的基础知识和入门实践。首先概述了机器学习的基本概念,包括监督学习、无监督学习和强化学习。接着详细讲解了Python和Scikit-learn的安装、数据处理、模型训练和评估等步骤,并提供了代码示例。通过本文,读者可以掌握机器学习的基本流程,并为深入学习打下坚实基础。
23 1
|
1月前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
本文介绍了如何使用Python和Scikit-learn进行机器学习的基础知识和实践。首先概述了机器学习的基本概念,包括监督学习、无监督学习和强化学习。接着详细讲解了Python和Scikit-learn的安装、数据处理、模型选择与训练、模型评估及交叉验证等关键步骤。通过本文,初学者可以快速上手并掌握机器学习的基本技能。
53 2
|
1月前
|
机器学习/深度学习 数据挖掘 Serverless
手把手教你全面评估机器学习模型性能:从选择正确评价指标到使用Python与Scikit-learn进行实战演练的详细指南
【10月更文挑战第10天】评估机器学习模型性能是开发流程的关键,涉及准确性、可解释性、运行速度等多方面考量。不同任务(如分类、回归)采用不同评价指标,如准确率、F1分数、MSE等。示例代码展示了使用Scikit-learn库评估逻辑回归模型的过程,包括数据准备、模型训练、性能评估及交叉验证。
65 1
|
1月前
|
机器学习/深度学习 人工智能 数据挖掘
机器学习基础:使用Python和Scikit-learn入门
【10月更文挑战第6天】在人工智能领域,机器学习已成为核心技术。本文指导初学者使用Python与Scikit-learn入门机器学习,涵盖基本概念、环境搭建、数据处理、模型训练及评估等环节。Python因简洁性及其生态系统成为首选语言,而Scikit-learn则提供了丰富工具,简化数据挖掘与分析流程。通过实践示例,帮助读者快速掌握基础知识,为进一步深入研究奠定坚实基础。
28 4
|
1月前
|
机器学习/深度学习 数据采集 算法
【Python篇】从零到精通:全面分析Scikit-Learn在机器学习中的绝妙应用
【Python篇】从零到精通:全面分析Scikit-Learn在机器学习中的绝妙应用
38 2
|
6月前
|
机器学习/深度学习 算法 TensorFlow
【Python机器学习】梯度下降法的讲解和求解方程、线性回归实战(Tensorflow、MindSpore平台 附源码)
【Python机器学习】梯度下降法的讲解和求解方程、线性回归实战(Tensorflow、MindSpore平台 附源码)
179 0
|
机器学习/深度学习 Python 算法
Python机器学习(三):梯度下降法
梯度下降法不是一种机器学习方法,而是一种基于搜索的最优化方法,它的作用的最小化一个损失函数。相应地,梯度上升可以用于最大化一个效用函数。本文主要讲解梯度下降。
2252 0
|
7天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。