机器学习之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

相关文章

ubuntu20.0.4系统中安装Anaconda的超详细图文教程

《ubuntu20.0.4系统中安装Anaconda的超详细图文教程》:本文主要介绍了在Ubuntu系统中如何下载和安装Anaconda,提供了两种方法,详细内容请阅读本文,希望能对你有所帮助... 本文介绍了在Ubuntu系统中如何下载和安装Anaconda。提供了两种方法,包括通过网页手动下载和使用wg

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

ubuntu系统使用官方操作命令升级Dify指南

《ubuntu系统使用官方操作命令升级Dify指南》Dify支持自动化执行、日志记录和结果管理,适用于数据处理、模型训练和部署等场景,今天我们就来看看ubuntu系统中使用官方操作命令升级Dify的方... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。

Oracle 通过 ROWID 批量更新表的方法

《Oracle通过ROWID批量更新表的方法》在Oracle数据库中,使用ROWID进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销,下面给大家介绍Orac... 目录oracle 通过 ROWID 批量更新表ROWID 基本概念性能优化建议性能UoTrFPH优化建议注

Pandas进行周期与时间戳转换的方法

《Pandas进行周期与时间戳转换的方法》本教程将深入讲解如何在pandas中使用to_period()和to_timestamp()方法,完成时间戳与周期之间的转换,并结合实际应用场景展示这些方法的... 目录to_period() 时间戳转周期基本操作应用示例to_timestamp() 周期转时间戳基

在 PyQt 加载 UI 三种常见方法

《在PyQt加载UI三种常见方法》在PyQt中,加载UI文件通常指的是使用QtDesigner设计的.ui文件,并将其转换为Python代码,以便在PyQt应用程序中使用,这篇文章给大家介绍在... 目录方法一:使用 uic 模块动态加载 (不推荐用于大型项目)方法二:将 UI 文件编译为 python 模

Python将字库文件打包成可执行文件的常见方法

《Python将字库文件打包成可执行文件的常见方法》在Python打包时,如果你想将字库文件一起打包成一个可执行文件,有几种常见的方法,具体取决于你使用的打包工具,下面就跟随小编一起了解下具体的实现方... 目录使用 PyInstaller基本方法 - 使用 --add-data 参数使用 spec 文件(

Python的pip在命令行无法使用问题的解决方法

《Python的pip在命令行无法使用问题的解决方法》PIP是通用的Python包管理工具,提供了对Python包的查找、下载、安装、卸载、更新等功能,安装诸如Pygame、Pymysql等Pyt... 目录前言一. pip是什么?二. 为什么无法使用?1. 当我们在命令行输入指令并回车时,一般主要是出现以

使用Python和SQLAlchemy实现高效的邮件发送系统

《使用Python和SQLAlchemy实现高效的邮件发送系统》在现代Web应用中,邮件通知是不可或缺的功能之一,无论是订单确认、文件处理结果通知,还是系统告警,邮件都是最常用的通信方式之一,本文将详... 目录引言1. 需求分析2. 数据库设计2.1 User 表(存储用户信息)2.2 CustomerO

通过C#获取Excel单元格的数据类型的方法详解

《通过C#获取Excel单元格的数据类型的方法详解》在处理Excel文件时,了解单元格的数据类型有助于我们正确地解析和处理数据,本文将详细介绍如何使用FreeSpire.XLS来获取Excel单元格的... 目录引言环境配置6种常见数据类型C# 读取单元格数据类型引言在处理 Excel 文件时,了解单元格