机器学习算法大全_机器学习算法概览:异常检测算法/常见算法/深度学习 - 全文 - CSDN
精华内容
参与话题
  • 机器学习常用算法总结

    千次阅读 2018-10-09 20:31:13
    对最常见的机器学习算法做一点点简单的总结,嫌麻烦公式就不贴了,这里有我字很丑的听课笔记,无关人员请撤离… LR与SVM的异同 相同点:逻辑回归和SVM都是有监督学习,本质都是线性分类判别模型。 不同点: (1)...

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_14916279/article/details/72822401

    对最常见的机器学习算法做一点点简单的总结,嫌麻烦公式就不贴了,这里有我字很丑的听课笔记,无关人员请撤离…

    LR与SVM的异同
    相同点:逻辑回归和SVM都是有监督学习,本质都是线性分类判别模型。
    不同点:
    (1)原理不同:逻辑回归LR基于损失函数最小化(经验风险最小化),而支持向量机SVM基于最大化间隔(结构风险最小化);
    (2)LR的分类决策面由所有样本决定,而SVM的决策面即分割超平面只由少数样本即支撑向量决定;
    (3)SVM使用核函数,而LR一般不使用;
    (4)LR使用正则化来抑制过拟合,而SVM自带正则化,但SVM使用松弛因子来实现软间隔;
    (5)SVM只给出属于哪一类,而LR在给出类别的同时,还给出了后验概率(这使得LR可以用于医疗诊断、点击率预估、推荐系统等)。

    SVM核函数,总结起来就是:若数据样本在低维空间线性不可分,它在某个高维空间是线性可分的,这就需要将样本数据从低维空间映射到高维空间,但这个映射关系难以确定。更重要的一点是,SVM中的运算是点积运算,而使用核函数,更确切的说是核技巧(Kernel trick),能将低维向量映射到高维空间并进行点积运算,转化为低维空间的简单运算,使得运算复杂度大大降低。常见的核函数主要有:线性核函数、多项式核函数、RBF径向基核函数、Sigmoid核函数。
    1)线性核函数:这里写图片描述
    2) 多项式核函数:这里写图片描述
    3) RBF径向基核函数:这里写图片描述
    4) Sigmoid核函数:这里写图片描述

    SVM软间隔与硬间隔:在SVM的最小优化目标函数中加入松弛因子,可以实现软间隔,松弛系数C越小,间隔越宽,分割超平面越硬;松弛系数C越大,间隔越窄,分割超平面越软,会更多的拟合训练样本;当C太大时,容易过拟合。

    SVM多分类问题,本质上还是两类分类问题,若共有N类(假设N=4),SVM的多分类问题主要有以下几种策略:
    (1)一对多One against Rest:训练两类分类器1 vs 2,3,4 、 2 vs 1,3,4 、3 vs 1,2,4 、 4 vs 1,2,3 共N个两类分类器,测试时将N个分类器结果投票。
    (2)一对一One against One:训练两类分类器:训练1 vs 2 、 1 vs 3 、1 vs 4 、2 vs 3 、2 vs 4 、3 vs 4共N*(N-1)/ 2个分类器,测试时通过这些分类器进行投票。
    (3)按类别层次划分

    SVM基于间隔最大化来寻找分割超平面,需要做数据归一化,采用的loss function是hinge loss,深度学习常用的Softmax Regression是对逻辑回归LR的一种扩展的多类分类器。

    LR本质上是一种线性分类算法,基于损失函数最小化,其分类决策面与所有样本点都有关,为了防止过拟合可以加入正则项,多分类问题可以分解成one vs rest问题。其主要优点有:
    (1)LR除了给出类别之外,还能给出后验概率(它采用的映射函数来自于sigmoid函数,输出可看作0~1的概率值),因此可以用于医疗诊断、CTR点击率预估、推荐系统等。
    (2)可解释性强,特征可控性高,训练快,添加特征简单。

    LR与NB(朴素贝叶斯)的区别:它们本质上都是线性分类模型,LR基于损失函数最小化,而NB基于贝叶斯定理和条件独立性假设,LR是判别模型而NB是生成模型,NB可应用于垃圾邮件过滤、文本分类等。

    KNN就不说了,比较简单。决策树DT主要有ID3、C4.5、CART等方法,分别基于信息增益、信息增益率、基尼系数来做特征选取样本数据集划分,生成一颗决策树,除了叶节点外所有节点都对应着某个特征。缓解过拟合的方法包括剪枝和随机森林,随机森林是将多颗决策树即多个弱分类器组合成强分类器的方法。

    bagging、随机森林、boosting和adaboost:
    (1)bagging是在所有样本中有放回的随机选取n个样本,使用所有样本特征,训练得到一个分类器,重复m次得到m个分类器,最后采用投票的方式得到决策结果,各分类器权重一样。
    (2)随机森林在所有样本中有放回的随机选取n个样本,在所有样本特征中随机选取k个特征,训练得到一个分类器,重复m次得到m个分类器,最后采用投票的方式得到决策结果,各分类器权重一样。
    (3)boosting相对于bagging,各分类器的权重由其分类的准确率决定,adaboost在boosting的基础上,每一个样本给定相同的初始权重,分类出错的样本的权重上升,分类正确的样本权重下降,即它是在前一个分类器训练的基础上训练得到新的分类器,分类器的权重根据其分类的准确率决定,组合弱分类器形成强分类器,不容易过拟合。

    PCA主成分分析,目的是特征降维,降低特征间相关性,实际上是将原始特征空间变换到一个复杂度更低并尽可能保留了原始信息的特征空间。对原始特征数据样本的协方差矩阵进行特征分解,利用特征向量构造出新的协方差矩阵,满足主对角元最大,非主对角元为0,选取主对角元特征值较大的k个特征向量,得到降维后的特征空间。具体步骤如下:
    (1)去均值;(2)计算协方差矩阵;(3)特征分解,选取前top k特征;(4)特征降维。
    LDA线性判别分析,即fisher准则,也是一种特征选取/降维的方法,它的原理是使得对特征空间进行投影变换后,使得类间距离最大、类内距离最小,它在降维的同时考虑了类别信息。

    关于样本处理问题,当样本数据太大时,考虑离散化、降采样等措施。关于样本不均衡问题:
    (1)若正样本远多于负样本,且负样本数量足够大,可以对正样本进行下/降采样,例如随机采样,实际场景下可能用到分层采样。
    (2)若正样本远多于负样本,且负样本数量不够多,可以收集更多的负样本,或对负样本进行上采样数据增广(例如对于图像数据,进行随机旋转、平移、缩放、镜像、图像增强等),还有修改损失函数的loss weights。

    展开全文
  • 机器学习算法汇总

    千次阅读 2017-10-18 16:09:41
    机器学习或者人工智能领域,人们首先会考虑算法的学习方式。在机器学习领域,有几种主要的学习方式。将算法按照学习方式分类是一个不错的想法,这样可以让人们在建模和算法选择的时候考虑能根据输入数据来选择最...


    学习方式

    根据数据类型的不同,对一个问题的建模有不同的方式。在机器学习或者人工智能领域,人们首先会考虑算法的学习方式。在机器学习领域,有几种主要的学习方式。将算法按照学习方式分类是一个不错的想法,这样可以让人们在建模和算法选择的时候考虑能根据输入数据来选择最合适的算法来获得最好的结果。

    监督式学习:


    在监督式学习下,输入数据被称为“训练数据”,每组训练数据有一个明确的标识或结果,如对防垃圾邮件系统中“垃圾邮件”“非垃圾邮件”,对手写数字识别中的“1“,”2“,”3“,”4“等。在建立预测模型的时候,监督式学习建立一个学习过程,将预测结果与“训练数据”的实际结果进行比较,不断的调整预测模型,直到模型的预测结果达到一个预期的准确率。监督式学习的常见应用场景如分类问题和回归问题。常见算法有逻辑回归(Logistic Regression)和反向传递神经网络(Back Propagation Neural Network)

    非监督式学习:


    在非监督式学习中,数据并不被特别标识,学习模型是为了推断出数据的一些内在结构。常见的应用场景包括关联规则的学习以及聚类等。常见算法包括Apriori算法以及k-Means算法。

    半监督式学习:


    在此学习方式下,输入数据部分被标识,部分没有被标识,这种学习模型可以用来进行预测,但是模型首先需要学习数据的内在结构以便合理的组织数据来进行预测。应用场景包括分类和回归,算法包括一些对常用监督式学习算法的延伸,这些算法首先试图对未标识数据进行建模,在此基础上再对标识的数据进行预测。如图论推理算法(Graph Inference)或者拉普拉斯支持向量机(Laplacian SVM.)等。

    强化学习:


    在这种学习模式下,输入数据作为对模型的反馈,不像监督模型那样,输入数据仅仅是作为一个检查模型对错的方式,在强化学习下,输入数据直接反馈到模型,模型必须对此立刻作出调整。常见的应用场景包括动态系统以及机器人控制等。常见算法包括Q-Learning以及时间差学习(Temporal difference learning)

    在企业数据应用的场景下, 人们最常用的可能就是监督式学习和非监督式学习的模型。 在图像识别等领域,由于存在大量的非标识的数据和少量的可标识数据, 目前半监督式学习是一个很热的话题。 而强化学习更多的应用在机器人控制及其他需要进行系统控制的领域。

    算法类似性

    根据算法的功能和形式的类似性,我们可以把算法分类,比如说基于树的算法,基于神经网络的算法等等。当然,机器学习的范围非常庞大,有些算法很难明确归类到某一类。而对于有些分类来说,同一分类的算法可以针对不同类型的问题。这里,我们尽量把常用的算法按照最容易理解的方式进行分类。

    回归算法


    回归算法是试图采用对误差的衡量来探索变量之间的关系的一类算法。回归算法是统计机器学习的利器。在机器学习领域,人们说起回归,有时候是指一类问题,有时候是指一类算法,这一点常常会使初学者有所困惑。常见的回归算法包括:最小二乘法(Ordinary Least Square),逻辑回归(Logistic Regression),逐步式回归(Stepwise Regression),多元自适应回归样条(Multivariate Adaptive Regression Splines)以及本地散点平滑估计(Locally Estimated Scatterplot Smoothing)

    基于实例的算法


    基于实例的算法常常用来对决策问题建立模型,这样的模型常常先选取一批样本数据,然后根据某些近似性把新数据与样本数据进行比较。通过这种方式来寻找最佳的匹配。因此,基于实例的算法常常也被称为“赢家通吃”学习或者“基于记忆的学习”。常见的算法包括 k-Nearest Neighbor(KNN), 学习矢量量化(Learning Vector Quantization, LVQ),以及自组织映射算法(Self-Organizing Map , SOM)

    正则化方法


    正则化方法是其他算法(通常是回归算法)的延伸,根据算法的复杂度对算法进行调整。正则化方法通常对简单模型予以奖励而对复杂算法予以惩罚。常见的算法包括:Ridge Regression, Least Absolute Shrinkage and Selection Operator(LASSO),以及弹性网络(Elastic Net)。

    决策树学习


    决策树算法根据数据的属性采用树状结构建立决策模型, 决策树模型常常用来解决分类和回归问题。常见的算法包括:分类及回归树(Classification And Regression Tree, CART), ID3 (Iterative Dichotomiser 3), C4.5, Chi-squared Automatic Interaction Detection(CHAID), Decision Stump, 随机森林(Random Forest), 多元自适应回归样条(MARS)以及梯度推进机(Gradient Boosting Machine, GBM)

    贝叶斯方法


    贝叶斯方法算法是基于贝叶斯定理的一类算法,主要用来解决分类和回归问题。常见算法包括:朴素贝叶斯算法,平均单依赖估计(Averaged One-Dependence Estimators, AODE),以及Bayesian Belief Network(BBN)。

    基于核的算法


    基于核的算法中最著名的莫过于支持向量机(SVM)了。 基于核的算法把输入数据映射到一个高阶的向量空间, 在这些高阶向量空间里, 有些分类或者回归问题能够更容易的解决。 常见的基于核的算法包括:支持向量机(Support Vector Machine, SVM), 径向基函数(Radial Basis Function ,RBF), 以及线性判别分析(Linear Discriminate Analysis ,LDA)等。

    聚类算法


    聚类,就像回归一样,有时候人们描述的是一类问题,有时候描述的是一类算法。聚类算法通常按照中心点或者分层的方式对输入数据进行归并。所以的聚类算法都试图找到数据的内在结构,以便按照最大的共同点将数据进行归类。常见的聚类算法包括 k-Means算法以及期望最大化算法(Expectation Maximization, EM)。

    关联规则学习


    关联规则学习通过寻找最能够解释数据变量之间关系的规则,来找出大量多元数据集中有用的关联规则。常见算法包括 Apriori算法和Eclat算法等。

    人工神经网络


    人工神经网络算法模拟生物神经网络,是一类模式匹配算法。通常用于解决分类和回归问题。人工神经网络是机器学习的一个庞大的分支,有几百种不同的算法。(其中深度学习就是其中的一类算法,我们会单独讨论),重要的人工神经网络算法包括:感知器神经网络(Perceptron Neural Network), 反向传递(Back Propagation), Hopfield网络,自组织映射(Self-Organizing Map, SOM)。学习矢量量化(Learning Vector Quantization, LVQ)

    深度学习


    深度学习算法是对人工神经网络的发展。 在近期赢得了很多关注, 特别是 百度也开始发力深度学习后, 更是在国内引起了很多关注。  在计算能力变得日益廉价的今天,深度学习试图建立大得多也复杂得多的神经网络。很多深度学习的算法是半监督式学习算法,用来处理存在少量未标识数据的大数据集。常见的深度学习算法包括:受限波尔兹曼机(Restricted Boltzmann Machine, RBN), Deep Belief Networks(DBN),卷积网络(Convolutional Network), 堆栈式自动编码器(Stacked Auto-encoders)。

    降低维度算法


    像聚类算法一样,降低维度算法试图分析数据的内在结构,不过降低维度算法是以非监督学习的方式试图利用较少的信息来归纳或者解释数据。这类算法可以用于高维数据的可视化或者用来简化数据以便监督式学习使用。常见的算法包括:主成份分析(Principle Component Analysis, PCA),偏最小二乘回归(Partial Least Square Regression,PLS), Sammon映射,多维尺度(Multi-Dimensional Scaling, MDS),  投影追踪(Projection Pursuit)等。

    集成算法


    集成算法用一些相对较弱的学习模型独立地就同样的样本进行训练,然后把结果整合起来进行整体预测。集成算法的主要难点在于究竟集成哪些独立的较弱的学习模型以及如何把学习结果整合起来。这是一类非常强大的算法,同时也非常流行。常见的算法包括:Boosting, Bootstrapped Aggregation(Bagging), AdaBoost,堆叠泛化(Stacked Generalization, Blending),梯度推进机(Gradient Boosting Machine, GBM),随机森林(Random Forest)。



    不知道怎么转载和收藏只能贴到自己的文章里了

    原文链接:http://www.ctocio.com/hotnews/15919.html

    展开全文
  • 机器学习算法汇总大全,对常见的算法用比较容易理解的语言进行描述,相比直接看算法公式更容易理解
  • 机器学习算法一览表

    千次阅读 2018-07-30 18:40:11
    尴尬的是,按理说,机器学习介绍与算法一览应该放在最前面写,详细的应用建议应该在讲完机器学习常用算法之后写,突然莫名奇妙在中间插播这么一篇,好像有点打乱主线。  老话说『亡羊补牢,为时未晚』,前面开头忘...

    1.引言

    提起笔来写这篇博客,突然有点愧疚和尴尬。愧疚的是,工作杂事多,加之懒癌严重,导致这个系列一直没有更新,向关注该系列的同学们道个歉。尴尬的是,按理说,机器学习介绍与算法一览应该放在最前面写,详细的应用建议应该在讲完机器学习常用算法之后写,突然莫名奇妙在中间插播这么一篇,好像有点打乱主线。 
    老话说『亡羊补牢,为时未晚』,前面开头忘讲的东西,咱在这块儿补上。我们先带着大家过一遍传统机器学习算法,基本思想和用途。把问题解决思路和方法应用建议提前到这里的想法也很简单,希望能提前给大家一些小建议,对于某些容易出错的地方也先给大家打个预防针,这样在理解后续相应机器学习算法之后,使用起来也有一定的章法。

    2.机器学习算法简述

    按照不同的分类标准,可以把机器学习的算法做不同的分类。

    2.1 从机器学习问题角度分类

    我们先从机器学习问题本身分类的角度来看,我们可以分成下列类型的算法:

    • 监督学习算法

    机器学习中有一大部分的问题属于『监督学习』的范畴,简单口语化地说明,这类问题中,给定的训练样本中,每个样本的输入xx都对应一个确定的结果yy,我们需要训练出一个模型(数学上看是一个x→yx→y的映射关系ff),在未知的样本x′x′给定后,我们能对结果y′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)
    • M5
    • 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里完成的算法构建的一颗决策树,每一组条件都是对应一条路径,能找到相对较为合适的一些解决方法,具体如下:

    sklearn机器学习算法使用图谱

    首先样本量如果非常少的话,其实所有的机器学习算法都没有办法从里面『学到』通用的规则和模式,so多弄点数据是王道。然后根据问题是有/无监督学习和连续值/离散值预测,分成了分类聚类回归维度约减四个方法类,每个类里根据具体情况的不同,又有不同的处理方法。

    3. 机器学习问题解决思路

    上面带着代价走马观花过了一遍机器学习的若干算法,下面我们试着总结总结在拿到一个实际问题的时候,如果着手使用机器学习算法去解决问题,其中的一些注意点以及核心思路。主要包括以下内容:

    • 拿到数据后怎么了解数据(可视化)
    • 选择最贴切的机器学习算法
    • 定位模型状态(过/欠拟合)以及解决方法
    • 大量极的数据的特征分析与可视化
    • 各种损失函数(loss function)的优缺点及如何选择

    多说一句,这里写的这个小教程,主要是作为一个通用的建议和指导方案,你不一定要严格按照这个流程解决机器学习问题。

    3.1 数据与可视化

    我们先使用scikit-learn的make_classification函数来生产一份分类数据,然后模拟一下拿到实际数据后我们需要做的事情。

    #numpy科学计算工具箱
    import numpy as np
    #使用make_classification构造1000个样本,每个样本有20个feature
    from sklearn.datasets import make_classification
    X, y = make_classification(1000, n_features=20, n_informative=2, 
                               n_redundant=2, n_classes=2, random_state=0)
    #存为dataframe格式
    from pandas import DataFrame
    df = DataFrame(np.hstack((X, y[:, None])),columns = range(20) + ["class"])

    我们生成了一份包含1000个分类数据样本的数据集,每个样本有20个数值特征。同时我们把数据存储至pandas中的DataFrame数据结构中。我们取前几行的数据看一眼:

    df[:6]
    

    不幸的是,肉眼看数据,尤其是维度稍微高点的时候,很有可能看花了也看不出看不出任何线索。幸运的是,我们对于图像的理解力,比数字好太多,而又有相当多的工具可以帮助我们『可视化』数据分布。

    我们在处理任何数据相关的问题时,了解数据都是很有必要的,而可视化可以帮助我们更好地直观理解数据的分布和特性

    数据的可视化有很多工具包可以用,比如下面我们用来做数据可视化的工具包Seaborn。最简单的可视化就是数据散列分布图和柱状图,这个可以用Seanborn的pairplot来完成。以下图中2种颜色表示2种不同的类,因为20维的可视化没有办法在平面表示,我们取出了一部分维度,两两组成pair看数据在这2个维度平面上的分布状况,代码和结果如下:

    import matplotlib.pyplot as plt
    import seaborn as sns
    #使用pairplot去看不同特征维度pair下数据的空间分布状况
    _ = sns.pairplot(df[:50], vars=[8, 11, 12, 14, 19], hue="class", size=1.5)
    plt.show()

     

    pair_plot下数据分布状况

     

    我们从散列图和柱状图上可以看出,确实有些维度的特征相对其他维度,有更好的区分度,比如第11维和14维看起来很有区分度。这两个维度上看,数据点是近似线性可分的。而12维和19维似乎呈现出了很高的负相关性。接下来我们用Seanborn中的corrplot来计算计算各维度特征之间(以及最后的类别)的相关性。代码和结果图如下:

    import matplotlib.pyplot as plt
    plt.figure(figsize=(12, 10))
    _ = sns.corrplot(df, annot=False)
    plt.show()
    

    各位特征相关性

    
     

    相关性图很好地印证了我们之前的想法,可以看到第11维特征和第14维特征和类别有极强的相关性,同时它们俩之间也有极高的相关性。而第12维特征和第19维特征却呈现出极强的负相关性。强相关的特征其实包含了一些冗余的特征,而除掉上图中颜色较深的特征,其余特征包含的信息量就没有这么大了,它们和最后的类别相关度不高,甚至各自之间也没什么先惯性。

    插一句,这里的维度只有20,所以这个相关度计算并不费太大力气,然而实际情形中,你完全有可能有远高于这个数字的特征维度,同时样本量也可能多很多,那种情形下我们可能要先做一些处理,再来实现可视化了。别着急,一会儿我们会讲到。

    3.2 机器学习算法选择

    数据的情况我们大致看了一眼,确定一些特征维度之后,我们可以考虑先选用机器学习算法做一个baseline的系统出来了。这里我们继续参照上面提到过的机器学习算法使用图谱。 
    我们只有1000个数据样本,是分类问题,同时是一个有监督学习,因此我们根据图谱里教的方法,使用LinearSVC(support vector classification with linear kernel)试试。注意,LinearSVC需要选择正则化方法以缓解过拟合问题;我们这里选择使用最多的L2正则化,并把惩罚系数C设为10。我们改写一下sklearn中的学习曲线绘制函数,画出训练集和交叉验证集上的得分:

    from sklearn.svm import LinearSVC
    from sklearn.learning_curve import learning_curve
    #绘制学习曲线,以确定模型的状况
    def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None,
                            train_sizes=np.linspace(.1, 1.0, 5)):
        """
        画出data在某模型上的learning curve.
        参数解释
        ----------
        estimator : 你用的分类器。
        title : 表格的标题。
        X : 输入的feature,numpy类型
        y : 输入的target vector
        ylim : tuple格式的(ymin, ymax), 设定图像中纵坐标的最低点和最高点
        cv : 做cross-validation的时候,数据分成的份数,其中一份作为cv集,其余n-1份作为training(默认为3份)
        """
    
        plt.figure()
        train_sizes, train_scores, test_scores = learning_curve(
            estimator, X, y, cv=5, n_jobs=1, train_sizes=train_sizes)
        train_scores_mean = np.mean(train_scores, axis=1)
        train_scores_std = np.std(train_scores, axis=1)
        test_scores_mean = np.mean(test_scores, axis=1)
        test_scores_std = np.std(test_scores, axis=1)
    
        plt.fill_between(train_sizes, train_scores_mean - train_scores_std,
                         train_scores_mean + train_scores_std, alpha=0.1,
                         color="r")
        plt.fill_between(train_sizes, test_scores_mean - test_scores_std,
                         test_scores_mean + test_scores_std, alpha=0.1, color="g")
        plt.plot(train_sizes, train_scores_mean, 'o-', color="r",
                 label="Training score")
        plt.plot(train_sizes, test_scores_mean, 'o-', color="g",
                 label="Cross-validation score")
    
        plt.xlabel("Training examples")
        plt.ylabel("Score")
        plt.legend(loc="best")
        plt.grid("on") 
        if ylim:
            plt.ylim(ylim)
        plt.title(title)
        plt.show()
    
    #少样本的情况情况下绘出学习曲线
    plot_learning_curve(LinearSVC(C=10.0), "LinearSVC(C=10.0)",
                        X, y, ylim=(0.8, 1.01),
                        train_sizes=np.linspace(.05, 0.2, 5))
    

    学习曲线1

    
     

    这幅图上,我们发现随着样本量的增加,训练集上的得分有一定程度的下降,交叉验证集上的得分有一定程度的上升,但总体说来,两者之间有很大的差距,训练集上的准确度远高于交叉验证集。这其实意味着我们的模型处于过拟合的状态,也即模型太努力地刻画训练集,一不小心把很多噪声的分布也拟合上了,导致在新数据上的泛化能力变差了。

    3.2.1 过拟合的定位与解决

    问题来了,过拟合咋办? 
    针对过拟合,有几种办法可以处理:

    • 增大样本量

    这个比较好理解吧,过拟合的主要原因是模型太努力地去记住训练样本的分布状况,而加大样本量,可以使得训练集的分布更加具备普适性,噪声对整体的影响下降。恩,我们提高点样本量试试:

    #增大一些样本量
    plot_learning_curve(LinearSVC(C=10.0), "LinearSVC(C=10.0)",
                        X, y, ylim=(0.8, 1.1),
                        train_sizes=np.linspace(.1, 1.0, 5))
    

    学习曲线2

    
     

    是不是发现问题好了很多?随着我们增大训练样本量,我们发现训练集和交叉验证集上的得分差距在减少,最后它们已经非常接近了。增大样本量,最直接的方法当然是想办法去采集相同场景下的新数据,如果实在做不到,也可以试试在已有数据的基础上做一些人工的处理生成新数据(比如图像识别中,我们可能可以对图片做镜像变换、旋转等等),当然,这样做一定要谨慎,强烈建议想办法采集真实数据。

    • 减少特征的量(只用我们觉得有效的特征)

    比如在这个例子中,我们之前的数据可视化和分析的结果表明,第11和14维特征包含的信息对识别类别非常有用,我们可以只用它们。

    plot_learning_curve(LinearSVC(C=10.0), "LinearSVC(C=10.0) Features: 11&14", X[:, [11, 14]], y, ylim=(0.8, 1.0), train_sizes=np.linspace(.05, 0.2, 5))
    

    特征选择后

    
     

    从上图上可以看出,过拟合问题也得到一定程度的缓解。不过我们这是自己观察后,手动选出11和14维特征。那能不能自动进行特征组合和选择呢,其实我们当然可以遍历特征的组合样式,然后再进行特征选择(前提依旧是这里特征的维度不高,如果高的话,遍历所有的组合是一个非常非常非常耗时的过程!!):

    from sklearn.pipeline import Pipeline
    from sklearn.feature_selection import SelectKBest, f_classif
    # SelectKBest(f_classif, k=2) 会根据Anova F-value选出 最好的k=2个特征
    
    plot_learning_curve(Pipeline([("fs", SelectKBest(f_classif, k=2)), # select two features
                                   ("svc", LinearSVC(C=10.0))]), "SelectKBest(f_classif, k=2) + LinearSVC(C=10.0)", X, y, ylim=(0.8, 1.0), train_sizes=np.linspace(.05, 0.2, 5))
    

    自动特征选择

    
     

    如果你自己跑一下程序,会发现在我们自己手造的这份数据集上,这个特征筛选的过程超级顺利,但依旧像我们之前提过的一样,这是因为特征的维度不太高。 
    从另外一个角度看,我们之所以做特征选择,是想降低模型的复杂度,而更不容易刻画到噪声数据的分布。从这个角度出发,我们还可以有(1)多项式你和模型中降低多项式次数 (2)神经网络中减少神经网络的层数和每层的结点数 (c)SVM中增加RBF-kernel的bandwidth等方式来降低模型的复杂度。 
    话说回来,即使以上提到的办法降低模型复杂度后,好像能在一定程度上缓解过拟合,但是我们一般还是不建议一遇到过拟合,就用这些方法处理,优先用下面的方法:

    • 增强正则化作用(比如说这里是减小LinearSVC中的C参数) 
      正则化是我认为在不损失信息的情况下,最有效的缓解过拟合现象的方法。
    plot_learning_curve(LinearSVC(C=0.1), "LinearSVC(C=0.1)", X, y, ylim=(0.8, 1.0), train_sizes=np.linspace(.05, 0.2, 5))
    

    调整正则化参数

     

    调整正则化系数后,发现确实过拟合现象有一定程度的缓解,但依旧是那个问题,我们现在的系数是自己敲定的,有没有办法可以自动选择最佳的这个参数呢?可以。我们可以在交叉验证集上做grid-search查找最好的正则化系数(对于大数据样本,我们依旧需要考虑时间问题,这个过程可能会比较慢):

    from sklearn.grid_search import GridSearchCV
    estm = GridSearchCV(LinearSVC(), 
                       param_grid={"C": [0.001, 0.01, 0.1, 1.0, 10.0]})
    plot_learning_curve(estm, "LinearSVC(C=AUTO)", 
                        X, y, ylim=(0.8, 1.0),
                        train_sizes=np.linspace(.05, 0.2, 5))
    print "Chosen parameter on 100 datapoints: %s" % estm.fit(X[:500], y[:500]).best_params_

    在500个点得到的结果是:{‘C’: 0.01} 使用新的C参数,我们再看看学习曲线: 

    C取0.01的学习曲线

     对于特征选择的部分,我打算多说几句,我们刚才看过了用sklearn.feature_selection中的SelectKBest来选择特征的过程,也提到了在高维特征的情况下,这个过程可能会非常非常慢。那我们有别的办法可以进行特征选择吗?比如说,我们的分类器自己能否甄别那些特征是对最后的结果有益的?这里有个实际工作中用到的小技巧。

    我们知道:

    • l2正则化,它对于最后的特征权重的影响是,尽量打散权重到每个特征维度上,不让权重集中在某些维度上,出现权重特别高的特征。
    • 而l1正则化,它对于最后的特征权重的影响是,让特征获得的权重稀疏化,也就是对结果影响不那么大的特征,干脆就拿不着权重。

    那基于这个理论,我们可以把SVC中的正则化替换成l1正则化,让其自动甄别哪些特征应该留下权重。

    plot_learning_curve(LinearSVC(C=0.1, penalty='l1', dual=False), "LinearSVC(C=0.1, penalty='l1')", X, y, ylim=(0.8, 1.0), train_sizes=np.linspace(.05, 0.2, 5))


    使用l1正则化 

    好了,我们一起来看看最后特征获得的权重:

    estm = LinearSVC(C=0.1, penalty='l1', dual=False)
    estm.fit(X[:450], y[:450])  # 用450个点来训练
    print "Coefficients learned: %s" % est.coef_
    print "Non-zero coefficients: %s" % np.nonzero(estm.coef_)[1]得到结果:
    Coefficients learned: [[ 0.          0.          0.          0.          0.          0.01857999
       0.          0.          0.          0.004135    0.          1.05241369
       0.01971419  0.          0.          0.          0.         -0.05665314
       0.14106505  0.        ]]
    Non-zero coefficients: [5 9 11 12 17 18]

    你看,5 9 11 12 17 18这些维度的特征获得了权重,而第11维权重最大,也说明了它影响程度最大。

    3.2.2 欠拟合定位与解决

    我们再随机生成一份数据[1000*20]的数据(但是分布和之前有变化),重新使用LinearSVC来做分类。

    #构造一份环形数据
    from sklearn.datasets import make_circles
    X, y = make_circles(n_samples=1000, random_state=2)
    #绘出学习曲线
    plot_learning_curve(LinearSVC(C=0.25),"LinearSVC(C=0.25)",X, y, ylim=(0.5, 1.0),train_sizes=np.linspace(.1, 1.0, 5))
     
    

    简直烂出翔了有木有,二分类问题,我们做随机猜测,准确率都有0.5,这比随机猜测都高不了多少!!!怎么办?

    不要盲目动手收集更多资料,或者调整正则化参数。我们从学习曲线上其实可以看出来,训练集上的准确度和交叉验证集上的准确度都很低,这其实就对应了我们说的『欠拟合』状态。别急,我们回到我们的数据,还是可视化看看:

    f = DataFrame(np.hstack((X, y[:, None])), columns = range(2) + ["class"])
    _ = sns.pairplot(df, vars=[0, 1], hue="class", size=3.5)
     
    

    你发现什么了,数据根本就没办法线性分割!!!,所以你再找更多的数据,或者调整正则化参数,都是无济于事的!!!

    那我们又怎么解决欠拟合问题呢?通常有下面一些方法:

    • 调整你的特征(找更有效的特征!!) 
      比如说我们观察完现在的数据分布,然后我们先对数据做个映射:
    # 加入原始特征的平方项作为新特征
    X_extra = np.hstack((X, X[:, [0]]**2 + X[:, [1]]**2))
    
    plot_learning_curve(LinearSVC(C=0.25), "LinearSVC(C=0.25) + distance feature", X_extra, y, ylim=(0.5, 1.0), train_sizes=np.linspace(.1, 1.0, 5))
     


    卧槽,少年,这准确率,被吓尿了有木有啊!!!所以你看,选用的特征影响太大了,当然,我们这里是人工模拟出来的数据,分布太明显了,实际数据上,会比这个麻烦一些,但是在特征上面下的功夫还是很有回报的。

    • 使用更复杂一点的模型(比如说用非线性的核函数) 
      我们对模型稍微调整了一下,用了一个复杂一些的非线性rbf kernel:
    from sklearn.svm import SVC
    # note: we use the original X without the extra feature
    plot_learning_curve(SVC(C=2.5, kernel="rbf", gamma=1.0), "SVC(C=2.5, kernel='rbf', gamma=1.0)",X, y, ylim=(0.5, 1.0), train_sizes=np.linspace(.1, 1.0, 5))
     
    

    你看,效果依旧很赞。

    3.3 关于大数据样本集和高维特征空间

    我们在小样本的toy dataset上,怎么捣鼓都有好的方法。但是当数据量和特征样本空间膨胀非常厉害时,很多东西就没有那么好使了,至少是一个很耗时的过程。举个例子说,我们现在重新生成一份数据集,但是这次,我们生成更多的数据,更高的特征维度,而分类的类别也提高到5。

    3.3.1 大数据情形下的模型选择与学习曲线

    在上面提到的那样一份数据上,我们用LinearSVC可能就会有点慢了,我们注意到机器学习算法使用图谱推荐我们使用SGDClassifier。其实本质上说,这个模型也是一个线性核函数的模型,不同的地方是,它使用了随机梯度下降做训练,所以每次并没有使用全部的样本,收敛速度会快很多。再多提一点,SGDClassifier对于特征的幅度非常敏感,也就是说,我们在把数据灌给它之前,应该先对特征做幅度调整,当然,用sklearn的StandardScaler可以很方便地完成这一点。

    SGDClassifier每次只使用一部分(mini-batch)做训练,在这种情况下,我们使用交叉验证(cross-validation)并不是很合适,我们会使用相对应的progressive validation:简单解释一下,estimator每次只会拿下一个待训练batch在本次做评估,然后训练完之后,再在这个batch上做一次评估,看看是否有优化。

    #生成大样本,高纬度特征数据
    X, y = make_classification(200000, n_features=200, n_informative=25, n_redundant=0, n_classes=10, class_sep=2, random_state=0)
    
    #用SGDClassifier做训练,并画出batch在训练前后的得分差
    from sklearn.linear_model import SGDClassifier
    est = SGDClassifier(penalty="l2", alpha=0.001)
    progressive_validation_score = []
    train_score = []
    for datapoint in range(0, 199000, 1000):
        X_batch = X[datapoint:datapoint+1000]
        y_batch = y[datapoint:datapoint+1000]
        if datapoint > 0:
            progressive_validation_score.append(est.score(X_batch, y_batch))
        est.partial_fit(X_batch, y_batch, classes=range(10))
        if datapoint > 0:
            train_score.append(est.score(X_batch, y_batch))
    
    plt.plot(train_score, label="train score")
    plt.plot(progressive_validation_score, label="progressive validation score")
    plt.xlabel("Mini-batch")
    plt.ylabel("Score")
    plt.legend(loc='best')  
    plt.show()                     
    

    得到如下的结果: 
    SGDClassifier学习曲线 

    从这个图上的得分,我们可以看出在50个mini-batch迭代之后,数据上的得分就已经变化不大了。但是好像得分都不太高,所以我们猜测一下,这个时候我们的数据,处于欠拟合状态。我们刚才在小样本集合上提到了,如果欠拟合,我们可以使用更复杂的模型,比如把核函数设置为非线性的,但遗憾的是像rbf核函数是没有办法和SGDClassifier兼容的。因此我们只能想别的办法了,比如这里,我们可以把SGDClassifier整个替换掉了,用多层感知神经网来完成这个任务,我们之所以会想到多层感知神经网,是因为它也是一个用随机梯度下降训练的算法,同时也是一个非线性的模型。当然根据机器学习算法使用图谱,也可以使用核估计(kernel-approximation)来完成这个事情。

    3.3.2 大数据量下的可视化

    大样本数据的可视化是一个相对比较麻烦的事情,一般情况下我们都要用到降维的方法先处理特征。我们找一个例子来看看,可以怎么做,比如我们数据集取经典的『手写数字集』,首先找个方法看一眼这个图片数据集。

    #直接从sklearn中load数据集
    from sklearn.datasets import load_digits
    digits = load_digits(n_class=6)
    X = digits.data
    y = digits.target
    n_samples, n_features = X.shape
    print "Dataset consist of %d samples with %d features each" % (n_samples, n_features)
    
    # 绘制数字示意图
    n_img_per_row = 20
    img = np.zeros((10 * n_img_per_row, 10 * n_img_per_row))
    for i in range(n_img_per_row):
        ix = 10 * i + 1
        for j in range(n_img_per_row):
            iy = 10 * j + 1
            img[ix:ix + 8, iy:iy + 8] = X[i * n_img_per_row + j].reshape((8, 8))
    
    plt.imshow(img, cmap=plt.cm.binary)
    plt.xticks([])
    plt.yticks([])
    _ = plt.title('A selection from the 8*8=64-dimensional digits dataset')
    plt.show()
     
    

    我们总共有1083个训练样本,包含手写数字(0,1,2,3,4,5),每个样本图片中的像素点平铺开都是64位,这个维度显然是没办法直接可视化的。下面我们基于scikit-learn的示例教程对特征用各种方法做降维处理,再可视化。

    随机投射 
    我们先看看,把数据随机投射到两个维度上的结果:

    #import所需的package
    from sklearn import (manifold, decomposition, random_projection)
    rp = random_projection.SparseRandomProjection(n_components=2, random_state=42)
    
    #定义绘图函数
    from matplotlib import offsetbox
    def plot_embedding(X, title=None):
        x_min, x_max = np.min(X, 0), np.max(X, 0)
        X = (X - x_min) / (x_max - x_min)
    
        plt.figure(figsize=(10, 10))
        ax = plt.subplot(111)
        for i in range(X.shape[0]):
            plt.text(X[i, 0], X[i, 1], str(digits.target[i]),
                     color=plt.cm.Set1(y[i] / 10.),
                     fontdict={'weight': 'bold', 'size': 12})
    
        if hasattr(offsetbox, 'AnnotationBbox'):
            # only print thumbnails with matplotlib > 1.0
            shown_images = np.array([[1., 1.]])  # just something big
            for i in range(digits.data.shape[0]):
                dist = np.sum((X[i] - shown_images) ** 2, 1)
                if np.min(dist) < 4e-3:
                    # don't show points that are too close
                    continue
                shown_images = np.r_[shown_images, [X[i]]]
                imagebox = offsetbox.AnnotationBbox(
                    offsetbox.OffsetImage(digits.images[i], cmap=plt.cm.gray_r),
                    X[i])
                ax.add_artist(imagebox)
        plt.xticks([]), plt.yticks([])
        if title is not None:
            plt.title(title)
    
    #记录开始时间
    start_time = time.time()
    X_projected = rp.fit_transform(X)
    plot_embedding(X_projected, "Random Projection of the digits (time: %.3fs)" % (time.time() - start_time))
    

    结果如下: 
    2方向随机投射图 

    PCA降维 
    在维度约减/降维领域有一个非常强大的算法叫做PCA(Principal Component Analysis,主成分分析),它能将原始的绝大多数信息用维度远低于原始维度的几个主成分表示出来。PCA在我们现在的数据集上效果还不错,我们来看看用PCA对原始特征降维至2维后,原始样本在空间的分布状况:

    from sklearn import (manifold, decomposition, random_projection)
    #TruncatedSVD 是 PCA的一种实现
    X_pca = decomposition.TruncatedSVD(n_components=2).fit_transform(X)
    #记录时间
    start_time = time.time()
    plot_embedding(X_pca,"Principal Components projection of the digits (time: %.3fs)" % (time.time() - start_time))
    

    得到的结果如下: 


    PCA后的可视化 

    我们可以看出,效果还不错,不同的手写数字在2维平面上,显示出了区域集中性。即使它们之间有一定的重叠区域。

    如果我们用一些非线性的变换来做降维操作,从原始的64维降到2维空间,效果更好,比如这里我们用到一个技术叫做t-SNE,sklearn的manifold对其进行了实现:

    from sklearn import (manifold, decomposition, random_projection)
    #降维
    tsne = manifold.TSNE(n_components=2, init='pca', random_state=0)
    start_time = time.time()
    X_tsne = tsne.fit_transform(X)
    #绘图
    plot_embedding(X_tsne,
                   "t-SNE embedding of the digits (time: %.3fs)" % (time.time() - start_time))
     
    

    我们发现结果非常的惊人,似乎这个非线性变换降维过后,仅仅2维的特征,就可以将原始数据的不同类别,在平面上很好地划分开。不过t-SNE也有它的缺点,一般说来,相对于线性变换的降维,它需要更多的计算时间。也不太适合在大数据集上全集使用。

    3.4 损失函数的选择

    损失函数的选择对于问题的解决和优化,非常重要。我们先来看一眼各种不同的损失函数:

    import numpy as np
    import matplotlib.plot as plt
    # 改自http://scikit-learn.org/stable/auto_examples/linear_model/plot_sgd_loss_functions.html
    xmin, xmax = -4, 4
    xx = np.linspace(xmin, xmax, 100)
    plt.plot([xmin, 0, 0, xmax], [1, 1, 0, 0], 'k-',
             label="Zero-one loss")
    plt.plot(xx, np.where(xx < 1, 1 - xx, 0), 'g-',
             label="Hinge loss")
    plt.plot(xx, np.log2(1 + np.exp(-xx)), 'r-',
             label="Log loss")
    plt.plot(xx, np.exp(-xx), 'c-',
             label="Exponential loss")
    plt.plot(xx, -np.minimum(xx, 0), 'm-',
             label="Perceptron loss")
    
    plt.ylim((0, 8))
    plt.legend(loc="upper right")
    plt.xlabel(r"Decision function $f(x)$")
    plt.ylabel("$L(y, f(x))$")
    plt.show()

    得到结果图像如下:
    损失函数对比 

    不同的损失函数有不同的优缺点:

    • 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泰坦尼克之灾都提及了一些处理实际机器学习问题的思路和方法,有相似和互补之处,欢迎大家参照着看。

    展开全文
  • 机器学习常见算法

    千次阅读 2018-08-21 21:47:27
    线性回归可能是统计学和机器学习中最知名和最易理解的算法之一。 由于预测建模主要关注最小化模型的误差,或者以可解释性为代价来做出最准确的预测。 我们会从许多不同领域借用、重用和盗用算法,其中涉及一些...

    1. 线性回归

    线性回归可能是统计学和机器学习中最知名和最易理解的算法之一。

    由于预测建模主要关注最小化模型的误差,或者以可解释性为代价来做出最准确的预测。 我们会从许多不同领域借用、重用和盗用算法,其中涉及一些统计学知识。

    线性回归用一个等式表示,通过找到输入变量的特定权重(B),来描述输入变量(x)与输出变量(y)之间的线性关系。

    收藏|数据分析师最常用的10个机器学习算法!(附图解)

     

    Linear Regression

    举例:y = B0 + B1 * x

    给定输入x,我们将预测y,线性回归学习算法的目标是找到系数B0和B1的值。

    可以使用不同的技术从数据中学习线性回归模型,例如用于普通最小二乘和梯度下降优化的线性代数解。

    线性回归已经存在了200多年,并且已经进行了广泛的研究。 如果可能的话,使用这种技术时的一些经验法则是去除非常相似(相关)的变量并从数据中移除噪声。 这是一种快速简单的技术和良好的第一种算法。

    2. 逻辑回归

    逻辑回归是机器学习从统计领域借鉴的另一种技术。 这是二分类问题的专用方法(两个类值的问题)。

    逻辑回归与线性回归类似,这是因为两者的目标都是找出每个输入变量的权重值。 与线性回归不同的是,输出的预测值得使用称为逻辑函数的非线性函数进行变换。

    逻辑函数看起来像一个大S,并能将任何值转换为0到1的范围内。这很有用,因为我们可以将相应规则应用于逻辑函数的输出上,把值分类为0和1(例如,如果IF小于0.5,那么 输出1)并预测类别值。

    收藏|数据分析师最常用的10个机器学习算法!(附图解)

     

    Logistic Regression

    由于模型的特有学习方式,通过逻辑回归所做的预测也可以用于计算属于类0或类1的概率。这对于需要给出许多基本原理的问题十分有用。

    与线性回归一样,当你移除与输出变量无关的属性以及彼此非常相似(相关)的属性时,逻辑回归确实会更好。 这是一个快速学习和有效处理二元分类问题的模型。

    3. 线性判别分析

    传统的逻辑回归仅限于二分类问题。 如果你有两个以上的类,那么线性判别分析算法(Linear Discriminant Analysis,简称LDA)是首选的线性分类技术。

    LDA的表示非常简单。 它由你的数据的统计属性组成,根据每个类别进行计算。 对于单个输入变量,这包括:

    • 每类的平均值。
    • 跨所有类别计算的方差。

    收藏|数据分析师最常用的10个机器学习算法!(附图解)

     

    Linear Discriminant Analysis

    LDA通过计算每个类的判别值并对具有最大值的类进行预测来进行。该技术假定数据具有高斯分布(钟形曲线),因此最好先手动从数据中移除异常值。这是分类预测建模问题中的一种简单而强大的方法。

    4. 分类和回归树

    决策树是机器学习的一种重要算法。

    决策树模型可用二叉树表示。对,就是来自算法和数据结构的二叉树,没什么特别。 每个节点代表单个输入变量(x)和该变量上的左右孩子(假定变量是数字)。

    收藏|数据分析师最常用的10个机器学习算法!(附图解)

     

    Decision Tree

    树的叶节点包含用于进行预测的输出变量(y)。 预测是通过遍历树进行的,当达到某一叶节点时停止,并输出该叶节点的类值。

    决策树学习速度快,预测速度快。 对于许多问题也经常预测准确,并且你不需要为数据做任何特殊准备。

    5. 朴素贝叶斯

    朴素贝叶斯是一种简单但极为强大的预测建模算法。

    该模型由两种类型的概率组成,可以直接从你的训练数据中计算出来:1)每个类别的概率; 2)给定的每个x值的类别的条件概率。 一旦计算出来,概率模型就可以用于使用贝叶斯定理对新数据进行预测。 当你的数据是数值时,通常假设高斯分布(钟形曲线),以便可以轻松估计这些概率。

    收藏|数据分析师最常用的10个机器学习算法!(附图解)

     

    Bayes Theorem

    朴素贝叶斯被称为朴素的原因,在于它假设每个输入变量是独立的。 这是一个强硬的假设,对于真实数据来说是不切实际的,但该技术对于大范围内的复杂问题仍非常有效。

    6. K近邻

    KNN算法非常简单而且非常有效。 KNN的模型用整个训练数据集表示。 是不是特简单?

    通过搜索整个训练集内K个最相似的实例(邻居),并对这些K个实例的输出变量进行汇总,来预测新的数据点。 对于回归问题,新的点可能是平均输出变量,对于分类问题,新的点可能是众数类别值。

    成功的诀窍在于如何确定数据实例之间的相似性。如果你的属性都是相同的比例,最简单的方法就是使用欧几里德距离,它可以根据每个输入变量之间的差直接计算。

    收藏|数据分析师最常用的10个机器学习算法!(附图解)

     

    K-Nearest Neighbors

    KNN可能需要大量的内存或空间来存储所有的数据,但只有在需要预测时才会执行计算(或学习)。 你还可以随时更新和管理你的训练集,以保持预测的准确性。

    距离或紧密度的概念可能会在高维环境(大量输入变量)下崩溃,这会对算法造成负面影响。这类事件被称为维度诅咒。它也暗示了你应该只使用那些与预测输出变量最相关的输入变量。

    7. 学习矢量量化

    K-近邻的缺点是你需要维持整个训练数据集。 学习矢量量化算法(或简称LVQ)是一种人工神经网络算法,允许你挂起任意个训练实例并准确学习他们。

    收藏|数据分析师最常用的10个机器学习算法!(附图解)

     

    Learning Vector Quantization

    LVQ用codebook向量的集合表示。开始时随机选择向量,然后多次迭代,适应训练数据集。 在学习之后,codebook向量可以像K-近邻那样用来预测。 通过计算每个codebook向量与新数据实例之间的距离来找到最相似的邻居(最佳匹配),然后返回最佳匹配单元的类别值或在回归情况下的实际值作为预测。 如果你把数据限制在相同范围(如0到1之间),则可以获得最佳结果。

    如果你发现KNN在您的数据集上给出了很好的结果,请尝试使用LVQ来减少存储整个训练数据集的内存要求。

    8. 支持向量机

    支持向量机也许是最受欢迎和讨论的机器学习算法之一。

    超平面是分割输入变量空间的线。 在SVM中,会选出一个超平面以将输入变量空间中的点按其类别(0类或1类)进行分离。在二维空间中可以将其视为一条线,所有的输入点都可以被这条线完全分开。 SVM学习算法就是要找到能让超平面对类别有最佳分离的系数。

    收藏|数据分析师最常用的10个机器学习算法!(附图解)

     

    Support Vector Machine

    超平面和最近的数据点之间的距离被称为边界,有最大边界的超平面是最佳之选。同时,只有这些离得近的数据点才和超平面的定义和分类器的构造有关,这些点被称为支持向量,他们支持或定义超平面。在具体实践中,我们会用到优化算法来找到能最大化边界的系数值。

    SVM可能是最强大的即用分类器之一,在你的数据集上值得一试。

    9. bagging和随机森林

    随机森林是最流行和最强大的机器学习算法之一。 它是一种被称为Bootstrap Aggregation或Bagging的集成机器学习算法。

    bootstrap是一种强大的统计方法,用于从数据样本中估计某一数量,例如平均值。 它会抽取大量样本数据,计算平均值,然后平均所有平均值,以便更准确地估算真实平均值。

    在bagging中用到了相同的方法,但最常用到的是决策树,而不是估计整个统计模型。它会训练数据进行多重抽样,然后为每个数据样本构建模型。当你需要对新数据进行预测时,每个模型都会进行预测,并对预测结果进行平均,以更好地估计真实的输出值。

    收藏|数据分析师最常用的10个机器学习算法!(附图解)

     

    Random Forest

    随机森林是对决策树的一种调整,相对于选择最佳分割点,随机森林通过引入随机性来实现次优分割。

    因此,为每个数据样本创建的模型之间的差异性会更大,但就自身意义来说依然准确无误。结合预测结果可以更好地估计正确的潜在输出值。

    如果你使用高方差算法(如决策树)获得良好结果,那么加上这个算法后效果会更好。

    10. Boosting和AdaBoost

    Boosting是一种从一些弱分类器中创建一个强分类器的集成技术。 它先由训练数据构建一个模型,然后创建第二个模型来尝试纠正第一个模型的错误。 不断添加模型,直到训练集完美预测或已经添加到数量上限。

    AdaBoost是为二分类开发的第一个真正成功的Boosting算法,同时也是理解Boosting的最佳起点。 目前基于AdaBoost而构建的算法中最著名的就是随机梯度boosting。

    收藏|数据分析师最常用的10个机器学习算法!(附图解)

     

    AdaBoost

    AdaBoost常与短决策树一起使用。 在创建第一棵树之后,每个训练实例在树上的性能都决定了下一棵树需要在这个训练实例上投入多少关注。难以预测的训练数据会被赋予更多的权重,而易于预测的实例被赋予更少的权重。 模型按顺序依次创建,每个模型的更新都会影响序列中下一棵树的学习效果。在建完所有树之后,算法对新数据进行预测,并且通过训练数据的准确程度来加权每棵树的性能。

    因为算法极为注重错误纠正,所以一个没有异常值的整洁数据十分重要。

    选择那种机器学习算法:

    • 数据的大小,质量和性质;
    • 可用的计算时间;
    • 任务的紧迫性;
    • 你想要对数据做什么。
    展开全文
  • 机器学习入门系列(2)–如何构建一个完整的机器学习项目,第九篇! 该系列的前八篇文章: 机器学习入门系列(2)–如何构建一个完整的机器学习项目(一) 机器学习数据集的获取和...常用机器学习算法汇总比较的最后一...
  • 机器学习算法有哪些?

    万次阅读 2018-06-02 09:18:05
    机器学习算法有哪些? 1、分层聚类 2、KNN 3、基于密度的聚类DBSCAN 4、K-means 5、自组织映射SOM 6、PCA 7、LDA 8、MDS 9、朴素贝叶斯 10、数据降维 11、感知机 12、GMM 13、EM 14、LVQ 15、HMM 16...
  • 机器学习——几种分类算法的汇总

    千次阅读 2019-06-25 01:03:45
    https://www.cnblogs.com/Zhi-Z/p/8912396.html
  • 机器学习之KNN(k近邻)算法详解

    万次阅读 多人点赞 2020-07-19 08:13:57
    1-1 机器学习算法分类 一、基本分类: ①监督学习(Supervised learning) 数据集中的每个样本有相应的“正确答案”, 根据这些样本做出 预测, 分有两类: 回归问题和分类问题。 步骤1: 数据集的创建和...
  • 一、机器学习算法工程师笔试题 机器学习笔试题目—-网易2016春招 BAT机器学习面试1000题系列 机器学习-算法工程师 -面试/笔试准备-重要知识点梳理 总结一点面试问题--算法工程师(机器学习) 2018 年大疆机器...
  • 习题全解,答案;
  • 为什么现在大家都用深度学习,而传统机器学习无论在科研中还是实践中都用的很少了?
  • 机器学习&深度学习算法及代码实现

    万次阅读 2019-05-11 10:38:08
    最近在学机器学习,学习过程中收获颇多,在此留下学习记录,希望与同道中人相互学习交流机器学习简介1、机器学习运用学习算法,利用所给的数据进训练,生成相应的模型。在面对新情况时,根据模型,给出正确的判断。2...
  • 机器学习十大经典算法入门

    万次阅读 多人点赞 2018-06-20 20:11:46
    SVM算法是介于简单算法和神经网络之间的最好的算法。 b. 只通过几个支持向量就确定了超平面,说明它不在乎细枝末节,所以不容易过拟合,但不能确保一定不会过拟合。可以处理复杂的非线性问题。 c. 高斯核函数 ...
  • 机器学习 - 竞赛网站,算法刷题网站

    万次阅读 多人点赞 2017-08-03 10:45:16
    Kaggle阿里巴巴天池大数据比赛DataCastleCCF大数据与计算智能大赛Di-Tech算法大赛KDD-CupKDnuggets Competition全国高校云计算应用创新大赛Byte Cup国际机器学习竞赛WID数据竞赛数据火车竞赛网站DrivenData ...
  • 人工智能之机器学习常见算法

    万次阅读 多人点赞 2019-04-11 11:18:17
    摘要之前一直对机器学习很感兴趣,一直没时间去研究,今天刚好是...这里IT经理网为您总结一下常见的机器学习算法,以供您在工作和学习中参考。 机器学习的算法很多。很多时候困惑人们都是,很多算法是一类算法,而有
  • 10种机器学习算法(附Python代码)

    万次阅读 多人点赞 2018-01-15 11:22:15
    sklearn python API LinearRegression from sklearn.linear_model import LinearRegression # 线性回归 # module = LinearRegression() module.fit(x, y) module.score(x, y) module.predict(test) ...Lo
  • 机器学习的13种算法和4种学习方法,推荐给大家

    万次阅读 多人点赞 2018-09-18 21:08:45
    机器学习算法很多。很多时候困惑人们都是,很多算法是一类算法,而有些算法又是从其他算法中延伸出来的。这里,我们从两个方面来给大家介绍,第一个方面是学习的方式,第二个方面是算法的分类。 一、4大主要学习...
  • 机器学习十大算法都是何方神圣?看完你就懂了

    万次阅读 多人点赞 2017-08-26 18:06:46
    雷锋网按:机器学习与人工智能变得越来越热。大数据原本在工业界中就已经炙手可热,而基于大数据的机器学习则更加流行,...跟我们生活息息相关的最常见机器学习算法包括电影推荐算法、图书推荐算法。这些算法都是基
  • 机器学习算法基础

    万人学习 2019-12-24 17:40:29
    30个小时知识无盲区课程,覆盖十多个行业应用。
1 2 3 4 5 ... 20
收藏数 394,413
精华内容 157,765
关键字:

机器学习算法大全