原文:http://sebastianraschka.com/Articles/2014_intro_supervised_learning.html
摘要:本文全面地介绍了机器学习里的监督学习的主要概念,并对监督学习的典型工作流程进行了详细的解析,具有很好的实践指导意义。
模式分类(pattern classification)和机器学习(machine learning)是非常热的话题,几乎在所有的现代应用程序中都得到了应用:例如邮局中的光学字符识别(OCR),电子邮件过滤,超市条形码扫描,等等。
在这篇文章中,我会简要描述一个典型的监督学习任务的主要概念,这些概念将作为将来的文章和实现各种学习算法的基础。
机器学习和模式分类
预测建模是建立一个能够进行预测的模型的通用概念。通常情况下,这样的模型包括一个机器学习算法,以便从训练数据集中学习某些属性做出这些预测。
预测建模可以进一步分成两个子集:回归和模式分类。回归模型基于变量和趋势之间的关系的分析,以便做出关于连续变量的预测,如天气预报的最高温度的预测。
与回归模型不同,模式分类的任务是分配离散的类标签到特定的observation作为预测的结果。回到上面的例子:在天气预报中的模式分类任务可能是一个晴天、雨天或雪天的预测。
抛开所有的可能性,本文的重点将放在“模式分类”,分配预先定义的类标签到特定实例将它们分成不同的类别的一般方法。“实例”是“observation”或“样本”的同义词,描述由一个或多个特征(或称为“属性”)组成的“对象”。
监督学习、无监督学习和强化学习
模式分类任务可被分成两个主要的子类别:监督学习和无监督学习。在监督学习中,用于构建分类模型的数据的类标签是已知的。例如,一个垃圾邮件过滤的数据集,它里面将包含垃圾邮件以及“火腿”(=不是垃圾邮件)消息。在有监督的学习问题中,我们已经知道了训练集中的邮件要么是垃圾邮件,要么是火腿。我们将会使用这些信息来训练我们的模型,以达到能对新增的不明确的邮件进行分类。
上图显示了一个典型的分类任务,用到的样本具有两个随机变量;训练数据(带有类标记)用图中的散点表示。红色点划线表明了线性决策(左侧)或者二次决策(右侧)的边界,这些边界决定了R1和R2的决策区域。新的observation将会根据它们所在的区域而被分配类标签“w1”或“w2”。对于那些未知的实例,我们已经假定我们的分类方法不是完美的,会有一定比例的样本可能被错误分类。
如果你对决策边界是如何被算出来的有兴趣,你可以查看我的模式分类库中的“统计模式分类示例”这一节的关于“IPython”部分的内容。
与此相反,无监督学习任务处理未标记的实例,并且这些类必须从非结构化数据集中推断出来。通常情况下,无监督学习采用聚类技术,使用基于一定的相似性(或距离)的度量方式来将无标记的样本进行分组。
第三类的学习算法使用“强化学习”这个概念来描述。在这种算法中,模型是通过一系列的操作而最大化“奖励函数”来进行学习。奖励函数的最大化,可以通过惩罚“坏行为”,和/或通过奖励“好行为”来实现。强化学习的一个常见的例子是根据环境反馈而进行学习自动驾驶的训练过程。我最近还偶然发现了强化学习的另外一个很好的例子,就是训练游戏“Flappy Bird”,使它能够自己玩。
监督学习 - 一个典型的工作流程
现今,当在“数据科学”领域开始引入各种概念的时候,著名的“鸢尾花(Iris)”花数据集可能是最常用的一个例子。1936年,R.A.Fisher在他的判别分析中创建和使用了Iris数据集。Iris现在可以从UCI机器学习库中免费得到。
在一个监督分类任务中,它将会是一个很好的例子。Iris中的花被分为了三类:Setosa , Virginica , 和Versicolor .而这150个实例中的每一个样本(单花)都有四个属性:
- 萼片的宽度
- 萼片的长度
- 花瓣的宽度
- 花瓣的高度
(所有测量单位都是厘米)
可视化
当我们需要处理一个新的数据集时,采用简单的可视化技术来解释数据分析是非常有用的,因为人的眼睛在发现模式方面是非常强大的。然而,有时我们必须处理的数据由三个以上的维度构成,这样就无法在一副图像中表达出来了。为了克服这种限制,一种方式可以将属性集分解成成对的属性集,然后创建一个散点图矩阵。在实践中,“良好的且有用的”可视化技术的选择高度依赖于数据的类型,特征空间的维数,和现实情况。
下面是Iris数据集的可视化的几个例子,或多或少有用。
用来创建这些图形的代码可以在“可视化技术进行探索性数据分析”一节中的IPython部分Matplotlib例子中找到。
根据上面的那些图,特别是散点图和(1D)直方图,我们已经可以看到,相对于三种不同的花,花瓣包含的辨别信息相对于花萼来说要更多一些,因为图形中花萼的宽度和长度差别更小一些。那么,该信息就可以用于特征选择,以去除噪声和减少我们的数据集的大小。
工作流程图
在下面的章节中,我们将会看到一些典型的监督学习任务的主要步骤,下图可以让我们直观地了解它们是如何连接的。
原始数据采集和特征提取
当我们下载完Iris数据集后,我们注意到,它已经具有“良好的结构”了,看来是R.A.Fisher已经为我们做了一些初步的“预处理”了。没有丢失的数据和具有数字化的特征,使得它可以被一种学习算法所使用。
然而,让我们假设该Iris数据集的原始数据是一系列的图像。在这种情况下,首先进行的预处理步骤(特征提取)可能涉及到这些图像的缩放,平移,和旋转,这样才能够获得以厘米表示的萼片和花瓣的尺寸。
叶子闭塞就成为一个问题了,这种情况可能会导致数据丢失:如果数据集中的数据丢失,而算法没有忽略丢失数据的选项,那么很多机器学习算法将无法使用这些数据集正常工作。如果稀疏性(也就是,数据集中空缺数据的数量)并不太高,那么通常的建议做法是除去任何包含缺失值的样本的行,或者丢失数据的属性列。另一种处理丢失的数据的策略是估算:使用某些统计数据来补充丢失的数据,而不是彻底清除掉丢失数据的样本。对于分类数据,丢失的值可以从出现频率最高的类别中得到;对于一些数值型的属性,丢失的值可以使用样品的平均值来代替。在一般情况下,通过k近邻插补得到的值来替换丢失数据被认为是优于使用总体样本均值进行替换的。
另外的一个关于特征提取的有趣方法可能包括花瓣和萼片的聚合运算,如花瓣或萼片宽度和高度之间的比率。
采样
假设我们从原始数据中提取到了某些特征(在这里:萼片宽度,萼片长度,花瓣宽度和花瓣长度),我们现在将把我们的数据随机分成训练和测试数据集。训练数据集将被用于训练模型,而测试数据集的作用是评价每次训练完成后最终模型的性能。
重要的是,我们对测试数据集只使用一次,这样在我们计算预测误差指标的时候可以避免过度拟合。过度拟合导致分类器在训练的时候表现良好,但是泛化能力一般。这样会使得在新的模式上面得出的预测误差值相当高。因此,在模型的创建中使用一些像交叉验证这样的技术,就能够提高分类性能。另外的一种策略是重新使用测试数据集来对模型进行评估,这需要创建第三个数据集,即所谓的验证数据集。
交叉验证
交叉验证是评估特征选择,降维,以及学习算法的不同组合的最有用的技术之一。交叉验证有许多种,最常见的一种很可能是k折交叉验证了。
在k-折交叉验证中,原始训练数据集被分成k个不同的子集(即所谓的“折叠”),其中,1个折叠被保留作为测试集,而另外的K-1个折叠被用于训练模型。例如,如果我们设定k等于4(即,4折叠),原始训练集的3个不同的子集将被用于训练模型,而第四个折叠将用于评价。经过4次迭代后,我们可以计算出最终模型的平均错误率(和标准差),这个平均错误率可以让我们看到模型的泛化能力如何。
规范化
为了能够比较不同的属性(比如,在聚类分析中通过计算距离或相似性),特别是当属性具有不同的度量时(比如,温度具有开尔文和摄氏表达方式),就需要用到规范化和其他的一些属性变换技术。对特征进行恰当的变换,是大多数机器学习算法的一个要求。
“规范化”常用的代名词是“最小-最大变换”:属性值被变换到一个特定的范围内,比如0到1之间。
另一种常见的方法是(Z值)“标准化”或“变换到单位方差”的过程:每个样品减去属性的平均值,然后除以标准差,这样属性将具有标准正态分布(μ= 0,σ= 1)的性质。
我们必须要记住其中很重要的一点:如果我们在训练集上使用了任何一种规范化或变换技术,那么我们就必须在测试集和未知数据集上使用相同的方法。
更详细的描述可以看另一篇的文章:About Feature Scaling and Normalization and the effect of standardization for machine learning algorithms .
特征选择和降维
乍一看,特征选择和降维之间的区别似乎违反直觉,因为特征选择,最终会导致(降维)到一个较小的特征空间。在实践中,术语“特征选择”和“降维”之间的主要区别在于:我们在特征选择中保持了“原始特征坐标轴”,而降维通常涉及变换技术。
这两种方法的主要目的是为了去除噪声,通过只保留“有用的”(可区分的)信息提高计算效率,并避免过度拟合(“维数灾难”)。
在特征选择中,我们感兴趣的是只保留那些“有意义”的功能,也就是那些可以帮助建立一个“好”的分类器的功能。举例来说,如果我们有一大堆描述花鸢尾的属性(颜色,高度等),那么特征选择可能最终会只保留4种测量数据,也就是描述花瓣和萼片尺寸的数据。或者,如果我们一开始就有了4个属性(萼片和花瓣长度和宽度),我们可以进一步缩小我们的选择,只保留花瓣的长度和宽度,从而将我们的特征空间从4维减少到2维。特征选择往往是基于领域知识的(可以看到,咨询领域内的专家对特征选择总是有帮助的),或探索性分析的,如我们在前面看到的直方图或散点图。想要找到一个特定大小的特征子集,用来最优化分类模型的性能,往往需要一个穷举搜索——搜索采样的所有可能组合。然而,在实际使用中,由于运算的限制,这种方法可能不具有可行性。所以常用序列特征选择或遗传算法来选出一个次优的特征子集。
常用的降维技术是线性变换,如主成分分析(PCA)和线性判别分析(LDA)。PCA可以看成是一个“无监督”算法,因为它“忽略”了类别,它的目标是找到数据集中方差最大的方向(所谓的主成分)。相对于PCA,LDA是带“监督”的,它计算出多个类之间的最大区分的方向(“线性判别式”)。
关于PCA和LDA更多细节可以在这两篇文章中找到:
- Linear Discriminant Analysis bit by bit
- Implementing a Principal Component Analysis ( PCA ) in Python step by step
下面的图像显示了通过线性判别分析(LDA)将Iris数据转换到二维特征子空间后的情形。黑线表示了线性决策边界,它将特征空间分成了3个决策区域(R1,R2,R3)。在此决策区域的基础上,新的观测结果可被分为三个不同的花种之一:R1 → Virginica , R2 → Versicolor , and R3 → Setosa .
学习算法和超参数调整
学习算法各式各样,数量庞大,有各种文章和应用对最流行的算法做了详细的介绍。下面仅是对四种常用的监督学习算法所做的一个非常简短的总结:
- 支持向量机(SVM)是利用采样超平面分隔两个或多个类的分类方法。最终,具有最大间隔的超平面被保留,其中“间隔”指的是从采样点到超平面的最小距离。组成间隔的采样点称为支持向量,从而建立起最终的SVM模型。
- 贝叶斯分类器是基于一个统计的模型(即贝叶斯定理:后验概率的计算基于先验概率和所谓的似然)。一个朴素贝叶斯分类器假定所有属性都是条件独立的,因此,计算似然可以简化为计算带有特定类标签的独立属性的条件概率的乘积就行了。
- 人工神经网络(ANN)是模仿人或动物“大脑”的图类分类器,其中相互连接的节点模拟的是神经元。
- 决策树分类器 是树形图,其中,图中的节点用于测试某个特征子集的特定条件,然后分支把决策分割到叶子节点上。图中的树叶表示最低级别,用于确定类的标签。通过最小化基尼杂质,或者最大化信息增益可以训练成为最佳树。
可以使用Iris得到一个非常简单的决策树,像这样:
如果分类器或者评估器的参数不是从机器学习步骤中直接得到的,而是利用单独的优化得到,那么这些参数称为超参数。超参数优化的目标是提高分类器的性能,实现学习算法的良好泛化能力。一种常用的超参数优化方法是网格搜索。通常情况下,网格搜索是通过对候选参数进行穷举搜索(相对于随机参数优化)而实现的。当模型的所有参数组合都被评估之后,最佳组合将被保留下来。
预测误差指标和模型选择
混淆矩阵是一种用于性能评估的方便工具,它是一个方阵,里面的列和行存放的是样本的实际类vs预测类的数量。
“垃圾邮件与火腿”分类问题的混淆矩阵可以是这样的:
通常,使用预测“准确率”或“差错率”来报告分类性能。准确率定义为正确分类的样本占总样本的比值;它经常被用作特异性/精密性的同义词,尽管它的计算方法不同。准确率的计算公式是:
其中,TP =真阳性,TN =真阴性,P =阳性,N =阴性。
分类模型的经验误差可以通过计算1-准确率得到。
然而,如何选择一个适当的预测误差度量是高度依赖于具体问题的。在“垃圾邮件”分类的情况中,我们更加关注的是低误报率。当然,垃圾邮件被分成了火腿肯定是烦人的,但不是那么糟糕。要是一封邮件被误分为垃圾邮件,而导致重要信息丢失,那才是更糟糕的呢。
在如“垃圾邮件”分类的二元分类问题中,有一种方便的方式来调整分类器,称为接受者操作特性(ROC或ROC曲线)。
分类性能的其他指标还有灵敏度,特异性,查全率和精密性。
- 灵敏度(同查全率)和精密性用来评估二元分类问题中的“真阳性率”:也就是对“阳性/真”预测准确的概率(比如,当试图预测某种疾病的时候,如果一个病人长了这种病,那么正确的预测出这个人长了这种病,就是“阳性/真”)。
- 特异性描述了二元分类问题中的“真阴性率”:这指的是对“假/阴性”情况作出正确预测的概率(例如,在试图预测疾病时,对一个健康者,没有预测到疾病,就是这种情况)。
在一个典型的监督学习的工作流程中,为了能够选出一个具有满意性能的模型,我们将会评估特征子空间、学习算法和超参数的各种不同的组合。正如前面提到的,交叉验证法是一种好的方法,可以避免过拟合我们的训练数据。