机器学习系统设计
第九十三课:确定执行的优先级
当你在设计复杂的机器学习系统时所面临的主要问题,并会在如何制定一个复杂的机器学习系统方面给出一些建议!
首先,在实际工过程中,我们应该优先处理哪些事情?
如何通过监督学习的方法来构造一个分类器,区分垃圾邮件和非垃圾邮件呢?
选择单词作为特征,单词是否出现就组成了特征向量组!
如何在有限的时间内,让你的垃圾邮件分类器具有高精准度和低错误率?
1.一种很容易想到的就是收集大量数据,数据收集的越多,分类就越准确。
2.用更复杂的特征变量来描述邮件,例如邮件人标题。
3.关注邮件的主体部分并构建更复杂的特征
...
有些时候花时间去研究这些方法那个更有效是徒劳的,所以有的人最后就干脆随机决定使用哪种方法。
如何更加系统的选择一种方式来增加算法的成功率呢?
第九十四课:误差分析
它能帮助你更系统的在众多方法中作出选择。
如果你准备从事研发机器学习产品,或者开发机器学习应用。通常来说,最好的办法,不是建立一个很复杂的有许多复杂特征的系统,而是通过一个简单的算法来快速实现它。每当我开始一个机器学习问题时,我最多只会花一天时间,把这个项目简单粗暴的做出来,而不是设计一个很复杂的系统。即使这个速成的东西不是很完美,但是通过交叉验证集来测试数据,做完这些以后,你就能画出相应学习曲线,通过画出的学习曲线以及检验误差,来找出你的算法是否存在高偏差或者高方差的问题。作出这些分析以后,再来决定是否使用更多的数据或者特征等等。因为你并不能验证你是需要更多的特征还是需要更多的数据,在缺乏各种数据的前提下,你很难提前知道这些,因为你没有画出学习曲线。所以应当先进行一次简单快速的实现,然后画出学习曲线来帮助你进行之后的判断。你要避免出现过早优化的问题,这种思想告诉我们,我们应当用实际的证据来指导我们的决策,来决定把时间花在哪里而不是凭直觉?
除了绘制学习曲线还有一件非常有用的事,就是误差分析。通过观察交叉验证集的情况,然后看一看那些被算法错误分类的文件有什么共同的规律和特征。这样就可以启发你应该设计怎么样的新特征,或是告诉你现在的算法有什么优点和缺点,然后指导你想出办法来改进它。
举个具体地例子:
对出现错误分类的例子进行总结和应对,手动误差分析。可以快速找到算法的不足和难以处理的样本类型,然后集中精力在它们上面。
另一个技巧是保证自己对学习算法有一种数值估计的方法。当你改进学习算法的时候,如果你的算法能够返回一个数值评价指标来估计算法执行的效果将会很有帮助。可能算法是准确的,也有可能是错误的。但是这个数字能告诉你,你的学习算法效果有多好。
错误率数值变化,对这个特定的问题,这个很自然的单一规则的数值评价指标叫做交叉验证错误率。它能更快的帮你决定是否使用词干提取器软件!
强烈推荐在交叉验证集上做误差分析,而不是在测试集上。
第九十五课:不对称性分类的误差评估
误差分析以及设定误差度量值非常重要,设定某个实数来评估你的学习算法并衡量它的表现,有了算法的评估和误差度量值,有一件重要的事情需要注意:就是使用一个合适的误差度量值有时会对你的学习算法造成非常微妙的影响。这个重要的问题就是偏斜类问题。
正例和负例的比率非常接近于一个极端情况,例子中正样本的数量与负样本的数量相比非常非常少,我们把这种情况叫做偏斜类。一个类中的样本数与另一个类的数据相比多很多。因此使用分类误差或者分类精确度来作为评估度量可能会产生问题。
因此当出现偏斜类问题时,我们希望有一个不同的误差度量值或者不同的评估度量值,其中一种误差度量值叫做查准率和召回率。
查准率和召回率越高越好。通过查准率和召回率我们可以知道分类模型到底好不好。总的来说,即使我们有一个非常偏斜的类,算法也不能够欺骗我们,仅仅通过预测y总是等于0或者1,它没办法得到高的查准率和高的召回率。因此我们能够肯定拥有高查准率和高召回率的模型是一个好的分类模型。这给予了我们一个更好的评估值,就更直接的方法来评估模型的好坏。
最后记住一件事,在查准率和召回率的定义中,我们总是习惯性的用y = 1,如果这个类出现的非常少,因此如果我们试图检测某种稀少的情况,比如患癌症的概率,我们会把查准率和召回率定义为y = 1。
第九十六课:精确度和召回率的权衡
查准率和召回率作为算法评估度量值更有效方式?
取决于你要什么!
有没有办法自动选择临界值?
平均值貌似不是一个好主意。F值可以检测,是因为它要求两者都需要很大。
通过变动临界值,你可以控制权衡查准率和召回率,通过F值权衡给你一个评估度量值。
第九十八课:机器学习数据
机器学习系统设计中被训练的数据有多少?
在有些条件下,得到大量的数据并在某种类型的学习算法中进行训练,可以是一种有效的方法来获得一个具有良好性能的学习算法。这种情况往往出现在这些条件对你的问题都成立,并且你能够得到大量的数据的情况下。这可以是一个很好的方式来获得非常高性能的学习算法。
并不是拥有最好算法的人能成功,而是拥有最多数据的人能成功。
给定一个输入特征向量x,给定这些特征值,也给定了相同的可用的信息和学习算法,加入我们去人类专家这个领域,一个人类学家能够准确或自信的预测出y值么?
假设特征值有足够的信息来预测y值,假设我们使用一种需要大量参数的学习算法,也许是有很多特征值的逻辑回归或线性回归。实际上是在利用许多隐藏单元的神经网络,它们有很复杂的参数,这些参数可以拟合非常复杂的函数,低偏差算法,我们能够拟合非常复杂的函数,而且因为我们有非常强大的学习算法,如果我们用数据训练这些算法,它能很好的拟合训练集,训练误差就会很低。如果训练集比参数的数量更多,那么这些算法就不太可能会过度拟合。综合测试集的误差也会很小。
关键的假设是:特征值有足够的信息量,有一类很好的函数,这是为什么能保证低误差的关键所在,它有大量的训练数据集,这能保证得到更多的方差值。
如果你有大量的数据,而且你训练了一种带有很多参数的学习算法,那么这将会是一个很好的方式来提供一个高性能学习算法。
支持向量机
第一百零一课:优化目标
在监督学习中,很多监督学习算法的性能都非常相似,所以经常要考虑的东西,不是选择算法,而是更多的去考虑,你构建这些算法时所使用的数据量,这就体现了你使用这些算法的技巧。
特征选择
正则化参数的选择
..
支持向量机(SVM),更清晰更强大的算法。
优化目标:
从logistic回归开始,看看如何作一些小小的改动来得到一个支持向量机。
考虑单独一项对logistic回归总体代价函数的贡献:
画一条直线,它和logistic代价函数的曲线非常相似,两端直线组成。它的效果将和logistic回归非常相似,但是支持向量机将拥有计算上的优势,并且使得之后的优化问题变得简单,更容易解决。
有了定义以后,构建支持向量机:
和logistic回归控制权衡的方式不同,在A前面加上系数C,这是一种不同的参数设置方法,来决定我们是更关心第一项的优化还是第二项的优化,
和logistic回归不同的是,SVM并不会输出概率,相对的我们得到的是通过优化这个代价函数,得到一个参数θ,支持向量机所做的是进行了一个直接的预测,预测y = 0/1。这就是支持向量机的假设函数形式:
接下来更直观的角度看一下支持向量机的优化目标是什么,以及SVM学到的假设函数会是什么样的?如何进行一些修改以便学习更加复杂的非线性函数?
第一百零二课:直观上对大间隔的理解
支持向量机:大间距分类器,如何通过直观的图像理解SVM假设?
性质:如果你有一个正样本,比如y = 1,我们只需要使θ的转置乘以x大于等于0就能正确的进行分类。如果你有一个负样本,比如y = 0,我们只需要使θ的转置乘以x小于0就能正确的进行分类。但是支持向量机不是恰好能正确分类就行了,我们需要的是比0/1大很多。这就相当于在SVM中构建了一个安全因子,一个安全间距。在支持向量机中,这个因子会产生什么影响?
当C是一个非常大的数时:
因此你会得到一个很有趣的决策边界:
黑线看起来是更稳健的决策边界,能更好的分开正样本和负样本。从数学上说,黑色直线拥有更大的距离,这个距离叫做间距,它和训练样本的最小距离要更大一些。
支持向量机的间距,这使得支持向量机具有鲁棒性。因为它在分离数据时,会尽量用大的间距去分离,因此有时被称为大间距分类器。
为什么这个优化问题能得到这个大间距分类器?
此外,当你使用大间距分类器的时候,这时你的学习算法对异常点会很敏感。黑线变成粉红线,这是C非常大的情况。如果c不是非常大,那么会变回黑线(忽略异常点)。
正则化参数的权衡?
第一百零三课:大间隔分类器的数学原理
支持向量机的优化问题和大间距分类器之间的联系?
用向量内积的形式尝试理解支持向量机的优化目标函数。
对优化目标函数来说,支持向量机做的就是最小化参数向量θ的范数的平法,或者说是长度的平方。
参数向量θ事实上是与决策边界90度正交的,令θ = 0,那么决策边界必须过原点。
支持向量机优化目标函数最终会找到大间距分类器:试图最大化这些p^(i)的范数,也就是训练样本到决策边界的距离。
第一百零四课:核函数
改造向量机算法来构建复杂的非线性分类器,主要的技巧就是被称为“核”的东西。核函数是什么以及如何使用它?
对于计算机视觉,输入是一个由大量像素组成的图像,我们也见到了高阶的多项式,运算量将是非常大的,因为有很多高阶多项式,我们是否有不同的或者是更好的特征的选择,我们可以用来嵌入到假设函数中,有一个可以构造新特征f1、f2、f3的方法:
引入相似度度量similarity,相似度函数similarity就是一个核函数(高斯核函数)。
k(x, l(i))
核函数到底做了什么?
给定一个训练样本x,我们可以计算三个新的特征f1、f2、f3(基于之前给的三个标记)。
衡量的是特征变量的值减小的速度。
上图就是我们如何定义标记点和核函数来训练出非常复杂的非线性决策边界的方法。我们是如何使用核函数的呢?我们通过标记点和相似性函数来定义新的特征变量,从而训练复杂的非线性边界。
理解核函数的概念以及我们如何使用它在支持向量机中定义新的特征变量。但还有一些问题?其中一个是我们如何得到这些标记点?我们如何选择标记点?相似度方程可以替代高斯函数么?
支持向量机如何通过核函数来有效的学习复杂非线性函数?
第一百零五课:核函数2
如何在实际中应用这些思想?例如,如何处理支持向量机中的偏差方差折中?
如何选择标记点?在一些复杂的数学问题中,也许我们需要更多的标记点?
我们拥有的每一个样本点,只需要直接使用它们,直接将训练样本作为标记点。即每一个标记点的位置都与每一个样本点的位置相对应。这说明特征函数基本上实在描述每一个样本距离与样本集中其他样本的距离。
给定核函数和相似度函数后,我们如何使用更简单的支持向量机?
通过解决最小化问题,就得到了支持向量机的参数。这就是支持向量机的学习算法。
大多数支持向量机在实现的时候,其实是替换掉θTθ,用θT乘以某个矩阵M,这依赖于你采用的核函数,再乘以θ^T。这其实是另一种略有区别的距离度量方法,我们用一种略有变化的度量来取代θ的模的平方,这意味着我们最小化了一种类似的度量。这是参数向量θ的缩放版本并取决于核函数。这个数学细节,使得支持向量机能够更有效率的运行。为什么支持向量机做这种修改,这可以使它应用更大的数量集。这个具体的实现细节,尽管略微改变了优化目标,但它主要是为了计算效率。
核函数不太好应用到线性回归和逻辑回归上,但是可以和支持向量机相得益彰。
你不需要知道怎么去写一个软件来最小化代价函数,因为你可以找到很好的软件做这些,而应该使用人们开发的成熟的软件包。这些软件包已经包含了那些数值优化技巧。
另外一个问题,当你选择使用支持向量机时,怎么选择支持向量机中的参数?
偏差方差折中
大C:过拟合
小C:欠拟合
大σ:更平滑,高偏差低方差
大σ:不平滑,低偏差高方差
第一百零六课:使用SVM
为了运行或者运用SVM,你实际上所需要的一些东西?
特别优化问题,不要自己写代码求解参数θ...只需要调用相关库函数实现相应功能。
你需要:
1.参数C的选择
2.选择内核函数或你想要使用的相似函数(没有核函数,即线性核函数,标准的线性分类器)
为什么会选择使用线性核函数?
如果你有大量的特征,n很大,且m即训练的样本数很小,那么你有大量的特征,却只有很少的训练数集,那么你只想拟合一个线性的判定边界,而不去拟合一个非常复杂的非线性函数,因为没有足够的数据, 你可能会过度拟合。例如,在一个非常高维的特征空间中尝试拟合非常复杂的函数,但是如果你的训练集样本很小的话,这将变成一个合理的设置。
3.如果选择高斯函数,选择参数σ^2
什么时候选择高斯函数?
如果你忽略了特征值x输入R^n,如果n值很小,理想情况下,如果m值很大,那么如果我们有,比如一个二维的训练集,那么n = 2,但是有很多的训练数据,然后你想用核函数去拟合相当复杂非线性决策边界,高斯核函数是一个不错的选择。
但是如果你决定使用高斯核函数,接下来就是需要根据使用的支持向量机软件包,需要你实现一个核函数或者实现相似函数,因此如果你用Octave或者matlab来实现支持向量机的话,就需要你提供一个函数来计算核函数的特征值。因此对应一个i,需要计算fi,你需要做的是写一个核函数,让它把向量x作为输入,把输入作为一种标识,即将x1,x2作为输入的软件,并用它们来计算这个相似函数,之后返回一个实数。
因此很多SVM包需要用户提供一个核函数,能够实现x1,x2,并返回一个实数,从这里开始,它将自动地生成所有特征变量。自动利用特征向量x并且映射到f1,f2...一直到fm,并且生成所有特征变量,并从这开始训练支持向量机。但是有些时候你要自己提供这个函数,如果你使用高斯核函数,一些SVM的函数实现也会包括高斯核函数以及其他的核函数。到目前为止,高斯核函数和线性核函数是最为常用的核函数。一个实现函数的注意事项,如果你有大小很不一样的特征变量,很重要的一件事就是在使用高斯函数之前,将这些特征变量的大小按比例归一化,就需要进一步的缩放比例,这将会保证SVM能考虑到所有不同的特征向量,而不只是像例子中这样,房子的大小影响特别大。
警告:不是所有你可能提出来的相似函数都是有效的核函数,高斯核函数、线性核函数以及你有时可能会用到的核函数,这些函数都需要满足一个技术条件,它叫做默塞尔定理。需要满足这个条件的原因是因为支持向量机算法或者SVM的实现函数有许多熟练地数值优化技巧。为了有效的求解参数θ,在最初的设想里,这些决策都将我们的注意力仅仅限制在可以满足默塞尔定理的核函数上。这个定理所做的是确保所有的SVM包,所有的SVM软件包能够用大类的优化方法,从而迅速得到参数θ。大多数人最后要做的是用线性核函数或者高斯函数,但是也有满足默塞尔定理的其他核函数,我个人很少使用。
多项式核函数(常数和指数)
有字符串核函数
卡方核函数
直方相交核函数
...
最后两个细节:
1.在多类分类中,很多SVM包中已经内置了多分类的函数,因此,如果你使用一个类似于这样的一个模式,你只是用了这样的函数,且应该会做的比较好。
除此之外,一个多分类的问题,可以使用one-vs-all方法,我们之前在讲逻辑回归的时候讨论过,所以你要做的是训练KSVM,如果你有k个类别,用以将每个类别从其他类别中区分开来。它会给你k参数的向量,θ1,它会尝试从所有类别中,识别出y = 1的类别,之后θ2,识别出y = 2作为正类别,参数向量θ(k)是用于识别最后一个类别参数向量。与逻辑回归中一对多的方法类似,在逻辑回归中,我们是用最大的θTx来预测类别i。
多分类的范式:对大多数情况来说,无论使用,在软件包内部已经有实现好的内置多分类函数,不用担心。
2.我们从逻辑回归开始创造了SVM,然后更改了一下代价函数,当你要使用两者之一的算法时,比如n代表特征的数量,m是训练样本的数量。如何选择两者中的一个呢?
当n的值比训练样本个数多,有大量的特征远大于m。那么就选择逻辑回归或者不带核函数的SVM,因为如果你有比较多的特征变量,而只有相对较小的训练集,线性函数可能会工作的很好,而且你也没有足够的数据来拟合非常复杂的非线性函数。
如果n很少,而m大小适中,这里的n可能是1-1000之间的任何数,那么线性核函数的SVM会工作得很好。
n很小,m很大,现在的带有高斯函数SVM包,高斯函数的SVM运算速度会很慢,我通常会做的是手动地创建,拥有更多的特征变量,然后用逻辑回归或者不带核函数的支持向量机。
逻辑回归为什么和支持向量机放到一起?
因为逻辑回归和不带核函数的支持向量机,它们是非常相似的算法,都会做相似的事情,并给出相似的结果。但是根据实际情况,其中一个可能会比另一个更加有效。但是随着SVM复杂度的增加,当你使用不同的内核函数来学习复杂的非线性函数时,你特征变量的数量是相当大的,那是一个非常常见的体系,也许在这个体系里,带有核函数的支持向量机就会表现的相当突出。
什么时候使用神经网络?
对所有的这些问题,对于不同的设计,设计良好的神经网络,可能会非常有效,有一个缺点或者说有时可能不会使用神经网络的原因,对于许多这样的问题,神经网络训练起来可能会特别慢,但是如果你有一个非常好的SVM实现包,可能会运行的很快,比神经网络快很多。SVM具有的问题是一种凸优化问题,好的SVM软件包总是会找到全局最小值或者接近它的值。对于SVM,你不需要担心局部最优,而在神经网络中,局部最优是一个不大不小的问题。所以这是你在使用SVM的时候不需要太去担心的一个问题。根据你的问题,神经网络可能会比SVM慢。
迷茫!该用什么算法???这个没有太大关系,当我遇到机器学习问题的时候,有时它确实不清楚这是否是最好的算法,但是就如在之前视频中看到的算法确实很重要,但是更加重要的是你有多少数据, 你有多熟练,是否擅长做误差分析和排除学习算法,指出如何设定新的特征变量,弄明白你的学习算法输入哪些特征,通常这些方面会比你使用逻辑回归还是SVM这方面更加重要。
SVM仍然被广泛认为是最强大的学习算法之一。这是一个体系,包含了一个有效的方法去学习复杂的非线性函数。实际上,逻辑回归、神经网络与SVM一起使用来提高学习算法,创造最新的机器学习系统作为一个非常强大的算法工具,可以应用到很多地方。
高性能的机器学习系统!