第一讲 机器学习基础 游皓麟 《R语言机器学习》课程 R语言 PK Python 第一场:对数据分析建模的支持能力 那算什么。我拥有大量的数据分析包,它们组 成了一个很大的生态系统,无论是经典还是前 沿的方法,都有相应的包,可以直接使用。 我使用主要的数据分析包,比如pandas, scikit-learn,Numpy,Scipy等来实现,它们 提供一致的API,并且很好维护。 但是,用我写的程序性能和效率高啊。 我天生支持向量和矩阵运算,运用得好 的话,性能和效率不在话下。 额。 胜 败 R语言 PK Python 第二场:对数据处理和业务开发的支持能力 对于几十到几百兆的小数据,我支持 非常好,可以很快得到结果。 才几百兆啊,弱爆了。我可以轻松 处理上GB的数据。 额。 我还可以很方便地进行其它业务逻辑的 开发,比如网页、数据库、网络编程等 等。我属于工业级的编程语言,非常适 合做产品。 额。 败 胜 R语言 PK Python 综合评价 我觉得R语言很高效,很快就能看到分 析结果,极大地提升了工作效率。 我觉得python更像是一门编程语 言,除了数据分析挖掘之外,还可 以使用python进行科学计算,开 发业务逻辑,感觉很强悍。 Lift is short , you need R. You need python , too. 数据分析师 业务分析师 企业咨询顾问 软件攻城狮 程序猿 数据挖掘工程师 机器学习的理解 小强,这些是苹果~ 大家好,我是小强! 晓得了,圆圆红红的,一个鹅蛋那么大 小强,这些是桔子~ 这个哦,像个灯笼似的,一个鸡蛋那么大 小强,能告诉我这是什么吗? 老板,我确信,这是一个桔子^-^ 数据 + 算法 → 智能 机器学习的应用 场景一:图像识别 小强,能告诉我这辆车的牌照号码吗? 老板,这辆车的牌照号为“鲁S·34567”。 小强根据已有的使用机 器学习方法得到的字符 识别模型,通过如下的 过程依次进行处理,并 最终得到图像识别结果 牌照定位 字符分割 字符识别 3 机器学习的应用 场景二:语音识别 小强,这是什么歌? 语音输入 小强首先从语音输 入中提取出声音特 征,基于已有的模 型库进行模式识别 并得到了分析结果 语音信息预处理 特征提取 训练 识别 老板,这唱的是韩红的《青藏高原》呢。 识别结果 模式匹配 模型库 机器学习的应用 场景三:搜索引擎 人们一直在探索比关键词更高效的互联网搜索方式,很多学者预测,下一代搜索引擎将能够回答人们提出的问题,这种形式被称为自动问答。在搜狗推出中文知识图 谱服务“知立方”的时候,曾经以回答 “梁启超的儿子的太太的情人的父亲是谁?”这种近似脑筋急转弯的问题作为案例,来展示其知识图谱的强大推理能力 机器学习的应用 场景四:欺诈检测 小强,盯着交易记录,有情况随时通报~ 老板,检测到一个异常交易,极有可能是欺诈行为。 马上锁定交易,并备案处理 好的。 新交易记录 正常交易 分类器 欺诈行为 识别出结果 小强基于正常交易和欺诈行为的 数据,提前使用机器学习的方法 建立了一个欺诈检测模型。当接 输入新的交易记录时,模型会计 算出该交易为欺诈行为的概率大 小,小强正是基于这个结果向老 板汇报的 机器学习的应用 场景五:推荐系统 小强,看下亚马逊上有没有机器学习的新书适合我看~ 老板,根据你的个人喜好,推荐近期出版的一本新书,名叫《神经网络与机器学习》,你觉得如何? 我看过英文版,内容应该差不多,还没有推荐? 同时购买这一本书的用户,80%都购买了周志华教授写的《机器学习》,貌似还可以。 协同过滤算法过程 我听朋友说过,就买这本书吧。 思路:首先程序获取用户和产品的历史偏好,得到用户到产品的偏好矩阵, 利用Jaccard相似系数(Jaccard coefficient)、向量空间余弦相似度 (Cosine similarity)、皮尔逊相关系数(Pearson correlation coefficient)等相似度计算方法,得到相邻的用户(User CF)或相似商 品(Item CF)。在User CF中,基于用户历史偏好的相似度得到邻居用户, 将邻居用户偏好的产品推荐给该用户;在Item CF中,基于用户对物品的 偏好向量得到相似产品,然后把这款产品推荐给喜欢相似产品的其他用户。 机器学习的应用 场景六:负荷预测 小强,看看红色区域所在工厂明天的用电负荷曲线大概是什么样子? 老板,该工厂明天的负荷曲线,估计为下图的样子。 周期性 • 负荷以日、周、季为周期发生波动,大周期中含有小周期 波动性 • 负荷序列在取值较小的时段,其波动幅度较小,在取值较大 的时段,其波动的幅度较大 非平稳性 • 未来负荷基本上决定了过去负荷的情 况,但其方差是发散的,具有一定的 增长趋势 课程结构 第一讲 机器学习基础 第二讲 R语言基础 亮点:机器学习扫盲,举例介绍机器学习的用途,结合基础理论讲解最优 化及过拟合问题的处理思路 亮点:R语言入门,手把手教会你装上R工具,讲解常用的数据处理技巧 第三讲 聚类算法剖析 第四讲 关联算法剖析 亮点:通过一个手动演算案例,真切体会系统聚类的实现过程,此外,针 对生产中的实际问题提出了解决方案 亮点:通过三个手动演算案例,细致剖析Apriori、Eclat、SPADE三种关联 算法 课程结构 第五讲 随机森林剖析 第六讲 神经网络剖析 亮点:本课细致剖析了随机森林的实现原理以及变量重要性计算过程,进 一步对随机森林进行了并行化实现 亮点:神经网络深度理解,通过手动对BP、RBF、Elman三种神经网络进 行实现,真切体会神经网络的实现过程 第七讲 特征自动生成技术 亮点:基于对遗传算法和遗传编程的理解,进一步对特征自动生成技术进 行手动实现,并结合案例讲解 第八讲 R语言并行计算 亮点:以并行化为主题,介绍R语言的并行化方法,并通过案例进行讲解 课程结构 第九讲 精品案例:短期日负荷曲线预测 第十讲 课程回顾及总结 亮点:面向具体行业的精品案例,介绍从业务理解到模型评估的全过程, 并基于样例数据进行演练 亮点:温故而知新,本部分将对整个课程进行总结,并传授机器学习的运 用方法 推荐自学材料 监督学习 小强,知道猫长什么样子吗? 不知道,完全没概念 给你看些猫的图片,仔细看看,这些都是猫。 噢,晓得了,长毛的,尖耳朵的是猫。 小强,右边这张图片是猫吗? 是猫啊,有毛,并且是尖耳朵。 小强,你错了,这是兔子,不是猫,我再给你一些不是猫的图片,你再学习下。 小强,这张图片是猫吗? 小强,恭喜,你已经学会了分辨猫。 是猫。^-^ 好的,我学习了猫 的眼睛,鼻孔,胡 须以及体形特征与 其它动物的区别。 非监督学习 小强,你喜欢什么样的电影? 不知道呢,没看过电影。 我这里有100部电影,你先自己看下。 好的。看完了这些电影,我发现特别喜欢穿古装的,剧情略带搞笑的电影。 喜欢,符合我的口味。 最近出来一部《大话西游3》,你喜欢吗? 你是怎么知道,自己喜欢这种类型的? 电影看多了,就知道从哪些维度 来描述不同类型的电影。我发现 自己喜欢的电影,都有一个共同 特点,就是古装和搞笑。 小强,恭喜你,你会自学了。 一个栗子 小强,我现在使用函数𝑦 = 𝑥 2 − 25𝑥 − 10,生成了20条记录(加入噪声, 如下表所示),你能否通过机器学习的方法,根据这些记录数据,估计出 该函数? 序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 x -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 基础数据 y 320.848 300.5175 251.4618 219.1161 178.3663 122.4235 89.41713 54.25054 51.32403 6.873897 5.913801 -17.9918 -43.1719 -58.0725 -80.4275 -96.8598 -111.697 -147.738 -146 -137.206 -148.796 老板,这个可以有。 首先,我把这些数据,以x为横轴,以y为纵轴绘制出来,发现这些点接近二次曲线。 于是我假设y与x存在这样的关 系,即𝑦 = 𝑎𝑥 2 + 𝑏𝑥 + 𝑐 二次曲线 然后,问题转化为,根据这些记录,估计出a,b,c的值。 那不是很简单吗?随机找三条记录,然后解一个线性方 程组,不就求出a,b,c,的值来了。 如果数据准确地在二次曲线的点上,当然没有问题的。只 是真实的数据往往带有噪声,你这样得到的结果会不准。 比如第11条记录,当x=0时,y=5.9,直接把参数c求出来 了,但是它离真实值-10差得太远了。 一个栗子 那该怎么办?你还有高招? 其实有很多种办法可以估计出a,b,c,这里介绍一种简单的。 假设我们估计的表达式,能够完美地计算出y值,则可用矩阵表示如下关系: 𝒀𝑛×1 = 𝑿𝑛×3 𝑨3×1 2 其中,𝑿 = 𝒙 , 𝒙, 1 , 𝑨 = 𝑎, 𝑏, 𝑐 𝑇 那你怎么求矩阵𝑨呢? 𝑿并不是方阵。 这个简单,看我是怎么变换的。 首先两边同乘以一个矩阵𝑿3×𝑛 (即为𝑿𝑛×3 的转置),得到下式 𝑿3×𝑛 𝒀𝑛×1 = 𝑿3×𝑛 𝑿𝑛×3 𝑨3×1 由于𝑿3×𝑛 𝑿𝑛×3 的结果是方阵,可以等式两边同乘以它的逆,即可得 𝑨3×1 = (𝑿3×𝑛 𝑿𝑛×3 )−1 𝑿3×𝑛 𝒀𝑛×1 小强,真有你的。 接下来的事情就简单了,求出𝑿𝑛×3 及𝒀𝑛×1 ,最终计算出a,b,c的值分别为: a=0.9535374 b=-23.9618505 c=-5.7938784 即,估计的函数为𝑦 = 0.96𝑥 2 − 23.96𝑥 − 5.79 一个栗子 小强,不错哦。求出来的参数与真实参数很接近了。你这用的是啥方法呢? 这其实就是最小二乘法,针对这种线性参数情况,非常适用。 但是现实中的情况往往比这个复杂,比如 𝑦 = asin 𝑥 2 + 𝑏𝑥 𝑒 𝑐𝑥 + 𝑑 参数是非线性的,没法用矩阵线性表示出来。甚至某些场景下,参数比能 拿到的样本记录数要多,该怎么办? 老板,你问对人了。针对这种非线性的最优化问题,通常可以使用梯度下降的方法来处理。 啥子是梯度下降?感觉很高深的样子。 其实没那么深奥的,且听我慢慢道来。 梯度下降 在介绍梯度下降之前,首先回顾下数学中梯度的相关概念。 我们从方向导数说起,它在数学上的定义如下: 若函数𝑓(𝑥, 𝑦)在点𝑃(𝑥, 𝑦)处沿方向𝑙(方向角为𝛼, 𝛽)存在如下极限 ∆𝑓 𝑓 𝑥 + ∆𝑥, 𝑦 + ∆𝑦 − 𝑓(𝑥, 𝑦) 𝜕𝑓 𝜕𝑓 𝜕𝑓 lim = lim = = 𝑐𝑜𝑠𝛼 + 𝑐𝑜𝑠𝛽 𝜌→0 𝜌 𝜌→0 𝜌 𝜕𝑙 𝜕𝑥 𝜕𝑦 其中𝜌 = 𝑃𝑃1 = ∆𝑥 2 + ∆𝑦 2 𝜕𝑓 则称 为函数在点𝑃处沿方向𝑙的方向导数。方向导数反映了函数在某方向上变化快慢的程度。进一步,方向 𝜕𝑙 导数可表示为 𝜕𝑓 𝜕𝑓 𝜕𝑓 Ԧ 𝑙Ԧ , 𝑙Ԧ = 1 = , ∙ 𝑐𝑜𝑠𝛼, 𝑐𝑜𝑠𝛽 = 𝐺Ԧ ∙ 𝑙Ԧ = 𝐺Ԧ 𝑙Ԧ cos 𝐺, 𝜕𝑙 𝜕𝑥 𝜕𝑦 Ԧ 𝐺方向一致时,方向导数取最大值,亦即函数在梯度方向上变化最快。 Ԧ Ԧ 这里的向量𝐺就是梯度,当 𝑙与 这跟梯度下降又有什么关系呢? 在最优化问题中,通常包含两类问题,一类是求最大值,另一类是求最小值。通常沿着 梯度方向,可以快还到达极大值点,沿着负梯度方向,可以快速到达极小值点。由于求 最大值问题,可以转换为带负号的最小值问题。所以,实际中的大多数问题为求最小值 的情况。直观上,我们在求最小值的过程中,是一直沿着反梯度方向在下降的,当到达 终点无法下降时,便收敛了。通常这个过程又叫做梯度下降。 梯度下降 下面通过一个图形来更直观地解释。 这里假设函数𝑓定义在二维平面上,它的函数图像是个碗形,如图所示的曲线是等高线,即函数𝑓的不同常数时对应平面上 构成的曲线。箭头指向了梯度的反方向,该方向与对应点所在等高线垂直。沿着梯度的反方向前进,将快速到达碗底,即 函数𝑓的最小值点。 说了这么多,到底怎么应用呢? 其实也很简单,首先要确定曲面,也 就是目标函数。然后是变量,通常是 待估计的参数。每走一小步,我们叫 做一次迭代,都需要对参数按反梯度 方向进行调整,直到收敛。由于所得 到的参数,能够保证目标函数(比如 可以是残差平方和)最小,因此通常 认为是最优的参数,使用该参数的模 型可以很好地拟合现有数据。 当关于参数的目标函数是凸函数时,确定能收敛到最小值,否则,可能 收敛到的是局部最小值。 梯度下降 在上一个栗子中,我们也可以根据最小二乘法,计算残差平方和𝑆𝑆𝐸 ,其定义如下: 𝑛 𝑆𝑆𝐸 𝑎, 𝑏, 𝑐 = 𝑦𝑖 − 𝑦ෝ𝑖 2 , 且假设𝑦 ො = 𝑎𝑥 2 + 𝑏𝑥 + 𝑐 𝑖=1 𝑆𝑆𝐸 𝑎, 𝑏, 𝑐 就是目标函数,参数𝑎, 𝑏, 𝑐就是变量,为了使目标函数取得最小,这里计算梯度 𝑛 𝑛 𝑛 𝑔𝑟𝑎𝑑 𝑆𝑆𝐸 𝑎, 𝑏, 𝑐 = { 2 𝑦ෝ𝑖 − 𝑦𝑖 𝑥 2 , 2 𝑦ෝ𝑖 − 𝑦𝑖 𝑥 , 2(𝑦ෝ𝑖 − 𝑦𝑖 ) } 𝑖=1 开始时,会对参数a,b,c做初始化处理,进一步按如下的更新公式进行迭代更新: 𝑎𝑡 = 𝑎𝑡−1 − 𝛼 ∙ 𝜕𝑆𝑆𝐸(𝑎, 𝑏, 𝑐) 𝜕𝑎 𝑏𝑡 = 𝑏𝑡−1 − 𝛼 ∙ 𝜕𝑆𝑆𝐸(𝑎, 𝑏, 𝑐) 𝜕𝑏 𝑐𝑡 = 𝑐𝑡−1 − 𝛼 ∙ 𝜕𝑆𝑆𝐸(𝑎, 𝑏, 𝑐) 𝜕𝑐 其中𝑡表示迭代次数,𝛼为学习效率,控制学习的快慢程度。 𝑖=1 𝑖=1 梯度下降 这个结果与矩阵直接计算的结果十分接近呢 问个问题,看你代码里面迭代了10万次,每次迭代都要计算全量样本,是不是计算量太大了呢? 代码里没有判断终止条件,正常情况下当梯度调整量都小于一个很小的值或者残差平方和的变化量小于一个很小 值的时候就可以终止迭代了。你也可以设置最大迭代次数。 另外,代码使用的是批量梯度下降,即每次迭代要计算全量样本。在实际工作中,通常使用随机梯度下降(SGD) 的方法,即每次迭代中每样本更新参数,这在大量数据的情况下,收敛速度相对较快。 还有个问题,这里的参数都是无约束条件的,假如有条件约束,应该怎么处理呢? 这个通常考虑进行变量替换,比如参数a限定a>12, 则有𝑒 𝑚 = 𝑎 − 12 > 0,进一步得,𝑎 = 𝑒 𝑚 + 12,𝑚 ∈ 𝑅。显然这里的𝑚是无约 束的。其它情况可按类似的思路去处理。 可以用牛顿法。 实际问题中,如果数据量太大,有没有办法进一步提高收敛速度? 又是什么高深的算法?跟牛顿有关系吗? 且听我慢慢说来......... 牛顿法 牛顿法是牛顿在17世纪提出的一种在实数域和复数域上近似 求解方程的方法,其基本思想是利用目标函数的二次泰勒展 开,通过将其极小化,得到更新公式,从而迭代求解。 看到你的这些推导,我头都昏了@_@ 老板,其实只要掌握更新公式就行了。 设𝑥 ∗ 是方程𝑓 𝑥 = 0的根,𝑥𝑘 是𝑥 ∗ 的近似值且𝑓 𝑥𝑘 ≠ 0,把 𝑓 𝑥 在 𝑥𝑘 处作泰勒展开,可得 𝑓 ′′ (𝑥𝑘 ) ′ 𝑓 𝑥 = 𝑓 𝑥𝑘 + 𝑓 𝑥𝑘 𝑥 − 𝑥𝑘 + (𝑥 − 𝑥𝑘 )2 + ⋯ 2! 若取前两项来近似代替𝑓 𝑥 ,则可得近似的线性方程 𝑓 𝑥 ≈ 𝑓 𝑥𝑘 + 𝑓 ′ 𝑥𝑘 𝑥 − 𝑥𝑘 = 0 解该方程可得 𝑓 𝑥𝑘 𝑥𝑘+1 = 𝑥𝑘 − ′ 𝑓 𝑥𝑘 这称为牛顿法的迭代公式(求方程解)。如果𝑓 𝑥 是二次可 微函数,可取泰勒展开的二阶近似,得到 𝑓 ′′ (𝑥𝑘 ) ′ 𝑓 𝑥 ≈ 𝜙 𝑥 = 𝑓 𝑥𝑘 + 𝑓 𝑥𝑘 𝑥 − 𝑥𝑘 + (𝑥 − 𝑥𝑘 )2 2! 由于𝜙 𝑥 在𝜙 ′ 𝑥 = 0处取得极值点,可得 𝑓 ′ 𝑥𝑘 + 𝑓 ′′ 𝑥𝑘 𝑥 − 𝑥𝑘 = 0 进一步可得迭代公式(求极值点) 𝑓 ′ 𝑥𝑘 𝑥𝑘+1 = 𝑥𝑘 − ′′ 𝑓 (𝑥𝑘 ) 一元函数 还有栗子吗?想吃了^-^ 有的,下面基于第一个栗子进 行改进,并看下运行结果。 设𝑓(𝒙)是二次可微实函数,𝒙 ∈ 𝑹𝑛 ,又设𝒙𝑘 是𝑓(𝒙)的极小值点的一个估 计。把𝑓(𝒙)在𝒙𝑘 处进行泰勒展开,并取二阶近似,可得 𝟏 𝑓 𝒙 ≈ 𝜙 𝒙 = 𝑓 𝒙𝑘 + 𝛁𝒇 𝒙𝑘 𝑻 𝒙 − 𝒙𝑘 + 𝒙 − 𝒙𝑘 𝑻 𝛁𝟐 𝒇(𝒙𝑘 ) 𝒙 − 𝒙𝑘 𝟐 其中,𝛁 𝟐 𝒇(𝒙𝑘 )是𝑓(𝒙)在𝒙𝑘 处的𝑯𝒆𝒔𝒔𝒆矩阵,为求𝜙 𝒙 的极值点,令 𝜵𝜙 𝒙 = 𝟎 即 𝛁𝑓 𝒙𝑘 + 𝛁 𝟐 𝒇 𝒙𝑘 𝒙 − 𝒙𝑘 = 𝟎 假设𝛁 𝟐 𝒇(𝒙𝑘 )可逆,可得牛顿法的迭代公式 𝒙𝑘+1 = 𝒙𝑘 − 𝛁 𝟐 𝒇 𝒙𝑘 −𝟏 𝛁𝑓 𝒙𝑘 多元函数 牛顿法 使用牛顿法求解,我们第一步要明确目标函数,这里我们 仍然使用残差平方和(𝑆𝑆𝐸),即目标函数为 𝑛 𝑓 𝒗 = 𝑆𝑆𝐸 𝒗 = 𝑦𝑖 − 𝑦ෝ𝑖 其中 𝒀𝑛×1 = 𝑿𝑛×3 𝒗𝑇 , 𝒗 𝑖=1 = [𝑎 , 𝑏 , 𝑐]𝑇 , 𝑿 = 𝑥 2 , 𝑥, 1 其次,需要计算函数𝑓 𝒗 在𝒗𝑘 处的梯度,即 𝑛 2 𝑛 𝑛 𝜵𝑓 𝒗𝑘 = [ 2 𝑦ෝ𝑖 − 𝑦𝑖 𝑥 2 , 2 𝑦ෝ𝑖 − 𝑦𝑖 𝑥 , 2(𝑦ෝ𝑖 − 𝑦𝑖 ) ] 𝑖=1 𝑖=1 𝑖=1 其次,需要计算函数𝑓 𝒗 在𝒗𝑘 处的𝑯𝒆𝒔𝒔𝒆矩阵,即 𝑛 𝑥4 𝑥3 𝑥2 𝛁 𝟐 𝒇(𝒗𝑘 ) = 2 ∙ 𝑥 3 𝑥 2 𝑥 𝑖=1 𝑥 2 𝑥 1 很明显,这是一个对称矩阵,通过计算得知该矩阵的各阶 顺序主子式均大于等于0,因此该𝑯𝒆𝒔𝒔𝒆矩阵是半正定的, 可以断定,目标函数是一个凸函数。 这个好,基本上是一步到位,屌爆了 牛顿法 牛顿法与梯度下降相比,需要存储Hesse矩阵,随着处理变 量的增多,存储和计算的开销都特别大。有没有办法优化? 但是,当面对海量数据时,这两种算法在存储和计算上 都会有很大的开销。又该如何是好? 牛顿法的计算开销,主要是每次迭代需要进行求逆运算,如 果Hesse矩阵较大,这个过程的计算开销会很大。通常的做 法是使用拟牛顿法,即引入Hesse矩阵的近似矩阵,避免每 次都计算Hesse矩阵的逆。它的收敛速度会介于梯度下降和 牛顿法之间。 还是小强厉害,遇到问题,总会有办法解决~ 老板,莫急,实际工程中,我们还经常使用一种算法进行 优化求解,它是基于拟牛顿法改进而来的,叫做L-BFGS 算法 过拟合问题 小强,啥是过拟合啊? 过拟合说的是模型的泛化能力差,模型在训练集上表现好,用在测试集 上却很糟糕。说的是学习过头了。 能讲人话吗? 这样的话,有解决办法吗? 比如小明为了应付考试,把书上的答案都背了下来,可是并没有真正理 解,考试的时候仍然不会做,只有挂科了。 出现过拟合,通常是因为样本量较少造成的,如果让小明多做些类似 的题目,总会从里面找到解题规律的。 如果实在没办法引入更多的样本呢,该如何是好? 那就减少指标或属性,比如一些分类,由于类别太多,样 本量又少,导致分到各类下的样本量根本不够做模型。 可是我并不想丢掉这些数据呢,还有其它办法吗? 过拟合问题 当然有,比如使用正则化,在目标函数中,加上一个惩罚项,告诉算法 不要学得太过了,保守一些。 还比如说使用多个模型,对分类或预测结果综合评判,随机森林就是这 样的模型。 看来,做一个模型还真不容易啊。需要经得起实践的考验。 实践出真知^-^