Machine Learning | Coursea week 6,7,8

Advice for Applying Machine Learning

Deciding what to try next

当我们发现训练好的模型预测出的结果与真实值有较大的误差时,可以采用以下方法来改进算法的性能。

1、    增加训练样本

2、    增加特征值

3、    减少特征值

4、    增加多项式的特征值

5、    增加正则化程度lanbuda

6、    减小正则化程度lanbuda

Evaluating a Hypothesis

将数据分为训练集和测试集,通常70%的数据作为训练集,剩下30%的数据作为测试集。

我们用学得模型在测试集上的误差评估模型的好坏,有两种计算误差的方法:

1、    对于线性回归模型我们用测试集数据计算代价函数J。

2、    对于逻辑回归模型,除了可以计算代价函数,还可以用误分类比率来衡量误差。

逻辑回归的代价函数:

误分类比率:

若真实值为1,预测值小于0.5,或者,真实值为0预测值大于等于0.5,则该样本的误差为1;否则为0。

最后在除以总样本数。即err/m_test 

Model Selection and Cross-Validation

假设我们要在10个模型之间进行选择:

使用交叉验证能够帮助我们选择模型。

选择60%的数据作为训练集,20%的数据作为交叉验证集,剩余20%作为测试集。

其中交叉验证集用来计算交叉验证误差,以选择代价最小的模型,测试集用来计算推广误差。

具体步骤如下:

1、    训练出模型

2、    用验证集计算交叉验证误差

3、    选择代价最小的模型

4、    用测试集和选出的代价最小的模型计算推广误差

Diagnosing Bias and Variance

一个学习算法表现的不理想,通常是两种情况偏差过大和方差过大,前者一般是欠拟合问题,后者一般是过拟合问题。

为了帮助我们分析算法效果不好的原因,我们通常可以做一张图,表中展示随着多项式次数的变化训练集和交叉验证集的代价函数的变化情况。

如上图,可分析出当多项式次数很小时,可能会出现欠拟合(偏差过大)的现象;当多项式次数过大时,又会出现过拟合(方差大)现象,即学习算法在训练集上表现很好,在交叉验证集上表现却很差;因此,我们要找到合适的多项式次数以及和它对应的学习算法,使得他们在训练集和交叉验证集上的误差都很小。

学习算法表现差,如何判断由于欠拟合还是过拟合引起的?

当训练集误差和交叉验证集误差都很大且相近时,为欠拟合(偏差大)。

当训练集误差小,而交叉验证集误差很大时,为过拟合(方差大)。

Regularization and Bias_Variance

我们选择的lambda通常是在0-10之间,呈现2倍关系的值(如:0,0.01,0.02,0.04,0.08,0.15,0.30,0.60,1.2,2.5,5.0,10共12个)。

选择λ的具体方法如下:

1、    用训练集和不同的λ训练出12个归一化程度不同的模型

2、    用交叉验证集计算交叉验证误差

3、    选出交叉验证误差最小的模型

4、    用选择出的模型和测试集得出推广误差(即,在测试集上的误差)

随λ变化训练集误差和交叉验证集误差的变化情况如下图:

从代价函数的公式可以看出,当λ非常大时,为了使误差尽可能小,多项式的各个系数都会非常小,拟合出的曲线会近似于一条平行于横坐标的直线。

当λ较小时,训练集误差小,交叉验证集误差大,过拟合。

当λ较大时,训练集误差大,交叉验证集误差也大,欠拟合。

Learning Curves

学习曲线是学习算法的一个很好的合理检验,能够使用学习曲线判断一个学习算法是否处于偏差、方差问题。学习曲线是将训练集误差、验证集误差作为训练集实例数量(m)的函数绘制的图标。

我们如何来识别高偏差(欠拟合),还是高方差(过拟合)?

高偏差的学习曲线通常如下图:

随着训练集的增加,训练集误差和交叉验证集误差都没有表现的更好。

高方差的学习曲线通常如下图:

上图为当我们的多项式次数较高并且lambda很小时的学习曲线,此时增加训练集能够提高模型的效果。

Summary

我们可以采用以下方式解决欠拟合(高偏差)问题:

1、    尝试增多特征的数量

2、    尝试增加多项式特征

3、    减小归一化程度lambda

采用以下方式解决过拟合(高方差)问题:

1、    增加训练样本的数量

2、    尝试减少特征的数量

3、    增加归一化程度lambda

神经网络的偏差和方差

使用较小的神经网络,参数少,容易导致高偏差、欠拟合;使用较大的神经网络,参数多,计算量大,容易导致高方差、过拟合,但可以通过归一化来调整而更加适应数据。

我们通常选择较大的神经网络并通过归一化处理。对于神经网络的层数,通常从第一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训练神经网络,然后选择交叉验证集代价最小的神经网络。

Machine Learning System Design

Prioritizing What to Work On

以垃圾邮件分类器为例,为了构建一个分类器算法。我们有很多方法,我们可以先把这些方法列出来,然后通过系统化的分析,选择出一个较为合适的方法,并深入去研究。

Error Analysis

构建学习算法的推荐方法为:

1、    从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集测试其误差。

2、    绘制学习曲线,决定增加训练集,或者增加特征,还是其他。

3、    进行误差分析:人工检查产生预测误差的实例,观察这些实例有没有某种系统化的趋势。

Error Metrics for Skewed Classes(类偏斜的误差度量)

类偏斜:训练样本中有大量的同一种类别的实例,而其他类别的实例很少或没有。(例如:我们需要预测肿瘤是否为恶性,训练样本中只有0.5%的恶性肿瘤,其他的均为良性肿瘤。我们写一个非学习来的算法,所有的预测结果均为良性,那么其误差只有0.5%;而通过神经网络学来的模型误差率却有1%;此时,我们就不能把误差的大小作为评测算法的标准。)

查准率=(TP)/(TP+FP),即,真正例/(真正例+假正例)

差全率=(TP)/(TP+FN),即,真正例/(真正例+假反例)

Precision and Recall

当查全率高(阈值较大)时,查准率通常会低;而当查准率高时,查全率通常会低。因而,我们希望找到一个查全率和查准率的平衡点(Break-Even Point)。

我们通常用调和平均来度量学习器在查全率与查准率方面的性能。

即,1/F=1/2*(1/P+1/R)

整理后得:F=2*((P*R)/(P+R))

我们最终会选择F最高时对应的阈值。

Data for Machine Learning

本节主要强调了数据的重要性。

简单的说,就是一个复杂的模型(或者说这个模型有许多参数需要在训练中确定)通常能保证学习到的算法不会欠拟合,但可能会导致过拟合。而,大量的数据通常能够调和过拟合的问题,即大量的训练数据一般能保证学习到的算法不会过拟合。

这样,如果你有一个带有很多参数和隐藏层的神经网络模型,以及大量的训练数据,那么,最终学习到算法的性能通常是很好的(低方差、低偏差)。如果它在训练集上表现得很好(训练误差小),那么在验证集或者是测试集上表现的通常也会很好(误差小)。



Support Vector Machines

Optimization Objective

相比于逻辑回归和神经网络,SVM在解决复杂的非线性方程上更清晰、更强大。

下面通过一点点修改逻辑回归得到支持向量机。

图中的两条曲线展现的是当真实值y=1或0时,逻辑回归和支持向量机的代价函数,其中黑色的代表逻辑回归,紫色的代表支持向量机。左图:y=1,右图:y=0。

我们通过修改逻辑回归的优化目标函数,能够逐步得到解决二分类问题的支持向量机的优化目标函数:

显然训练样本个数m一定时,m并不会影响我们所求得的最优目标对应的theta,可以直接去掉;如果我们对整个公式乘(1/lambda),并且令C=(1/lambda),最后将公式中代价函数改成支持向量机的代价函数,就得到了如下的支持向量机的优化目标函数。

显然,当我们想使支持向量机划分出的超平面尽可能明显的区分两种不同类别时,会将C设置的非常大,这样训练出的模型对错分类会异常敏感,并且易发生过拟合现象。因此,对于支持向量机我们也需要找到方法平衡过拟合与欠拟合。

Large Margin Intuition

支持向量机有时也被称为大间隔分类器。顾名思义,和逻辑回归相比,其代价函数有一些区别,当y=1时,只有预测值>=1,代价才为0;当y=0时,只有预测值<=-1时,代价才为0。

对于上图,如果你将C设置的很大,那么支持向量机学得的决策边界会像红色曲线;而如果你的C不是很大,那么学得的决策边界可能会像黑色曲线那样。当C不是很大时,他会忽略掉一些异常点,从而得到更好的决策边界。因此:

C较大时,相当于lambda小,会过拟合、高方差。

C较小时,相当于lambda大,会欠拟合、高偏差。

Kernels Ⅰ


对于上图的分类问题,我们可以用多项式的高级模型来解决,上图的判定边界对应的模型可能是:θ_0+θ_1 x_1+θ_2 x_2+θ_3 〖x_1 x〗_2+θ_4 x_1^2+θ_5 x_2^2+…的形式

我们可以用f来替代模型中的每一项:f1=x1,f2=x2,f3=x1x2,f4=x_1^2,f5=x_2^2

我们考虑用核函数来构造f1,f2,f3…,如下图:


其中f_1,用来度量测试样本x与之间的相似度l^((1)),当他们之间的欧氏距离越小时,f_1的值就越接近于1;反之,f_1接近于0。similarity(x,l^((1)))就是核函数,在这里是一个高斯核函数(Gaussian Kernel)。

注意:核函数中σ^2对相似度度量的影响,σ^2当变大时,对于同一测试样本x核函数计算出的f会变大,核函数的图像也会变得平缓,更形象化的表示如下图:

如上图所示,当f_1,f_2对应的l^((1)),l^((2))的预测值为1时,红色圈内表示使用该核函数后预测出的值为1 的测试样本x的范围,圈外的x会被预测为0。

Kernels Ⅱ

我们根据训练集的数量m选择出地标的数量m,并且有。然后我们得到的新的特征f是建立在原来的特征与其他特征之间的距离的基础上的,即:

下面,我们要将核函数运用到支持向量机,并修改支持向量机的假设函数为:

对于给定的x,计算新的特征f,当>=0(疑问?这个地方不应该是>=1吗?),时,预测值为1;反之,预测为0。修改代价函数为:

最后一项可以用代替,在实际的计算时,我们用代替,这里M为根据核函数的不同而选择的一个矩阵。

支持向量机也可以不使用核函数,不使用核函数又称为线性核函数。当我们不采用复杂的核函数或者特征多样本少时,可以采用不带核函数的支持向量机。

支持向量机中的两个参数C和的影响:

C大,过拟合、高方差

C小,欠拟合,高偏差

大,欠拟合,高偏差

小,过拟合,高方差

Using An SVM

除了高斯核函数还有一些其他的核函数可以选择,如:多项式核函数、字符串核函数、卡方核函数、直方图交集核函数,等等。

多分类问题:我们可以构建K个模型,K个参数theta,训练K个支持向量机。

支持向量机和核函数的选择规则:n为特征数、m为训练样本个数

1、    相对于m来说,n大时,训练集不足以支持复杂的非线性模型,可以选择逻辑回归或者不带核函数的支持向量机。

2、    n较小,m大小适中,可以选择高斯核函数的支持向量机。例如n在1-1000,而m在10-10000。

3、    相对于n来说,m较大。直接使用支持向量机会很慢,这时,可以增加更多的特征,然后使用逻辑回归或者不带核函数的支持向量机。例如n在1-1000,而m大于50000。

SVM与神经网络的对比:

1、    SVM的求解通常借助于凸优化技术,能够找到全局最优,或者接近他的值;而训练神经网络时有时会陷入局部最优。

2、    SVM实现包运行得比较快,而神经网络训练起来可能会很慢。




聚类(Clustering)

无监督学习的介绍

有监督学习:训练集数据有标签。

无监督学习:训练集数据无标签,我们希望通过无监督学习算法找到给定数据的内在结构。

如上图所示,样本可以看成两个分开的点集(称为簇),一个能找到我们圈出的点的算法,被称为聚类算法。

当然,通过其他的无监督学习算法可以找到其他的数据结构,而不仅仅时簇。

K-均值算法(K-Means Algorithm)

K-均值是一个迭代算法,假设我们想要将样本分成n的组,步骤如下:

1、     随机选择K个点,称为聚类中心。

2、     对于数据集中的每一个数据,按照距离K个中心点的距离,将其与距离最近的中心点关联起来,与同一中心点关联的所有点聚成一个簇。

3、     计算每一个组的平均值,将该组所关联的中心点移动到平均值的位置。

4、     重复2、3两步,直至中心点不再变化。

伪代码如下:

其中, 代表第i个样本, 代表距离第i个样本最近的中心点, 代表第k组数据的平均位置。

优化目标(Objective)

K-均值最小化问题,是要最小化所有数据与其关联的聚类中心的距离之和,因此K-均值的代价函数为:

其中,uc(i)代表与x最近的聚类中心,我们的优化目标是找到是的代价函数最小的uk和c(i):

第一个循环是为了减小c(i)引起的代价,第二个循环是减小uk引起的代价。并且,每次迭代代价都在减小,否则就出现了错误。

随机初始化(Random Initialization)

首先我们要选择k<m个聚类中心点,显然聚类中心点的个数要小于训练样本的个数。

然后,我们可以随机选择k个训练样本作为聚类中心点。K-均值的一个问题是,他可能停留在一个局部最优,这取决于聚类中心初始化的情况。

我们可以多次运行K-均值算法,每次运行要随机初始化聚类中心,最后选择代价函数最小的结果。但是当K值很大时,时间复杂度会很好。

选择聚类数(Choosing the Number of Clusters)

为了选择出一个合理的聚类数K,我们可以先将K设为1,然后逐渐增加K的值,并计算出不同的K值对应的最小代价函数。

如上图所示,我们发现随着K的值的增加,代价函数减小的速度越来越慢,并且很显然k等于3是一个转折点。我们最终认为聚类数K为3是最合理的。整个曲线很像一个人的肘部,因此也被形象化的称为“肘部法则”。

降维(Dimensionality Reduction)

数据压缩(Data Compression)

降维是我们讨论的第二类无监督学习问题。

降维的其中一个动机是数据压缩。数据压缩可以节省存储空间,还可以加快我们的学习算法。

我们的数据集一般会有很多特征向量,当这些特征向量中有一些是相互关联的或者维度太大时,我们可以考虑降维。降维可以理解为映射,将高维空间中的数据映射到低维空间。比如,二维到一维、三维到二维、1000维到100维。

数据可视化(Visualization)

假如要将50维的数据可视化显然是不可能的,可以先降维到二维再进行可视化。降维的算法只负责减少维数,新产生的特征的意义需要我们自己去发现。

主成分分析问题(Principal Component Analysis Problem)

PCA是最常见的降维算法。PCA要做的是找到一个方向向量,当我们把数据投射到该向量上后,其投射平均均方误差最小。方向向量经过原点,投射误差是原特征向量向该方向向量做垂线的长度。

下面给出主成分分析问题的描述:

假设要将n维的数据降至k维,目标是找到向量u1,u2,…uk使得总的投射误差最小。

PCA的一个好处是,我们可以对降维后求出的“主元”特征按照重要性进行排序,根据需要取前面重要的部分。这样,不仅达到了数据压缩的效果还最大程度的保持了原有数据的信息。

PCA的另一优点是,PCA计算结果只与数据本身有关。无需人为设置参数与用户是独立的。但这点也可以成为缺点,如果用户对数据有了先验知识,掌握了一些数据特征,却无法通过参数化来进行预干预,最终无法得到预期的效果。

主成分分析算法(Principal Component Analysis Algorithm)

PCA将n维特征向量减少到k维。

第一步,均值归一化。归一化的公式为: ,其中xj数据在特征向量j上的取值,uj为所有数据在特征向量j上的平均值,分母为所有数据在特征向量j上的标准差。

第二步,计算协方差矩阵sigma:


第三步,计算sigma的特征向量:

这里我们用到奇异值分解来求,[u,s,v] = svd(sigma)。

对于一个n×n维度的矩阵,上式中的U是一个具有与数据之间最小投射误差的方向向量构成的矩阵。如果我们希望将数据从n维降至k维,我们只需要从U中选取前K个向量,获得一个nxk维度的矩阵,我们用Ureduce表示,然后通过如下计算获得要求的新特征向量z(i)=:

其中x是nx1维的,因此,z是kx1维的。

选择主成分的数量

主要成分分析是减少投射的平均均方误差:

训练集的方差为:1/m ∑_(i=1)^m▒〖||〖x^((i)) ||〗^2 〗

我们希望在平均均方误差与训练集方差比例尽可能小的情况下,选择尽可能小的k值。

我们可以先令k=1,然后进行主成分分析,获得Ureduce和z,然后计算两者的比例是否满足条件。如果不满足,继续增加k的值直到找到满足条件的最小k值。

我们可以用更好的方式来选择k,当我们在octave中调用svd函数时,可获得三个参数:[U,S,K]=svd(sigma)。

我们可以用这个矩阵来计算平均均方误差和训练集方差的比例:

我们可以用下面这个函数来求原来的特征向量:

主成分分析的应用建议

假如我们要对100X100像素的图片进行计算机视觉的机器学习,即总共有10000个特征。

1、     运用成分分析将特征压缩到1000个。

2、     用训练集运行学习算法

3、     在预测前用学习来的Ureduce来将输入的特征x转换成特征向量z,然后在进行预测。

错误的使用主成分分析的情况:

1、     将其用于减少过拟合,不如尝试归一化处理。(原因在于主要成分分析只是近似地丢弃掉一些特征,它并不考虑任何与结果变量有关的信息,因此可能会丢失非常重要的特征。然而当我们进行归一化处理时,会考虑到结果变量,不会丢掉重要的数据。)

2、     默认的将主成分分析作为学习的一部分,这虽然很多时候有效果,但最好还是从原始特征开始,应该只在必要的时候才考虑使用主成分分析。


猜你喜欢

转载自blog.csdn.net/qq_33614902/article/details/79475847
今日推荐