机器学习之Andrew Ng课程复习--- 怎样选择机器学习方法、系统

2024-01-27 16:08

本文主要是介绍机器学习之Andrew Ng课程复习--- 怎样选择机器学习方法、系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

     通过Ng公开课前些章节的学习,我们已经掌握了部分机器学习算法,可是怎么样选择合适的算法去解决自己的问题,构建属于自己的机器学习系统呢?Ng第六堂课给了我们答案。

     Ng的关注重点是:假如你在开发一个机器学习系统,或者试着改进一个机器学习系统时,你应该如何决定接下来应该如何做。为了解释这个过程,我们仍然使用预测房价的例子,假设我们已经实现了用规则化的线性回归方法预测房价:


这个就是最小化代价函数J(θ),在你得到你的学习参数以后,但发现该预测应用于一个新的训练数据上时有很大误差(error),(有可能是过拟合)这时候你想改进该算法,应采取一些解决方案:

Get more training examples

Try smaller sets of features

Try getting additional features

Try adding polynomial features (e.g.  x1^2, x2^2,x1x2...)

Try decreasing λ

Try increasing λ

     这么多方法,人们应该选择哪一个或者哪几个方法去改进现有的算法呢,通常大多数人们都随机选择一个或者几个进行尝试,盲目随机,走了很多弯路,其实存在科学的方法帮大家从以上几种方法中去除几个,留下似乎很有前途的方法,从而节省大量的时间。接下来的俩小结,分别从怎么样评估机器学习算法的性能,和讨论机器学习诊断法入手。

Machine Learning 方法的诊断:

- 什么是诊断Dignostic呢?诊断就是能够判断一种学习算法能不能work,并且改善该算法性能的一个测试。

Diagnostic: A test that you can run to gain insight whatis/isn't working with a learning algorithm, and gain guidance as to how best toimprove its performance.

-诊断的效果:Diagnostics can take time to implement, but doingso can be a very good use of your time.




评价方法假设——Evaluating a hypothesis

    在过去,我们确定学习算法的参数时,我们考虑的是选择参数使得训练误差最小化,有人认为得到训练误差最小一定是一个好事,但事实证明,仅仅是训练误差最小不一定是一个好的假设,有可能过拟合,那么怎么证明或者发行过拟合现象的出现呢。画图仅仅适合低纬的假设,那么我们需要另外一种评价假设的方法,如下给出了一种评价假设的标准方法。

    首先呢,我们将所有数据分为两个集合,一个Trainning set和一个Testing set,用Training set得到参数向量,用Testing set进行测试(比如分类)。(训练集和测试集都随机选取)

 


    我们已经知道了学习一个假设,我们需要costFunction在训练集上最小,现在我们需要CostFuntion在测试集上也能达到最小值,这样我们的模型理论上是最优的模型。(其实还是不公平、不准确的,因为我们在模型选择的时候就是利用测试集上的CF最小来确定的,模型确定以后,验证其泛化能力又用测试集来验证显然不公平,解决方法后面会讲)

这时,将test set的error分为线性回归linear regression和逻辑回归logistic regression两类

线性回归的error:


逻辑回归的error:



模型选择和训练、验证实验数据

    什么是模型选择?比如最适合你手中数据的多项式的次数是几次?怎么样选择正确的特征来构造学习算法,或者你要正确选择正则化参数中的lambda的值,你应该怎么做?This isModelSelection!!(终于找到了学习的热情,拼拼拼)

    面对模型选择问题,如何才能得到一个just fit的模型而不会导致underfit 或者overfit呢?(前面我已经讲了传统思维分数据集为训练和测试集已经不能为我们提供有效的方案)我们引入一类数据集,叫做cross validation set,即交叉验证数据集。将所有数据按<6,2,2>分为training set , crossvalidation set , testing set三类最典型的分配为(60% 20% 20%),如下图所示:


其error计算公式如下,其实三类计算方法大同小异,相同的公式只是换了数据及而已:


进行模型选择的方法其实很简单,对应下图大家来看:

-首先,建立d个model 假设(图中有10个,d表示其id),分别在trainingset 上求使其training error最小的θ向量,那么得到d个θ

-然后,对这d个model假设,带入θ,在crossvalidation set上计算J(cv),即cv seterror最小的一个model 作为 hypothesis,如下图中J(cv)在第4组中最小,便取d=4的假设。

PS: 其实d表示dimension,也就是维度,表示该hypothesis的最大polynomial项是d维的。

PS: 一般地,J(cv)是大于等于J(train)的

PS:为什么这么做?这样我们就为测试集数据留了一条路,因为它没有和假设拟合过,这样我们可以用它来评测模型的泛化能力。



区别诊断偏离bias和偏差(方差)variance


    当你运行一个学习到的算法时,出现效果不好,多半是因为以下俩种情况:1、偏离过大2、偏差过大。即欠拟合、过拟合。那么它俩哪个和欠拟合、哪个和过拟合有关呢,或者是俩者都相关?如果我们能判断出其算法的过拟合或者欠拟合的状态,对于我们改进算法很有帮助。

我们来看看下图:


我们给大家区分两个概念:bias vs. variance。如下图所示为error随不同dimension的model变化图,可以想见,随d上升是一个由underfit到overfit的过程,这个过程中,training set的error逐渐下降,而cv set的error先降后升。(详细解释请猛戳这里http://blog.csdn.net/ywl22/article/details/8606166)

 

上图显示

bias:J(train)大,J(cv)大,J(train)≈J(cv),bias产生于d小,underfit阶段;

variance:J(train)小,J(cv)大,J(train)<<J(cv),variance产生于d大,overfit阶段;


练习题:

 


模型选择和训练、验证实验数据

我们知道算法正则化可以避免过拟合,那么正则化和biasVariance有什么关系呢?下面我们深入研究下biasVariance是如何相互影响的,以及和算法的正则化之间的相互关系。

首先我们回忆下正则化, regularization就是为了防止overfit而在cost function中引入的一个分量。看下图吧,regularization项就是cost function J(θ)中的最后一项,其中λ太大导致underfit,λ太小导致overfit……


1显示,如果我们给lambda一个较大的值比如10000,那么相当于给参数θ一个较大的惩罚,这时候我们得到大θ将特别小,几乎约等于0h(θ) = θ0,这样我们学习得到的模型将欠拟合,即高bias

3显示,如果我们给lambda取一个较小的值,比如等于0(相当于没有正则化项)这时我们如果拟合一个高次多项式,如果没有正则化项或者正则化程度很小的时候,会造成过拟合,高Variance

2显示,显然,只有我们取一个合适的Lambda值,我们才能得到一组合理的参数θ,那么我们应该怎么样自动选择出一个最合适的正则化参数Lambda呢,

首先,将λ从00.01,一直往上每次乘以2,那么到10.24总共可以试12次λ。

12个λ会得到12model cost function,每个对应有J(θ) Jcv(θ).

和模型选择的方法相同,首先选出每个cost function下令J(θ)最小的θ,然后取出令Jcvθ)最小的一组定为最终的λ


练习题:




 

下图表示的是正则化参数lambdabiasVariance以及训练集、交叉验证集上损失函数的影响图。


λ太小导致overfit,产生variance,J(train)<<J(cv)

λ太大导致underfit,产生bias,J(train)≈ J(cv)

 

===============================

Learning Curves

什么时候增加训练数据training set才是有效的?

绘制学习曲线非常重要,也许你想检查你的学习算法运行是否一切正常,或者你想改进算法的表现或效果,那么学习曲线就是一种很好的工具,Ng经常用学习曲线来判断某一个学习算法是否处于偏差 方法的问题或是二者皆有,下面我们来看看如何绘制一条学习曲线。

    为了绘制一条学习曲线,通常先绘制出Jtrain 也就是训练数据集的平均误差平方和,

Jcv表示交叉验证集数据的平均误差平方和,我们要将其绘制成一个关于参数m的函数,也就是关于训练集样本总数的函数,所以m一般都是一个常数,但这里我们对m的取值做一些限制,比如取m为1,4,10,20,30,40几组数据然后绘制出训练集误差,其他样本选择性的忽略。从下图我们可以看到,当m很小的时候,训练误差非常小,因为训练集少,我们可以完全拟合这些少量的数据,但随着m的增大,拟合效果开始下降,即Jtrain开始增大。那么对应的交叉验证集误差呢?当训练集很小的时候,训练的模型泛化能力很差,不能很好地适应新样本,所以Jcv会随着m增大而减少,泛化能力增加。


我们分别就High Bias High Variance来看看学习曲线的变化,以及增加training set个数,即m,是否有意义?!

下图显示:Underfithighbias:增加m无济于事,因为模型本身就拟合的很差。


下图显示:OveryFitHighvariance:增加m使得JtrainJcv之间gap减少,有助于performance提高。


练习题:


综上:增加训练数据的个数对于过拟合是有用的,对于underfit是徒劳!

===============================

Deciding what to try next

我们已经学了怎么样评价一个机器学习系统的性能,模型选择中的bias、variance的意义、区别等,这些诊断方法如何帮助我们弄清哪些方法有助于改进学习算法的效果,哪些又是徒劳。让我们回到最初的例子,在那里找到答案。(如下图)


以上这些方案哪些可以帮助我们更好的改进算法。根据上节学习曲线图可以很快的给出答案。

最后我们回顾一下以上内容,并且看看它们和神经网络的联系,Ng给大家提供了一些很实用的经验和建议(神经网络建模的结构选择或者连接形式的一些技巧)

在神经网络拟合的时候你可以选择一种,比如说一个相对比较简单的神经网络模型(隐藏单元比较少),因为这样的神经网络,学习参数比较少,但很容易出现欠拟合,不过计算量相对应的也就较小。相反,复杂的神经网络结构复杂、有很多隐藏层,容易出现过拟合。但这种神经网络的优势是学习出的结果,性能会很好,但计算量很大。一般一个复杂的神经网络通过正则化修正过拟合后的结果要明显好于一个简单的神经网络的效果。但是隐藏层的选择通常也是一个困难的问题,经验是选择一个隐藏层比较合理。比如我们可以把数据分割成训练、验证、测试三个部分,然后分别计算不同隐藏层数的神经网络结构在验证集上的表现,从而来确定神经网络层数。


练习题:


    综上所述,选择最佳拟合model的问题,是machine learning的常见问题,以上内容可以帮助我们更好的选择一个最佳的模型,更好的应用到机器学习的应用中。


 

这篇关于机器学习之Andrew Ng课程复习--- 怎样选择机器学习方法、系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/650777

相关文章

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

springboot中配置logback-spring.xml的方法

《springboot中配置logback-spring.xml的方法》文章介绍了如何在SpringBoot项目中配置logback-spring.xml文件来进行日志管理,包括如何定义日志输出方式、... 目录一、在src/main/resources目录下,也就是在classpath路径下创建logba

SQL Server中行转列方法详细讲解

《SQLServer中行转列方法详细讲解》SQL行转列、列转行可以帮助我们更方便地处理数据,生成需要的报表和结果集,:本文主要介绍SQLServer中行转列方法的相关资料,需要的朋友可以参考下... 目录前言一、为什么需要行转列二、行转列的基本概念三、使用PIVOT运算符进行行转列1.创建示例数据表并插入数

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

python项目打包成docker容器镜像的两种方法实现

《python项目打包成docker容器镜像的两种方法实现》本文介绍两种将Python项目打包为Docker镜像的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录简单版:(一次成功,后续下载对应的软件依赖)第一步:肯定是构建dockerfile,如下:第二步

C# GC回收的方法实现

《C#GC回收的方法实现》本文主要介绍了C#GC回收的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、什么是 GC? 二、GC 管理的是哪部分内存? 三、GC 什么时候触发?️ 四、GC 如何判断一个对象是“垃圾