选择模型
这个问题的答案取决于许多的因素,其中包括:
-
数据的维度大小,数据的质量和数据的特征属性;
-
你可以利用的计算资源;
-
你所在的项目组对该项目的时间预计;
-
你手上的数据能应用在哪些项目中;
即使是一位经验丰富的数据科学家,在没有对数据尝试很多种不同的算法之前,他也不能确定哪一种算法在数据上面有更好的表现。但是,我们并不主张这种方式,一个一个算法去试验。
我们希望自己有一点先验知识,可以指导我们去如何选择算法模型,帮助我们少走一点弯路。
1.了解基本知识
监督学习
监督学习:基于一组样本进行预测。例如,它可以使用历史售价来估计未来售价。在监督学习里,输入变量包含带标签的训练数据和你感兴趣的某个输出变量。通过某种算法分析训练数据,就是一个学习将输入映射到输出的函数的过程。这个推断函数对训练数据进行泛化,即可预测未知情况下的结果,将新的未知输入映射到输出。
分类:当数据用于预测分类变量时,监督学习也称为分类。如将标签或指示符,像狗/猫分配给一张图片就是这种情况。当只有两个标签时称为二分类。当有两类以上时,称为多分类。
回归:当预测连续值时,就是一个回归问题。
预测:这是根据过去和现在的数据对未来进行预测的过程。最常用来分析趋势。一个常见的例子是根据今年和前几年的销售情况估计下一年的销售额。
无监督学习
执行无监督学习时,机器得到的是完全未标记的数据。这一算法常用于发现基础数据的内在模式,如聚类结构,低维流形或稀疏树/图。
聚类:对一组数据样本做分组,使相似的样本归入一个组(或一个集群)中(根据某些标准)。 这通常用于将整个数据集分成几组,以便在每个组中进行分析,帮助用户找到它们的内在模式。
维度约减:减少需要考虑的变量数量。在许多应用中,原始数据具有非常高的维度特征,并且一些特征是冗余的或与任务无关的。降低维度有助于找到真实的,潜在的关系。
增强学习(Reinforcement learning)
增强学习基于环境的反馈,达到分析和优化代理(agent)行为的目的。机器尝试不同的场景来发现哪些行为产生最大的回报,而不是被动接受行动指令。试错和延迟奖励将强化学习与其他技术区分开来。
2.对问题进行分类
下一步,我们要对手头上的问题进行分类。这是一个两步步骤:
通过输入分类:如果我们有标签数据,这是一个监督学习问题。如果我们有无标签数据并且想要去发现结构,这是一 个无监督学习问题。如果我们想要通过与环境交互优化目标函数,这是一个.强化学习问题。
通过输出分类:如果一个模型的输出是一一个数字 ,这是一个回归问题。如果模型的输出是一个类(或者分类) , 这是一个分类问题。如果模型的输出是输入组的集合,这是一个分类问题。
就是那么简单。总而言之,我们可以通过问自己算法需要解决什么问题,进而发现算法的正确分类。
一些技术术语:
分类( Classification ) : 当数据被用来预测一个分类,监督学习也被称为分类。这是一个例子当指定一张相作为”猫” 或"狗”的图片。当只有两种选择时,称为_类( two-class )或项式分类( binomial classification )。当有更多类别的时候,当我们预测下一一个诺贝尔物理学奖得住 ,这个问题被称为多项式分类( multi-class classification )。
回归( Regression) : 当一一个值被预测时,与股票价格一样,监督学习也被称为回归。
聚类( Clustering) : 非监督学习最常用的方法是聚类分析或者聚类。聚类是一组对象组的任务,在这样的一种方式下,在同一组中的对象(称为集群)是更加相似的(在某一种意义上) ,相比其他组(集群)里的对象。
异常检测( Anomaly detection) : 需要在目标里找到不寻常的数据点。在欺诈检测里,例如,任何非常不寻常的信用卡消费模式都是可以的。可能的变化很多,而训练示例很少,这看起来不是一种可行方式了 解欺诈活动。异,常检测需要的方法是简单地了解什么是正常的活动(使用非欺诈交易历史记录) ,并且确定明显不同的内容。
一些值得关注的算法:
分类( Classification) :
●支持向量机( SVM ) :通过尽可能宽的边缘方式发现分离类的边界。当二分式不能清晰的切分时,算法找到最好的边界。这个算法真正的亮点是强烈的数据特征,好像文本或者染色体组( >100特性)。在这些情况下, SVMs比其许多其他算法更快递切分二项,也更少地过度拟合,除了需要少量的内存。
●人工神经网络( Artificial neural networks) :是大脑启发学习算法,覆盖多项式分类 、二项式分类,以及回归问题。它们带来了无限的多样性,包括感知和深度学习。它们花费很长时间进行训练,但是带来各种应用领域的先进性能。
●逻辑回归( Logistic regression) : 虽然包含’回归’ 这个词看上去有点令人费解,逻辑回归事实上是一个对于二项式和多项式分类来说强大的功能。它很快和简单。事实是它使用了’S’ 形曲线代替直线让它对于切分数据进入组变得很自然。逻辑回归给出线性分类边界( linear class boundaries ) , 所以当你使用它来确保一个线性近似的时候 ,类似于你生活中可以使用的一些东西。
●决策树和随机树( Decision trees、 random forests) :决策森林(回归、二项式,以及多项式) , 决策丛林(二项式、多项式) , 以及提高决策树(回归和二项式)所有被称为决策树,一种机器学习的基本概念。 决策树的变种有很多,但是它们都做了相同的事情,使用相同的标签细分特征空间到各个区域。这些可以是一致类别或者恒定值的区域,依赖于是否你正在做分类或者回归。
回归( Regression) :
●线性回归( Linearregression) :线性回归拟合直接(或者平台,或者超平面)数据集。这是一个工具,简单而快速,但是对于一些问题可能过于简单。
●贝叶斯线性回归( Bayesian linearregression) : 它有非常可取的品质,避免了过度拟合。贝叶斯方式实现它通过对可能分布的答案作出一些假设。 这种方式的其他副产品是它们有很少的参数。
●提高决策树回归:如上所述,提高决策树(回归或=项式)是基于决策树的,并通过细分大多数相同标签的特征空间到区域完成。提高决策树通过限制它们可以细分的次数和每一个区 域的最小数据点数量避免过度拟合。算法构造一颗序列树,每一颗树学习补偿树前留下的错误。结果是非常准确的学习者,该算法倾向于使用大量内存。
聚合( Clustering) :
●层次聚类 ( Hierarchicalclustering ):层次聚类的试图简历一 个层次结构的聚类,它有两种格式。聚集聚类( Agglomerativeclustering )是一个“自下而上”的过程,其中每个观察从自己的聚类开始,随着其在层次中向上移动,成对的聚类会进行融合。分裂聚类( Divisiveclustering )则是一-种"自顶向下”的方式,所有的观察开始于一个聚类,并且会随着向下的层次移动而递归式地分裂。整体而言, 这里进行的融合和分裂是以一种激进的方式确定。层次聚类的结果通常表示成树状图( dendrogram )形式。
●k-均值聚类( k-meansclustering )的目标是将n组观测值分为k个聚类,其中每个观测值都属于其接近的那个均值的聚类,这些均值被用作这些聚类的原型。这会将数据空间分割成Voronoidan单元。
异常检测( Anomaly detection) :
●K最近邻( k-nearestneighbors/k- NN )是用于分类和回归的非参数方法。在这两种情况下,输入都是由特征空间中与k最接近的训练样本组成的。在k-NN分类中,输出是一个类成员。对象通过其k最近邻的多数投票来分类,其中对象被分配给k最近邻并且最常见的类( k是一个正整数 ,通常较小)。在k-NN回归中,输出为对象的属性值。该值为其k最近邻值的平均值。
●单类支持向量机( One-classSVM ) :使用了非线性支持向量机的一个巧妙的扩展,单类支持向量机可以描绘一个严格概述整 个数据集的边界。远在边界之外的任何新数据点都是足够非正常的,也是值得特别关注的。
那么如何选择这些类别的算法呢?
当我们去选择一个算法的时候,总是会考虑到很多的方面,比如:模型准确率,训练时间,可扩展性等等。这其中,最重要的可能就是准确率,但是对于初学者而言,可能最重要的是他们的熟悉程度。如果他们对一个模型很熟悉,那么第一个尝试的往往就是这个模型。
当给定一个数据集的时候,我们首先想到的应该是如何快速的得到一个结果,也就是我们常说的 demo 算法。在这个过程中,我们首先关心的并不是算法结果的好坏,而是一整个算法在数据上面运行的流程。
初学者更加倾向于去选择一些容易实现的算法,并且可以快速得到结果。这样的工作节奏是非常好的,一旦你获得了一些结果并且熟悉了数据,你可能就会愿意花更多的时候去使用更加复杂的算法来理解这些数据,从而获得更好的结果。
即使我们到了这个阶段,最好的算法可能也不是那个获得最高准确率的算法,因为对于一个算法我们需要仔细的去调整参数和长时间训练才能得到一个算法模型的最佳性能。而上面我们只是去简单的运行了一下模型,得到一个结果而已。
选择算法时的注意事项
正确率
获得最准确的答案可能不总是最必要的。有时一个近似答案也是足够了,当然这取决于你想要如何去使用你自己的算法模型。如果是这种情况,你可以采用一个近似的方法来缩短你构建模型的时间。
这种近似的处理方式还有另一个优点,就是可以帮助我们一定程度上面避免过拟合。
训练时间
训练模型所需要的时间在不同算法之间是变化很大的,有些算法可能几分钟就可以训练完成,有些算法可能需要几个小时才能训练完成。训练时间往往与模型准确率是密切相关的,简单的说,可能训练时间越长,模型的准确率就越高。
另外,有些算法可能对数值离散点数据更加敏感,而有些可能对连续数据更加敏感。如果我们的数据集非常大,而且时间非常紧,那么根据模型的训练时间来选择算法是一条非常好的路径。
各类算法优缺点:
K近邻: 依赖数据,无数学模型可言。适用于可容易解释的模型。
对异常值敏感,容易受到数据不平衡的影响。
贝叶斯: 基于条件概率, 适用于不同维度之间相关性较小的时候,比较容易解释。也适合增量训练,不必要再重算一遍。应用:垃圾邮件处理。
决策树: 此模型更容易理解不同属性对于结果的影响程度(如在第几层)。可以同时处理不同类型的数据。但因为追踪结果只需要改变叶子节点的属性,所以容易受到攻击。应用:其他算法的基石。
随机森林: 随机森林是决策树的随机集成,一定程度上改善了其容易被攻击的弱点。适用于数据维度不太高(几十)又想达到较高准确性的时候。不需要调整太多参数,适合在不知道适用什么方法的时候先用下。
SVM: SVM尽量保持样本间的间距,抗攻击能力强,和RandomForest一样是一个可以首先尝试的方法。
对数几率回归:Logistic regression,不仅可以输出结果还可以输出其对应的概率。拟合出来的参数可以清晰地看到每一个feature对结果的影响。但是本质上是一个线性分类器,特征之间相关度高时不适用。同时也要注意异常值的的影响。
Discriminat Analysis典型的是LDA,把高维数据投射到低维上,使数据尽可能分离。往往作为一个降维工具使用。但是注意LDA假设数据是正态分布的。
Neural Network. 准确来说还是一个黑箱,适用于数据量大的时候使用。
Ensemble-Boosting : 每次寻找一个可以解决当前错误的分类器,最后再通过权重加和。好处是自带了特征选择,发现有效的特征。也方便去理解高维数据。
Ensemble-Bagging: 训练多个弱分类器投票解决。随机选取训练集,避免了过拟合。
Ensemble-Stacking: 以分类器的结果为输入,再训练一个分类器。一般最后一层用logistic Regression. 有可能过渡拟合,很少使用。