各位大牛助手类似们,能讲讲原理么,基于单片机来电显

机器学习(9)
下面将会对机器学习算法的不同的实现范式进行讲解,既有来自文献中的,也有来自开源社区里的。首先,这里列出了目前可用的三代机器学习工具。
传统的机器学习和数据分析的工具,包括SAS,IBM的SPSS,Weka以及R语言。它们可以在小数据集上进行深度分析——工具所运行的节点的内存可以容纳得下的数据集。
第二代机器学习工具,包括Mahout,Pentaho,以及RapidMiner。它们可以对大数据进行我称之为粗浅的分析。基于Hadoop之上进行 的传统机器学习工具的规模化的尝试,包括Revolution Analytics的成果(RHadoop)以及Hadoop上的SAS,都可以归到第二代工具里面。
第三代工具,比如Spark, Twister,HaLoop,Hama以及GraphLab。它们可以对大数据进行深度的分析。传统供应商最近的一些尝试包括SAS的内存分析,也属于这一类。
第一代机器学习工具/范式
由于第一代工具拥有大量的机器学习算法,因此它们适合进行深度的分析。然而,由于可扩展性的限制,它们并不都能在大数据集上进行工作——比如TB或者PB 级的数据(受限于这些工具本质上是非分布式的)。也就是说,它们可以进行垂直扩展(你可以提高工具运行的节点的处理能力),但无法进行水平扩展(它们并非 都能在集群上运行)。第一代工具的供应商通过建立Hadoop连接器以及提供集群选项来解决这些局限性——这意味着它们在努力对R或者SAS这样的工具进 行重新设计以便可以进行水平扩展。这些都应该归入第二代和第三代工具,下面我们将会介绍到。
第二代机器学习工具/范式
第二代工具(现在我们可以把传统的机器学习工具比如SAS这些称之为第一代工具了)比如 Mahout(),Rapidminer以及Pentaho,它们通过在开源的MapReduce产品 ——Hadoop之上实现相关算法,提供了扩展到大数据集上的能力。这些工具仍在快速完善并且是开源的(尤其是Mahout)。Mahout拥有一系列的 聚类及分类的算法,以及一个相当不错的推荐算法(Konstan和Riedl,2012)。因此它可以进行大数据的处理,现在在生产环境上已经有大量的使 用案例,主要用于推荐系统。我在一个线上系统中也使用Mahout来实现了一个金融领域的推荐算法,发现它确是可扩展的,尽管并不是一点问题没有(我还修 改了相当一部分代码)。关于Mahou的一项评测发现它只实现了机器学习算法中的很小的一个子集——只有25个算法是达到了生产质量的,8到9个在 Hadoop之上可用,这意味着能在大数据集上进行扩展。这些算法包括线性回归,线性支持向量机,K-means聚类算法,等等。它通过并行训练,提供了 顺序逻辑回归的一个快速的实现。然而,正如别人指出的(比如),它没有实现非线性支持向量机以及多变项逻辑回归(这也称为离散选择模 型)。
毕竟来说,本书并不是要为了抨击Mahout的。不过我认为有些机器学习算法的确是很难在Hadoop上实现,比如支持向量机的核函数以及共轭梯度法 (CGD,值得注意的是Mahout实现了一个随机梯度下降)。这一点别人也同样指出了,比方说可以看一下Srirama教授的一篇论文(Srirama 等人,2012年)。这里详细地比较了Hadoop和Twister MR(Ekanayake等,2010年)在诸如共轭梯度法等迭代式算法上的不同,它指出,Hadoop上的开销非常明显。我所说的迭代式是指什么?一组执行特定计算的实体,在等待邻居或者其它实体的返回结果,然后再进行下一轮迭代。CGD是迭代式算法的最佳范例——每个CGD都可以分解成daxpy,ddot,matmul等原语。我会分别解释这三种原语都是什么:daxpy操作将向量x与常量k相乘,然后再和另一个向量y进行相加;ddot会计算两个向量x,y的点积;matmul将矩阵与向量相乘,然后返回另一个向量。这意味着每个操作对应一个MapReduce操作,一次迭代会有6个MR操作,最终一次CG运算会有100个MR操作,以及数GB的数据交互,尽管这只是很小的矩阵。事实上,准备每次迭代的开销(包括从HDFS加载数据到内存的开销)比迭代运算本身的都大,这导致Hadoop上的MR会出现性能下降。相反,Twister会区分静态数据和可变数据,使得数据可以在MR迭代过程中常驻内存,同时还有一个合并阶段来收集reduce阶段输出的结果,因此性能有明显的提升。
第二代工具还有一些是传统工具基于Hadoop上进行的扩展。这类可供选择的有Revolution Analytics的产品,它是在Hadoop上对R语言进行了扩展,以及在Hadoop上实现R语言程序的一个可扩展的运行时环境(Venkataraman等
,2012)。SAS的内存分析,作为SAS的高性能分析工具包中的一部分,是传统工具在Hadoop集群上进行规模化的另一个尝试。然而,最近发布的版本不仅能在Hadoop上运行,同时也支持Greenplum/Teradata,这应该算作是第三代机器学习的方法。另一个有趣的产品是一家叫Concurrent Systems的初创公司实现的,它提供了一个预测模型标记语言(Predictive Modeling Markup Language,PMML)在Hadoop上的运行环境。PMML的模型有点类似XML,使得模型可以存储在描述性语言的文件中。传统工具比如 R以及SAS都可以将模型保存在PMML文件里。Hadoop上的运行环境使得它们可以将这些模型文件存储到一个Hadoop集群上,因此它们也属于第二代工具/范式。
第三代机器学习工具/范式
Hadoop自身的局限性以及它不太适合某类应用程序,这促进研究人员提出了新的替代方案。第三代工具主要是尝试超越Hadoop来进行不同维度的分析。我将会根据三种维度来讨论不同的实现方案,分别是机器学习算法,实时分析以及图像处理。
迭代式机器学习算法
伯克利大学的研究人员提出了一种替代方案:Spark(Zaharia等,2010年)——也就是说,在大数据领域,Spark被视为是替换Hadoop的下一代数据处理的解决方案。Spark有别于Hadoop的关键思想在于它的内存计算,这使得数据可以在不同的迭代和交互间缓存在内存里。研发Spark的主要原因是,常用的MR方法,只适用于那些可以表示成无环数据流的应用程序,并不适用于其它程序,比如那些在迭代中需要重用工作集的应用。因此他们提出了这种新的集群计算的方法,它不仅能提供和MR类似的保证性和容错性,并且能同时支持迭代式及非迭代式应用。伯克利的研究人员提出了一套技术方案叫作BDAS,它可以在集群的不同节点间运行数据分析的任务。BDAS中最底层的组件叫做Mesos,这是个集群管理器,它会进行任务分配以及集群任务的资源管理。第二个组件是基于Mesos构建的Tachyon文件系统 。Tachyon提供了一个分布式文件系统的抽象以及在集群间进行文件操作的接口。在实际的实施方案中,作为运算工具的Spark,是基于Tachyon和Mesos来实现的,尽管不用Tachyon,甚至是不用Mesos也可以实现。而在Spark基础上实现的Shark,则提供了集群层面的结构化查询 语言的抽象——这和Hive在Hadoop之上提供的抽象是一样的。Zacharia等人在他们的文章中对Spark进行了探索,这是实现机器学习算法的重要组成部分。
HaLoop(Bu等人,2010)也扩展了Hadoop来实现机器学习算法——它不仅为迭代式应用的表示提供了一层编程抽象,同时还使用了缓存的概念来 进行迭代间的数据共享,以及对定点进行校验,从而提高了效率。Twister(
)是类似HaLoop的一个产品。
实时分析是超越Hadoop考虑的第二个维度。来自Twitter的Storm(感觉原文说反了)是这一领域的最有力的竞争者。Storm是一个可扩展的复杂事件处理引擎,它使得基于事件流的实时复杂运算成为了可能。一个Storm集群的组件包括:
Spout,用于从不同的数据源中读取数据。有HDFS类型的spout,Kafka类型的spout,以及TCP流的spout。
Bolt,它用于数据处理。它们在流上进行运算。基于流的机器学习算法通常都在这里运行。
拓扑。这是具体应用特定的spout和bolt的一个整合——拓扑运行于集群的节点上。
在实践中,一个架构如果同时包含了Kafka(来自LinkedIn的一个分布式队列系统)集群来作为高速的数据提取器,以及Storm集群来进行处理或 者分析,它的表现会非常不错,Kafka spout用来快速地从Kafka集群中读取数据。Kafka集群将事件存储在队列中。由于Storm集群正忙于进行机器学习,因此这么做是很有必要 的。本书的后续章节将会对这个架构进行详细的介绍,以及在Storm集群中运行机器学习算法所需的步骤。Storm也被拿来跟实时计算领域的其它竞争者进 行比较,包括Yahoo的S4以及Typesafe的Akka。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1942508次
积分:20549
积分:20549
排名:第318名
原创:205篇
转载:10篇
评论:154条
专注于开发分布式任务调度框架、分布式同步RPC、异步MQ消息队列、分布式日志检索框架、hadoop、spark、scala等技术
写博客很辛苦的,如果我的写的文章能对您有帮助,请您能给点捐助(支付宝账号:),谢谢大家的支持了
个人所有博客,目前四个博客文章同步更新:
(1)(6)(5)(55)(31)(22)(4)(2)(6)(8)(8)(48)(3)(1)(2)(1)(9)(5)
本博客内容,由本人精心整理
欢迎交流,欢迎转载,大家转载注明出处,禁止用于商业目的。热门推荐:
  作者授权转载
  作者:寒小阳
  摘自:http://blog.csdn.net/han_xiaoyang/article/details/
  大数据文摘愿意为读者打造高质量【机器学习讨论群】,措施如下
  (1)群内定期组织分享
  (2)确保群内分享者和学习者数量适合,有分享能力者不限名额,学习者数量少于分享者,按申请顺序排序。
  点击文末“阅读原文”填表入群
  提起笔来写这篇博客,突然有点愧疚和尴尬。愧疚的是,工作杂事多,加之懒癌严重,导致这个系列一直没有更新,向关注该系列的同学们道个歉。尴尬的是,按理说,机器学习介绍与算法一览应该放在最前面写,详细的应用建议应该在讲完机器学习常用算法之后写,突然莫名奇妙在中间插播这么一篇,好像有点打乱主线。
  老话说『亡羊补牢,为时未晚』,前面开头忘讲的东西,咱在这块儿补上。我们先带着大家过一遍传统机器学习算法,基本思想和用途。把问题解决思路和方法应用建议提前到这里的想法也很简单,希望能提前给大家一些小建议,对于某些容易出错的地方也先给大家打个预防针,这样在理解后续相应机器学习算法之后,使用起来也有一定的章法。
  2.机器学习算法简述
  按照不同的分类标准,可以把机器学习的算法做不同的分类。
  2.1 从机器学习问题角度分类
  我们先从机器学习问题本身分类的角度来看,我们可以分成下列类型的算法:
  监督学习算法
  机器学习中有一大部分的问题属于『监督学习』的范畴,简单口语化地说明,这类问题中,给定的训练样本中,每个样本的输入x都对应一个确定的结果y,我们需要训练出一个模型(数学上看是一个x→y的映射关系f),在未知的样本x′给定后,我们能对结果y′做出预测。
  这里的预测结果如果是离散值(很多时候是类别类型,比如邮件分类问题中的垃圾邮件/普通邮件,比如用户会/不会购买某商品),那么我们把它叫做分类问题(classification problem);如果预测结果是连续值(比如房价,股票价格等等),那么我们把它叫做回归问题(regression problem)。
  有一系列的机器学习算法是用以解决监督学习问题的,比如最经典的用于分类问题的朴素贝叶斯、逻辑回归、支持向量机等等;比如说用于回归问题的线性回归等等。
  无监督学习
  有另外一类问题,给我们的样本并没有给出『标签/标准答案』,就是一系列的样本。而我们需要做的事情是,在一些样本中抽取出通用的规则。这叫做『无监督学习』。包括关联规则和聚类算法在内的一系列机器学习算法都属于这个范畴。
  半监督学习
  这类问题给出的训练数据,有一部分有标签,有一部分没有标签。我们想学习出数据组织结构的同时,也能做相应的预测。此类问题相对应的机器学习算法有自训练(Self-Training)、直推学习(Transductive Learning)、生成式模型(Generative Model)等。
  总体说来,最常见是前两类问题,而对应前两类问题的一些机器学习算法如下:
  2.2 从算法的功能角度分类
  我们也可以从算法的共性(比如功能,运作方式)角度对机器学习算法分类。下面我们根据算法的共性去对它们归个类。不过需要注意的是,我们下面的归类方法可能对分类和回归有比较强的倾向性,而这两类问题也是最常遇到的。
  2.2.1 回归算法(Regression Algorithms)
  回归算法是一种通过最小化预测值与实际结果值之间的差距,而得到输入特征之间的最佳组合方式的一类算法。对于连续值预测有线性回归等,而对于离散值/类别预测,我们也可以把逻辑回归等也视作回归算法的一种,常见的回归算法如下:
  Ordinary Least Squares Regression (OLSR)
  Linear Regression
  Logistic Regression
  Stepwise Regression
  Locally Estimated Scatterplot Smoothing (LOESS)
  Multivariate Adaptive Regression Splines (MARS)
  2.2.2 基于实例的算法(Instance-based Algorithms)
  这里所谓的基于实例的算法,我指的是我们最后建成的模型,对原始数据样本实例依旧有很强的依赖性。这类算法在做预测决策时,一般都是使用某类相似度准则,去比对待预测的样本和原始样本的相近度,再给出相应的预测结果。常见的基于实例的算法有:
  k-Nearest Neighbour (kNN)
  Learning Vector Quantization (LVQ)
  Self-Organizing Map (SOM)
  Locally Weighted Learning (LWL)
  2.2.3 决策树类算法(Decision Tree Algorithms)
  决策树类算法,会基于原始数据特征,构建一颗包含很多决策路径的树。预测阶段选择路径进行决策。常见的决策树算法包括:
  Classification and Regression Tree (CART)
  Iterative Dichotomiser 3 (ID3)
  C4.5 and C5.0 (different versions of a powerful approach)
  Chi-squared Automatic Interaction Detection (CHAID)
  Conditional Decision Trees
  2.2.4 贝叶斯类算法(Bayesian Algorithms)
  这里说的贝叶斯类算法,指的是在分类和回归问题中,隐含使用了贝叶斯原理的算法。包括:
  Naive Bayes
  Gaussian Naive Bayes
  Multinomial Naive Bayes
  Averaged One-Dependence Estimators (AODE)
  Bayesian Belief Network (BBN)
  Bayesian Network (BN)
  2.2.5 聚类算法(Clustering Algorithms)
  聚类算法做的事情是,把输入样本聚成围绕一些中心的『数据团』,以发现数据分布结构的一些规律。常用的聚类算法包括:
  k-Means
  Hierarchical Clustering
  Expectation Maximisation (EM)
  2.2.6 关联规则算法(Association Rule Learning Algorithms)
  关联规则算法是这样一类算法:它试图抽取出,最能解释观察到的训练样本之间关联关系的规则,也就是获取一个事件和其他事件之间依赖或关联的知识,常见的关联规则算法有:
  Apriori algorithm
  Eclat algorithm
  2.2.7 人工神经网络类算法(Artificial Neural Network Algorithms)
  这是受人脑神经元工作方式启发而构造的一类算法。需要提到的一点是,我把『深度学习』单拎出来了,这里说的人工神经网络偏向于更传统的感知算法,主要包括:
  Perceptron
  Back-Propagation
  Radial Basis Function Network (RBFN)
  2.2.8 深度学习(Deep Learning Algorithms)
  深度学习是近年来非常火的机器学习领域,相对于上面列的人工神经网络算法,它通常情况下,有着更深的层次和更复杂的结构。有兴趣的同学可以看看我们另一个系列机器学习与计算机视觉,最常见的深度学习算法包括:
  Deep Boltzmann Machine (DBM)
  Deep Belief Networks (DBN)
  Convolutional Neural Network (CNN)
  Stacked Auto-Encoders
  2.2.9 降维算法(Dimensionality Reduction Algorithms)
  从某种程度上说,降维算法和聚类其实有点类似,因为它也在试图发现原始训练数据的固有结构,但是降维算法在试图,用更少的信息(更低维的信息)总结和描述出原始信息的大部分内容。
  有意思的是,降维算法一般在数据的可视化,或者是降低数据计算空间有很大的作用。它作为一种机器学习的算法,很多时候用它先处理数据,再灌入别的机器学习算法学习。主要的降维算法包括:
  Principal Component Analysis (PCA)
  Principal Component Regression (PCR)
  Partial Least Squares Regression (PLSR)
  Sammon Mapping
  Multidimensional Scaling (MDS)
  Linear Discriminant Analysis (LDA)
  Mixture Discriminant Analysis (MDA)
  Quadratic Discriminant Analysis (QDA)
  Flexible Discriminant Analysis (FDA)
  2.2.10 模型融合算法(Ensemble Algorithms)
  严格意义上来说,这不算是一种机器学习算法,而更像是一种优化手段/策略,它通常是结合多个简单的弱机器学习算法,去做更可靠的决策。拿分类问题举个例,直观的理解,就是单个分类器的分类是可能出错,不可靠的,但是如果多个分类器投票,那可靠度就会高很多。常用的模型融合增强方法包括:
  Random Forest
  Boosting
  Bootstrapped Aggregation (Bagging)
  AdaBoost
  Stacked Generalization (blending)
  Gradient Boosting Machines (GBM)
  Gradient Boosted Regression Trees (GBRT)
  2.3 机器学习算法使用图谱
  scikit-learn作为一个丰富的python机器学习库,实现了绝大多数机器学习的算法,有相当多的人在使用,于是我这里很无耻地把machine learning cheat sheet for sklearn搬过来了,原文可以看这里。哈哈,既然讲机器学习,我们就用机器学习的语言来解释一下,这是针对实际应用场景的各种条件限制,对scikit-learn里完成的算法构建的一颗决策树,每一组条件都是对应一条路径,能找到相对较为合适的一些解决方法,具体如下:
  首先样本量如果非常少的话,其实所有的机器学习算法都没有办法从里面『学到』通用的规则和模式,so多弄点数据是王道。然后根据问题是有/无监督学习和连续值/离散值预测,分成了分类、聚类、回归和维度约减四个方法类,每个类里根据具体情况的不同,又有不同的处理方法。
  3. 机器学习问题解决思路
  上面带着代价走马观花过了一遍机器学习的若干算法,下面我们试着总结总结在拿到一个实际问题的时候,如果着手使用机器学习算法去解决问题,其中的一些注意点以及核心思路。主要包括以下内容:
  拿到数据后怎么了解数据(可视化)
  选择最贴切的机器学习算法
  定位模型状态(过/欠拟合)以及解决方法
  大量极的数据的特征分析与可视化
  各种损失函数(loss function)的优缺点及如何选择
  多说一句,这里写的这个小教程,主要是作为一个通用的建议和指导方案,你不一定要严格按照这个流程解决机器学习问题。
  3.1 数据与可视化
  我们先使用scikit-learn的make_classification函数来生产一份分类数据,然后模拟一下拿到实际数据后我们需要做的事情。
  我们生成了一份包含1000个分类数据样本的数据集,每个样本有20个数值特征。同时我们把数据存储至pandas中的DataFrame数据结构中。我们取前几行的数据看一眼:
  不幸的是,肉眼看数据,尤其是维度稍微高点的时候,很有可能看花了也看不出看不出任何线索。幸运的是,我们对于图像的理解力,比数字好太多,而又有相当多的工具可以帮助我们『可视化』数据分布。
  我们在处理任何数据相关的问题时,了解数据都是很有必要的,而可视化可以帮助我们更好地直观理解数据的分布和特性
  数据的可视化有很多工具包可以用,比如下面我们用来做数据可视化的工具包Seaborn。最简单的可视化就是数据散列分布图和柱状图,这个可以用Seanborn的pairplot来完成。以下图中2种颜色表示2种不同的类,因为20维的可视化没有办法在平面表示,我们取出了一部分维度,两两组成pair看数据在这2个维度平面上的分布状况,代码和结果如下:
  我们从散列图和柱状图上可以看出,确实有些维度的特征相对其他维度,有更好的区分度,比如第11维和14维看起来很有区分度。这两个维度上看,数据点是近似线性可分的。而12维和19维似乎呈现出了很高的负相关性。接下来我们用Seanborn中的corrplot来计算计算各维度特征之间(以及最后的类别)的相关性。代码和结果图如下:
  相关性图很好地印证了我们之前的想法,可以看到第11维特征和第14维特征和类别有极强的相关性,同时它们俩之间也有极高的相关性。而第12维特征和第19维特征却呈现出极强的负相关性。强相关的特征其实包含了一些冗余的特征,而除掉上图中颜色较深的特征,其余特征包含的信息量就没有这么大了,它们和最后的类别相关度不高,甚至各自之间也没什么先惯性。
  插一句,这里的维度只有20,所以这个相关度计算并不费太大力气,然而实际情形中,你完全有可能有远高于这个数字的特征维度,同时样本量也可能多很多,那种情形下我们可能要先做一些处理,再来实现可视化了。别着急,一会儿我们会讲到。
  3.2 机器学习算法选择
  数据的情况我们大致看了一眼,确定一些特征维度之后,我们可以考虑先选用机器学习算法做一个baseline的系统出来了。这里我们继续参照上面提到过的机器学习算法使用图谱。
  我们只有1000个数据样本,是分类问题,同时是一个有监督学习,因此我们根据图谱里教的方法,使用LinearSVC(support vector classification with linear kernel)试试。注意,LinearSVC需要选择正则化方法以缓解过拟合问题;我们这里选择使用最多的L2正则化,并把惩罚系数C设为10。我们改写一下sklearn中的学习曲线绘制函数,画出训练集和交叉验证集上的得分:
  这幅图上,我们发现随着样本量的增加,训练集上的得分有一定程度的下降,交叉验证集上的得分有一定程度的上升,但总体说来,两者之间有很大的差距,训练集上的准确度远高于交叉验证集。这其实意味着我们的模型处于过拟合的状态,也即模型太努力地刻画训练集,一不小心把很多噪声的分布也拟合上了,导致在新数据上的泛化能力变差了。
  3.2.1 过拟合的定位与解决
  问题来了,过拟合咋办?
  针对过拟合,有几种办法可以处理:
  增大样本量
  这个比较好理解吧,过拟合的主要原因是模型太努力地去记住训练样本的分布状况,而加大样本量,可以使得训练集的分布更加具备普适性,噪声对整体的影响下降。恩,我们提高点样本量试试:
  是不是发现问题好了很多?随着我们增大训练样本量,我们发现训练集和交叉验证集上的得分差距在减少,最后它们已经非常接近了。增大样本量,最直接的方法当然是想办法去采集相同场景下的新数据,如果实在做不到,也可以试试在已有数据的基础上做一些人工的处理生成新数据(比如图像识别中,我们可能可以对图片做镜像变换、旋转等等),当然,这样做一定要谨慎,强烈建议想办法采集真实数据。
  减少特征的量(只用我们觉得有效的特征)
  比如在这个例子中,我们之前的数据可视化和分析的结果表明,第11和14维特征包含的信息对识别类别非常有用,我们可以只用它们。
  从上图上可以看出,过拟合问题也得到一定程度的缓解。不过我们这是自己观察后,手动选出11和14维特征。那能不能自动进行特征组合和选择呢,其实我们当然可以遍历特征的组合样式,然后再进行特征选择(前提依旧是这里特征的维度不高,如果高的话,遍历所有的组合是一个非常非常非常耗时的过程!!):
  如果你自己跑一下程序,会发现在我们自己手造的这份数据集上,这个特征筛选的过程超级顺利,但依旧像我们之前提过的一样,这是因为特征的维度不太高。
  从另外一个角度看,我们之所以做特征选择,是想降低模型的复杂度,而更不容易刻画到噪声数据的分布。从这个角度出发,我们还可以有(1)多项式你和模型中降低多项式次数
  (2)神经网络中减少神经网络的层数和每层的结点数 (c)SVM中增加RBF-kernel的bandwidth等方式来降低模型的复杂度。
  话说回来,即使以上提到的办法降低模型复杂度后,好像能在一定程度上缓解过拟合,但是我们一般还是不建议一遇到过拟合,就用这些方法处理,优先用下面的方法:
  增强正则化作用(比如说这里是减小LinearSVC中的C参数)
  正则化是我认为在不损失信息的情况下,最有效的缓解过拟合现象的方法。
  调整正则化系数后,发现确实过拟合现象有一定程度的缓解,但依旧是那个问题,我们现在的系数是自己敲定的,有没有办法可以自动选择最佳的这个参数呢?可以。我们可以在交叉验证集上做grid-search查找最好的正则化系数(对于大数据样本,我们依旧需要考虑时间问题,这个过程可能会比较慢):
  在500个点得到的结果是:{‘C’: 0.01}
  使用新的C参数,我们再看看学习曲线:
  对于特征选择的部分,我打算多说几句,我们刚才看过了用sklearn.feature_selection中的SelectKBest来选择特征的过程,也提到了在高维特征的情况下,这个过程可能会非常非常慢。那我们有别的办法可以进行特征选择吗?比如说,我们的分类器自己能否甄别那些特征是对最后的结果有益的?这里有个实际工作中用到的小技巧。
  我们知道:
  l2正则化,它对于最后的特征权重的影响是,尽量打散权重到每个特征维度上,不让权重集中在某些维度上,出现权重特别高的特征。
  而l1正则化,它对于最后的特征权重的影响是,让特征获得的权重稀疏化,也就是对结果影响不那么大的特征,干脆就拿不着权重。
  那基于这个理论,我们可以把SVC中的正则化替换成l1正则化,让其自动甄别哪些特征应该留下权重。
  好了,我们一起来看看最后特征获得的权重:
  得到结果:
  你看,5 9 11 12 17 18这些维度的特征获得了权重,而第11维权重最大,也说明了它影响程度最大。
  3.2.2 欠拟合定位与解决
  我们再随机生成一份数据[1000*20]的数据(但是分布和之前有变化),重新使用LinearSVC来做分类。
  简直烂出翔了有木有,二分类问题,我们做随机猜测,准确率都有0.5,这比随机猜测都高不了多少!!!怎么办?
  不要盲目动手收集更多资料,或者调整正则化参数。我们从学习曲线上其实可以看出来,训练集上的准确度和交叉验证集上的准确度都很低,这其实就对应了我们说的『欠拟合』状态。别急,我们回到我们的数据,还是可视化看看:
  你发现什么了,数据根本就没办法线性分割!!!,所以你再找更多的数据,或者调整正则化参数,都是无济于事的!!!
  那我们又怎么解决欠拟合问题呢?通常有下面一些方法:
  调整你的特征(找更有效的特征!!)
  比如说我们观察完现在的数据分布,然后我们先对数据做个映射:
  卧槽,少年,这准确率,被吓尿了有木有啊!!!所以你看,选用的特征影响太大了,当然,我们这里是人工模拟出来的数据,分布太明显了,实际数据上,会比这个麻烦一些,但是在特征上面下的功夫还是很有回报的。
  使用更复杂一点的模型(比如说用非线性的核函数)
  我们对模型稍微调整了一下,用了一个复杂一些的非线性rbf kernel:
  你看,效果依旧很赞。
  3.3 关于大数据样本集和高维特征空间
  我们在小样本的toy dataset上,怎么捣鼓都有好的方法。但是当数据量和特征样本空间膨胀非常厉害时,很多东西就没有那么好使了,至少是一个很耗时的过程。举个例子说,我们现在重新生成一份数据集,但是这次,我们生成更多的数据,更高的特征维度,而分类的类别也提高到5。
  3.3.1 大数据情形下的模型选择与学习曲线
  在上面提到的那样一份数据上,我们用LinearSVC可能就会有点慢了,我们注意到机器学习算法使用图谱推荐我们使用SGDClassifier。其实本质上说,这个模型也是一个线性核函数的模型,不同的地方是,它使用了随机梯度下降做训练,所以每次并没有使用全部的样本,收敛速度会快很多。再多提一点,SGDClassifier对于特征的幅度非常敏感,也就是说,我们在把数据灌给它之前,应该先对特征做幅度调整,当然,用sklearn的StandardScaler可以很方便地完成这一点。
  StandardScaler每次只使用一部分(mini-batch)做训练,在这种情况下,我们使用交叉验证(cross-validation)并不是很合适,我们会使用相对应的progressive validation:简单解释一下,estimator每次只会拿下一个待训练batch在本次做评估,然后训练完之后,再在这个batch上做一次评估,看看是否有优化。
  得到如下的结果:
  从这个图上的得分,我们可以看出在50个mini-batch迭代之后,数据上的得分就已经变化不大了。但是好像得分都不太高,所以我们猜测一下,这个时候我们的数据,处于欠拟合状态。我们刚才在小样本集合上提到了,如果欠拟合,我们可以使用更复杂的模型,比如把核函数设置为非线性的,但遗憾的是像rbf核函数是没有办法和SGDClassifier兼容的。因此我们只能想别的办法了,比如这里,我们可以把SGDClassifier整个替换掉了,用多层感知神经网来完成这个任务,我们之所以会想到多层感知神经网,是因为它也是一个用随机梯度下降训练的算法,同时也是一个非线性的模型。当然根据机器学习算法使用图谱,也可以使用核估计(kernel-approximation)来完成这个事情。
  3.3.2 大数据量下的可视化
  大样本数据的可视化是一个相对比较麻烦的事情,一般情况下我们都要用到降维的方法先处理特征。我们找一个例子来看看,可以怎么做,比如我们数据集取经典的『手写数字集』,首先找个方法看一眼这个图片数据集。
  我们总共有1083个训练样本,包含手写数字(0,1,2,3,4,5),每个样本图片中的像素点平铺开都是64位,这个维度显然是没办法直接可视化的。下面我们基于scikit-learn的示例教程对特征用各种方法做降维处理,再可视化。
  随机投射
  我们先看看,把数据随机投射到两个维度上的结果:
  结果如下:
  PCA降维
  在维度约减/降维领域有一个非常强大的算法叫做PCA(Principal Component Analysis,主成分分析),它能将原始的绝大多数信息用维度远低于原始维度的几个主成分表示出来。PCA在我们现在的数据集上效果还不错,我们来看看用PCA对原始特征降维至2维后,原始样本在空间的分布状况:
  得到的结果如下:
  我们可以看出,效果还不错,不同的手写数字在2维平面上,显示出了区域集中性。即使它们之间有一定的重叠区域。
  如果我们用一些非线性的变换来做降维操作,从原始的64维降到2维空间,效果更好,比如这里我们用到一个技术叫做t-SNE,sklearn的manifold对其进行了实现:
  我们发现结果非常的惊人,似乎这个非线性变换降维过后,仅仅2维的特征,就可以将原始数据的不同类别,在平面上很好地划分开。不过t-SNE也有它的缺点,一般说来,相对于线性变换的降维,它需要更多的计算时间。也不太适合在大数据集上全集使用。
  3.4 损失函数的选择
  损失函数的选择对于问题的解决和优化,非常重要。我们先来看一眼各种不同的损失函数:
  得到结果图像如下:
  不同的损失函数有不同的优缺点:
  0-1损失函数(zero-one loss)非常好理解,直接对应分类问题中判断错的个数。但是比较尴尬的是它是一个非凸函数,这意味着其实不是那么实用。
  hinge loss(SVM中使用到的)的健壮性相对较高(对于异常点/噪声不敏感)。但是它没有那么好的概率解释。
  log损失函数(log-loss)的结果能非常好地表征概率分布。因此在很多场景,尤其是多分类场景下,如果我们需要知道结果属于每个类别的置信度,那这个损失函数很适合。缺点是它的健壮性没有那么强,相对hinge loss会对噪声敏感一些。
  多项式损失函数(exponential loss)(AdaBoost中用到的)对离群点/噪声非常非常敏感。但是它的形式对于boosting算法简单而有效。
  感知损失(perceptron loss)可以看做是hinge loss的一个变种。hinge loss对于判定边界附近的点(正确端)惩罚力度很高。而perceptron loss,只要样本的判定类别结果是正确的,它就是满意的,而不管其离判定边界的距离。优点是比hinge loss简单,缺点是因为不是max-margin boundary,所以得到模型的泛化能力没有hinge loss强。
  4. 总结
  全文到此就结束了。先走马观花看了一遍机器学习的算法,然后给出了对应scikit-learn的『秘密武器』机器学习算法使用图谱,紧接着从了解数据(可视化)、选择机器学习算法、定位过/欠拟合及解决方法、大量极的数据可视化和损失函数优缺点与选择等方面介绍了实际机器学习问题中的一些思路和方法。本文和文章机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾都提及了一些处理实际机器学习问题的思路和方法,有相似和互补之处,欢迎大家参照着看。
  作者介绍:
  寒小阳:从事机器学习/数据挖掘相关应用工作,热爱机器学习/数据挖掘
  『我们是一群热爱机器学习,喜欢交流分享的小伙伴,希望通过“ML学分计划”交流机器学习相关的知识,认识更多的朋友。欢迎大家加入我们的讨论群获取资源资料,交流和分享。』
  联系方式:
  寒小阳 hanxiaoyang.
  往期精彩文章推荐,点击图片可阅读
  手把手,74行代码实现手写数字识别
  机器学习:用初等数学解读逻辑回归
请先登录再操作
请先登录再操作
微信扫一扫分享至朋友圈
普及数据思维,传播数据文化;专注大数据,每日有分享。
知名IT评论人,曾就职于多家知名IT企业,现是科幻星系创建人
未来在这里发声。
新媒体的实践者、研究者和批判者。
立足终端领域,静观科技变化。深入思考,简单陈述。
智能硬件领域第一自媒体。

我要回帖

更多关于 大牛助手类似 的文章

 

随机推荐