本系列主要来自《
Mastering Machine Learning with scikit-learn
》,主要修订了所有例子并执行了测试。
本章主要讲机器学习(Machine Learning)的基本概念, 机器学习算法的应用,监督学习和无监督学习(supervised-unsupervised learning)的应用场景,训练和测试数据的用法,学习效果评估方式。
最后,对scikit-learn进行一些简单的介绍。
机器学习是设计和研究能够根据过去的经验来为未来做决策的软件,它是通过数据进行研究的程序。机器学习的基础是归纳(generalize),就是从已知案例数据中找出未知的规律。
机器学习的典型案例就是垃圾邮件过滤。通过对数千份已经打上是否为垃圾标签的邮件进行观察经验,对新邮件进行过滤。
计算机科学家Tom Mitchell对机器学习的定义更正式,“一个程序在完成任务T后获得了经验E,其表现为效果P,如果它完成任务T的效果是P ,那么会获得经验E”。
我们将使用Mitchell的定义来组织这一章的内容。
首先,什么是经验。
然后,任务可以分成那些基本类型。
最后,我们介绍机器学习系统效果评估方式。
从何学习
机器学习系统通常被看作是有无人类监督学习两种方式。
监督学习问题是,从
成对的已经标记好的输入
和输出经验数据作为一个输入进行学习,用来预测输出结果,
是从有正确答案的例子中学习。
而无监督学习是程序不能从已经标记好的数据中学习。它需要在自己在数据中发现一些规律。
监督学习与非监督学习可以看作机器学习的两端。还有一些中间类型,称为半监督学习,既包含监督数据也有非监督数据,这类问题可以看作是介于监督学习与非监督学习之间的学习。
半监督机器学习案例是一种增强学习(Reinforcement Learning),问题可以通过决策来获得反馈,
但是反馈与某一个决策可能没有直接关系。
例如,一个增强学习程序学习玩超级玛丽游戏,让它完成一级或超过一定分数会获得奖励,如果失败一次会受到惩罚。但是,监督反馈与具体要执行的决策无关,避开板栗仔(Goombas)或者跳过火轮圈。
监督学习是通过一个输入产生一个带标签的输出的经验数据对中进行学习。机器学习程序中输出结果有很多名称,一些属于机器学习领域,另外一些是专用术语。
本书中,我们把输出
结果
称为响应变量(response variable)
,不过输出结果还有其他名称,如因变量(dependent variables),回归值(regressands),标准变量(criterion variables),测得变量(measured variables),解释变量(explained variables),结果变量(outcome variables),实验变量(experimental variables),标签(labels),和输出变量(output variables)。
同理,输入变量也有很多名称。
本书把
输入变量
作为特征(features),它们测量的现象作为解释变量(explanatory variables)。
输入变量的其他名称有,预测值(predictors),解释变量(regressors),控制变量(controlled variables),操作便利(manipulated variables)和显现变量(exposure variables)。响应变量和解释变量可能需要真实的或不相关的数值。
构成监督学习经验的案例集合称为训练集(training set)。评估程序效果的案例集合称为测试集(test set)。
训练数据和测试数据
训练集里面的观测值构成了算法用来学习的经验数据。在监督学习问题中,每个观测值都由一个响应变量(结果)和若干个解释变量(输入变量)组成。
测试集是一个类似的观测值集合,用一些度量标准来评估模型的运行效果。
需要注意的是,测试集的数据不能出现在训练集中。否则,很难评价算法是否从训练集中学到了归纳能力,或者仅仅只是简单的记录了结果。
归纳很好的程序能够用新数据有效地完成任务。相反,一个通过记忆训练数据来学习复杂模型的程序,可能通过训练集准确预测响应变量的值,但是在处理新问题的时候由于没有归纳能力会预测失败。
训练集的记忆称为过度拟合(over-fitting)。一个记住了观测值的程序不一定能够很好的完成工作,因为它在记忆关系和结果的时候,把噪声也同时记住了。平衡记忆能力与归纳能力,或者说是过度拟合与拟合不够,是许多机器学习算法面对的共同问题。后面的章节,我们会介绍正则化(regularization),可以用来减轻许多模型的过度拟合程度。
除了训练集和测试集,还有一个观测值集合称为验证集(validation set或 hold-out set)。validation set是用来做模型选择(model selection),即做模型的最终优化及确定的。
training set是用来训练模型或确定模型参数的,如ANN中权值等; validation set是用来做模型选择(model selection),即做模型的最终优化及确定的,如ANN的结构;而 test set则纯粹是为了测试已经训练好的模型的推广能力。当然,test set这并不能保证模型的正确性,他只是说相似的数据用此模型会得出相似的结果。
Ripley, B.D(1996)在他的经典专著Pattern Recognition and Neural Networks中给出了这三个词的定义。
Training set: A set of examples used for
learning
, which is to fit the parameters [i.e., weights] of the classifier.
Validation set: A set of examples used to
tune the parameters
[i.e., architecture, not weights] of a classifier, for example to choose the number of hidden units in a neural network.
Test set: A set of examples used only to assess the performance [generalization] of a fully specified classifier.
Ripley还谈到了Why separate test and validation sets?
1. The error rate estimate of the final model on validation data will be biased (smaller than the true error rate) since the
validation set is used to select the final model.
2.
After assessing the final model with the test set, YOU MUST NOT tune the model any further.
Step 1) Training: Each type of algorithm has its own parameter options (the number of layers in a Neural Network, the number of trees in a Random Forest, etc). For each of your algorithms, you must pick one option. That’s why you have a validation set.
Step 2) Validating: You now have a collection of algorithms. You must pick one algorithm. That’s why you have a test set. Most people pick the algorithm that performs best on the validation set (and that's ok). But, if you do not measure your top-performing algorithm’s error rate on the test set, and just go with its error rate on the validation set, then you have blindly mistaken the “best possible scenario” for the “most likely scenario.” That's a recipe for disaster.
Step 3) Testing: I suppose that if your algorithms did not have any parameters then you would not need a third step. In that case, your validation step would be your test step. Perhaps Matlab does not ask you for parameters or you have chosen not to use them and that is the source of your confusion.
|
通常会把监督学习的观测值分成训练、验证和测试集三部分。各部分的大小没有要求,按实际观测值的规模来定。一般把50%以上的数据作为训练集,25%的数据做测试集,剩下的作为验证集。
机器学习算法有句老话“放入的是垃圾,出来的也是垃圾”。对一堆充满噪声、没有关联、或标签错误的数据进行学习的算法,也不会比只学习一小部分更有代表性的训练集的算法效果更好。
许多监督学习的训练集都是手工准备的,或者半自动处理。建一个海量监督数据集需要耗费许多资源。
scikit-learn有些数据集,可以让开发者直接验证自己的模型。
在开发阶段,尤其是训练集不够的时候,交叉验证(cross-validation )的方法可以用相同的数据对算法进行多次训练和检验。在交叉验证中,训练数据是分成N块的。算法用N-1块进行训练,再用最后一块进行测试。每块都被算法轮流处理若干次,保证算法可以训练和评估所有数据。下图就是5块数据的交叉验证方法:
数据集被等分成5块,从A标到E。开始的时候,模型用B到E进行训练,在A上测试。下一轮,在A,C,D和E上训练,用B进行测试。依次循环,直到每一块都测试过。交叉验证为模型的效果评估提供了比只有一个数据集更准确的方法。
机器学习任务
常见的
监督式机器学习任务就是分类(classification)和回归(regression)
。
分类认为需要学会从若干变量约束条件中预测出目标变量的
类别
,就是必须预测出新观测值的类型,种类或标签。
分类的应用包括预测股票的涨跌,新闻头条是政治新闻还是娱乐新闻。
回归问题需要预测连续变量的
数值
,
比如预测新产品的销量,或者依据工作的描述预算工资水平等。
常见的
无监督式机器学习任务是通过训练数据发现相关观测值的组别,称为类(clusters)。
对应的任务称为聚类(clustering
),通过一些相似性度量方法把一些观测值分成同一类。
聚类常用来分析数据集。比如有一些影评数据,聚类算法可以分辨积极的和消极的影评。
系统是不能给类加上“积极”或“消极”的标签的;没有监督,系统只能通过相似性度量方法把观测值分成两类。
降维(Dimensionality reduction)是另一个常见的无监督学习任务。有些问题可能包含成千上万个解释变量,处理起来非常麻烦。另外,有些解释变量属于噪音,也有些完全是无边的变量,这些影响都会降低程序的归纳能力。降维是发现对响应变量影响最大的解释变量的过程。
降维可以更容易的实现数据可视化。
如不同面积房子的价格数据可视化,房子的面积可以画在
x
轴,其价格可以画在
y
轴,很容易实现可视化。再加一个解释变量,也很容易可视化房屋价格的回归问题,比如房间里卫生间的数量可以画在
z
轴。但是,几千个解释变量的问题是不可能可视化的。
效果评估,偏差,方差
在监督学习问题中,
很多效果度量标准用来评估预测误差。
有两种基本的预测误差:模型的偏差(bias)和方差(variance)。
假设你有多个
不一样
的
训练集,但是都
具有代表性
。
一个高偏差无论它使用哪个训练集都会产生类似的误差。
一个高方差模型产生的误差就是不确定的,对于不同的训练集可能产生很准的结果,也可能产生误差很大,因为模型发觉了训练集里面的噪音部分并且进行了过度拟合。
就是说,高方差的模型是过度拟合了训练集数据,而一个模型有高偏差的时候,其实是拟合不够的表现。
偏差和方差就像飞镖射到靶子上。每个飞镖就是从不同数据集得出的预测结果。
高偏差、低方差的模型就是把飞镖扔到了离靶心很远的地方,但是都集中在一个位置。
低偏差、高方差的模型就是把飞镖扔到了离靶心很近的地方,但是并不是集中在一起的。
而高偏差、高方差的模型就是把飞镖扔到了靶子上,但是飞镖离靶心也很远,而且彼此间很分散。
最后就是低偏差、低误差的模型,把飞镖扔到了离靶心很近的地方,聚类效果也很好。
|
在理想情况下,模型具有低偏差和低误差,但是二者具有背反特征,即要降低一个指标的时候,另一个指标就会增加。这就是著名的偏差-方差均衡(Bias-Variance Trade-off)。
后面我们会介绍很多模型的偏差-方差均衡特点。
无监督学习问题没有误差项要评估
,其效果的是评估数据结构的一些属性。
大多数效果评估方法只能用于具体的任务。机器学习系统应该可以这样评估:用系统在真实世界中发生错误的代价来表示效果评估方法。
这看起来很明显,下面例子描述的是适用于一般任务而不只是具体任务的效果评估方法。
有一个对肿瘤数据进行观察的机器学习系统分类任务,需要预测肿瘤是恶性的还是良性的。
准确度,或者是正确分类的比例,就是对程序效果评价的直观度量方法。准确度能够评价程序效果,不过它不能区分出,误把良性肿瘤分为恶性肿瘤,和误把恶性肿瘤分为良性肿瘤的效果差异。在一些应用里,发生不同类型错误的代价是相同的。但是,在这个问题里面,没有识别出恶性肿瘤的代价要比误把良性肿瘤分为恶性肿瘤的代价要大的多
。
我们可以通过对每一种可能的预测结果进行评估来建立分类系统效果的不同评价方法。当系统正确地识别出一个恶性肿瘤,这个预测叫真阳性(True Positive, TP);如果把一个良性肿瘤分成了一个恶性肿瘤,叫假阳性(False Positive, FP);正确地识别出一个良性肿瘤叫真阴性(True Negative, TN);把一个恶性肿瘤分成了一个良性肿瘤,叫假阴性(False Negative, FN)。
这四个结果可以用来计算
分类系统
效果的评价体系,包括
准确率(Accuracy,正确率)
,
精确率(Precision)和召回率(Recall)
三项指标。
准确率, 所有判断正确的占所有判断的比例,这是一个全局的比例:
ACC = (TP+TN) / (TP+TN+FP+FN)
精确率是被判断为恶性肿瘤中,真正为恶性肿瘤统计结果所占比例:
P = TP / (TP+FP)
召回率是被正确被判断的恶性肿瘤占所有恶性肿瘤的比例:
R = TP / (TP+FN)
从精确率和召回率评估指标可以看出,高准确率的分类系统实际没有发现出所有的恶性肿瘤。如果绝大多数肿瘤都是良性的,那么分类器没有预测出恶性肿瘤也可以获得极高的准确率。而一个具有低准确率和高召回率的分类系统反而更好,因为它能够识别出更多恶性肿瘤。
可以看到,由于判断错误的成本不同, 所以仅仅考虑全局判断错误的比例也就是
ACC是不合适的。
通常我要考虑的是
主要判断目标的准确率
, 在这个例子中,主要判断目标是查出恶性肿瘤,所以通常都是用 P 是更加合适的。所以常用的就 P 和 R 两个指标,
准确率就是
找得对
,召回率就是
找得全。
当然Precision越高越好,同时Recall也越高越好,但事实上这两者在某些情况下有矛盾的。比如极端情况下,我们只搜索出了一个结果,且是准确的,那么Precision就是100%,但是Recall就很低;而如果我们把所有结果都返回,那么比如Recall是100%,但是Precision就会很低。因此在不同的场合中需要自己判断希望Precision比较高或是Recall比较高。
P和R指标有时候会出现的矛盾的情况,这样就需要综合考虑他们,最常见的方法就是F-Measure(又称为F-Score)。F-Measure是Precision和Recall加权调和平均:
当参数α=1时,就是最常见的F值,也即
可知F1综合了P和R的结果,当F1较高时则能说明试验方法比较有效。
F1-measure认为精确率和召回率的权重是一样的, 但有些场景下,我们可能认为精确率会更加重要, 调整参数a, 使用Fa-measure可以帮助我们更好的evaluate结果.
更多参考:
scikit-learn简介
自2007年发布以来,scikit-learn已经成为最给力的Python机器学习库(library)了。scikit-learn支持的机器学习算法包括分类,回归,降维和聚类。还有一些特征提取(extracting features)、数据处理(processing data)和模型评估(evaluating models)的模块。
作为Scipy库的扩展,scikit-learn也是建立在Python的NumPy和matplotlib库基础之上。NumPy可以让Python支持大量多维矩阵数据的高效操作,matplotlib提供了可视化工具,SciPy带有许多科学计算的模型。
scikit-learn文档完善,容易上手,丰富的API,使其在学术界颇受欢迎。开发者用scikit-learn实验不同的算法,只要几行代码就可以搞定。scikit-learn包括许多知名的机器学习算法的实现,包括LIBSVM和LIBLINEAR。还封装了其他的Python库,如自然语言处理的NLTK库。另外,scikit-learn内置了大量数据集,允许开发者集中于算法设计,节省获取和整理数据集的时间。
scikit-learn可以不受任何限制,遵从自由的BSD授权。许多scikit-learn的算法都可以快速执行而且可扩展,除了海量数据集以外。最后,scikit-learn稳定性很好,大部分代码都可以通过Python的自动化测试(mock,nose等)。