zoukankan      html  css  js  c++  java
  • 机器学习实记(二)数值回归的案例

    一.写在前面

      本节主要讲的是上一节学习图中的按目标分类的橙色方块中的regression,即所要解决的问题的解为数值。本节由一个案例贯穿,即预测神奇宝贝进化后的战斗力,挺有趣的一个案例。本节略长,请耐心看,相信会有收获的,做我们这行的最重要的就是要有耐心。

    二.案例说明

      所要研究的案例是想要预测神奇宝贝进化后的战斗力用cp值表示,具体案例描述如下图2-1。

                            图2-1 案例描述

    图中有几个变量这里做个介绍xcp为未进化前的战斗力值,xhp为该物种的生命值,xw为该物种的体重,xh为该物种的身高,而我们所要做的就是寻找到这样一个函数f,它以这些变量作为输入,输出进化后的战斗力y。

    三.从机器学习角度来研究该案例

      在上一节中曾提到过机器学习的三个步骤即机器学习的框架,接下来就按照者三个步骤来分析这个案例。

    3.1 定义函数池

      首先我们需要定义一个函数池即需要定义模型,还记的学习图中蓝色模块的含义吗?在这里就是决定你所定义的模型是属于什么类型的,可以是线性的linear model 也可以是非线性的non-linear model ,这里为便于讲解先假设为线性模型,并且暂时仅考虑xcp这一个变量,假设的模型如图3-1

                             图3-1 假设的初始模型

    从图3-1中可以看到假设的模型为y=b+w*xcp,其中w称为xcp这个变量所占的权重,b为偏移量,按照这个模型可以随机初始化w和b的值获得不限数量的函数f,当将其他生命值、体重的变量也考虑在内,就得到图中右下角的模型,这里公式不太好编写,就写成拆开的形式y = b+w1*xcp+w2*xw+w3*xh+...wi*xi

    3.2 对各个函数评价

      在完成了函数池的定义之后,就需要一种机制来评价各个函数的好坏,这里就有两个角度了,你可以评价一个函数有多好你也可以评价一个函数有多差,本案例中使用的是loss function 即损失函数L用于评价一个函数有多差,其值越大表示一个函数越差。损失函数L是将函数池中的函数作为输入,它的定义可以有很多种,在这个案例使用的损失函数如图3-2

                            图3-2 损失函数

    图中的损失函数就是用训练数据中神奇宝贝进化后的真实值减去函数池中选出的一个函数进行预测得到的预测值,再对这些值平方后进行累加。这里额外将讲一下损失函数的定义完全是可以由你自己决定的,会受到具体所要研究的问题的影响。

    3.3 选出最优的函数

    3.3.1 使用梯度下降的方式

      通过初始化各变量对应的权重参数wi和偏移量b可以得到大量的函数,如何根据损失函数选出最优的函数,所谓的最优函数就是使损失函数达到最小,而损失函数的输入是函数池中的函数,函数池中的函数的变量是wi(i=1,2,3,4....)和b,也就是说损失函数也是wi和b的函数,那么问题就转变为确定wi(i=1,2,3,4....),b的值使损失函数的值达到最小。在这里使用梯度下降的方法来求这个wi和b,梯度下降的概念十分重要,这里只做初步的讲解,不是本节的重点之后会重点提到,简单来说梯度下降的思想类似于下山,当你处于山上的某一处时你想要下山,你可以这么做沿着当前所在位置寻找一条最为陡峭的向下的方向,沿着这个方向迈出一步,然后在新的起点不断重复这个过程。具体的举个例子,为了举例方便,简化了损失函数L,假设L仅与一个变量w相关,即L(f) = L(w),例子如图3-3

           

                           图3-3梯度下降

    先对图中所描述的过程进行一个讲解,首先我们要求的是使损失函数L达到最小时的w的值,先随机初始一个w的值w0,然后找出该点的梯度,然后根据梯度值的正负决定本次调整的方向,图中例子w0处的梯度为负值,这表明在w0的右侧领域函数的值是下降的,所以下一个点调整的方向为向右侧方向,这就像之前提到的下山,先确定出下山的方向,当确定完下山的方向后,便要迈出脚步下山,而这一步要迈多大,即对w0调整该有多大这受到两个因素的影响,一个是w0出的梯度值,还有一个就是被称为学习率的值就是图中红色的字母n,具体的公式图中已经给出,可以按照图中的公式不断进行梯度下降得到w1,w2....,但当到达点wt时发现该点的梯度值为0,则无法再继续进行梯度下降,梯度下降过程结束机器将wt认为是最优点,但我们通过观察图形可以发现wt并不是全局最优点只是局部最优点,这个现象称为陷入局部最优,至于解决的方法在之后的章节将提到。以上所讲的假设是单个变量的情形,多变量的情形与之类似,不同之处在于梯度的计算在单变量时是对变量求导而在多变量时则是对各个变量求偏导,用得到的偏导值来更新对应的变量

    3.3.2 过拟合现象

      我们完成上述步骤后就可以得到函数池中最好的一个函数,在这个案例中不仅使用了简单的线性函来预测,为了尽可能更好的拟合训练数据集中的数据,训练数据集中的数据如图3-4 为10只神奇宝贝进化前后的cp值,还同时考虑二次,三次,四次,五次多项式的情况。

                            图3-4 训练集中的数据

    通过上文介绍的方法,为各个多次式对应的函数池选出最优的函数,这个的意思就是说为从带有二次项的函数池中选出最优的函数,再从带有三次项的函数池中选出最优的函数等等依此下去直到带有五次项的函数池结束,各次项对应的最优函数在训练数据集上的表现如图3-5

                          图3-5 各模型在训练集上的表现情况

    从图3-4可以看出五次项的函数在训练集上产生的平均误差最小,产生这种的原因是因为带有更高次项的函数更为复杂,表达能力更强同时其本身也包含了低次项的函数所能保持的范围。可以看到五次项的最优函数在训练集上取得了最好的效果,但是否就意味着这个函数就是我们所要寻找的最优的函数,显然不是的还需要经过测试集上的效果验证,所谓的测试集是指一批全新的数据这些数据并没有在训练集中出现过,五个最优函数在测试集上表现如图3-6

                        图3-6 过拟合现象

    从图3-5可以发现在训练集上有着优秀表现的4次项最优函数和5次项最优函数,在测试集上表现的很差,这种现象就被称为过拟合,即在训练集上有着优秀表现的模型在测试集上表现的很差,造成这一现象的主要原因在于训练集中的数据量太少而4次项和5次项的函数的表达能力足够强,导致训练集中的所有数据均被模型给记住了,导致机器并不是学习到了什么,更像是将所有的数据给背了下来。举个身边类似的例子,就像你去考驾照时,多次重复在驾校联系科目里的项目,会使你产生一些奇怪的技巧,比方说在侧方停车时,你会记得当后视镜看到轮胎内侧时回方向盘,这些技巧会让你在驾考中取得高分,但这并不代表你能在实际道路能开的好车。

    3.4 进一步优化

      为了得到更好的拟合效果,包括训练和测试集上的,可以对前面的步骤进行优化,优化主要为两个方面,这两个方面分别体现在机器学习的三大步中的前两步,对第一步的优化,我们可以重新考虑函数池,前面的函数池的设计的前提时均只考虑神奇宝贝未进化前战斗力xcp这一各变量,其实还受其他很多因素的影响包括不同神奇宝贝的物种、神奇宝贝的体重、神奇宝贝的身高等等,将这些变量均考虑在内重新设计函数池,这里不再赘述由兴趣的可以去看李弘毅老师的视频,这里重点讲一下优化的第二步,是对损失函数的优化,优化后的函数如图3-6。

          

                         图3-7 正则化                   

      可以看到优化后的损失函数就是在原先的基础上增加了与输入变量由关的项,到这不经为考虑为什么要添加这么一项,不如反过来思考,添加了这一项之后损失函数会如何,还记得前面我所讲的我们所要寻找的就是使损失函数最小时的各变量取值,那么也就意味着相比于原先未优化前就是希望各变量也就是wi的值尽可能的小,wi的值尽可能的小将更受到青睐,那为什么希望由更小的wi的值,这都是希望为了获得时我们最总获得的预测函数更加的平滑,这里的平滑是如何体现的具体看图中的红字部分,当wi尽可能小时,xi引起的变化对最终预测值的影响也将变小,这就做到了降噪的效果,可以使最终的函数适应性更强,也就说当xi出现较大幅度的震荡,这种震荡将会一定程度的被削弱。

    四.写在最后,两个疑问

      在视频最后有提出两个疑问,第一个疑问老师给出了解答,我这也顺便记录一下是一个很好的问题,问题使来自于进一步优化的第二步,在损失函数后面新添加的项重为什么不考虑b,即偏移量,实话实说这个问题问出来我也楞了一下,确实没有考虑过,该好好反思一下,这个问题的答案是因为b不会影响函数的平滑程度而是影响曲线的上下偏移量。第二个问题老师在视频没有给出原因只给出答案,问题是如果它将优化后的得到的最终预测函数放到网络上给大家使用,想说得到的平均误差量会不会比在我们在优化过后再测试数据集上跑的效果好,答案是不会,不会的原因个人认为是这样的其实回过头来看整个介绍案例的过程,其实测试集的数据已经发生了泄露,我们人为的看到模型在测试集上的效果并不好而去做出一些调整其实这个过程测试数据就已经泄露了。最后写这文章挺不容易的,希望有看的同学能有耐心的看完并指正出错误,大家多交流才能共同进步!

  • 相关阅读:
    JavaScript二进制数据序列化和反序列化
    三维变换矩阵推导笔记
    如何制作一款“有毒”的游戏
    如何使用visual studio将你的程序打包成安装包
    游戏设计模式系列(三)—— 策划变心太快?也许可以使用组合
    使用LayaAir解析xml文件
    游戏设计模式系列(二)—— 适时使用观察者模式,解耦你的代码
    游戏设计模式系列(一)—— 单线逻辑&&数据驱动,搞定最容易卡死的结算界面
    vs2010 win32程序中 sqlserver 2008 express的简单使用 (C++)
    UVALive 6529
  • 原文地址:https://www.cnblogs.com/wxrqforever/p/11094729.html
Copyright © 2011-2022 走看看