我是否期望问题是【线性可分离】的吗?(线性可分离就是指不同类问题在图中用直线能完全分开)
特征是否是独立的
希望特征与目标变量是【线性可分离】的吗?
过度拟合是否将成为一个问题?
系统在速度、性能、内存占用方面有什么需求?
…
不管上述有多复杂,我们要只要遵循奥卡姆的剃刀原则(Razorprinciple):如无必要,勿增实体。---------------------一。算法学习方式分类
将算法按照学习方式分类是一个不错的想法,这样可以让人们在建模和算法选择的时候考虑能根据输入数据来选择最合适的算法来获得最好的结果。
1.在监督式学习:输入数据被称为“训练数据”,每组训练数据有一个明确的标识或结果,如对防垃圾邮件系统中“垃圾邮件”“非垃圾邮件”,对手写数字识别中的“1“,”2“,”3“,”4“等。在建立预测模型的时候,监督式学习建立一个学习过程,将预测结果与“训练数据”的实际结果进行比较,不断的调整预测模型,直到模型的预测结果达到一个预期的准确率。监督式学习的常见应用场景如分类问题和回归问题。常见算法有逻辑回归(LogisticRegression)和反向传递神经网络(BackPropagationNeuralNetwork)。
2.在非监督式学习中,数据并不被特别标识,学习模型是为了推断出数据的一些内在结构。常见的应用场景包括关联规则的学习以及聚类等。常见算法包括Apriori算法以及k-Means算法。
在企业数据应用的场景下,人们最常用的可能就是监督式学习和非监督式学习的模型。在图像识别等领域,由于存在大量的非标识的数据和少量的可标识数据,目前半监督式学习是一个很热的话题。而强化学习更多的应用在机器人控制及其他需要进行系统控制的领域。
二。算法功能分类:
根据算法的功能和形式的类似性,我们可以把算法分类,比如说基于树的算法,基于神经网络的算法等等。
1.回归算法是试图采用对误差的衡量来探索变量之间的关系的一类算法。回归算法是统计机器学习的利器。在机器学习领域,人们说起回归,有时候是指一类问题,有时候是指一类算法。常见的回归算法包括:最小二乘法(OrdinaryLeastSquare),逻辑回归(LogisticRegression),逐步式回归(StepwiseRegression),多元自适应回归样条(MultivariateAdaptiveRegressionSplines)以及本地散点平滑估计(LocallyEstimatedScatterplotSmoothing)。
2.基于实例的算法常常用来对决策问题建立模型,这样的模型常常先选取一批样本数据,然后根据某些近似性把新数据与样本数据进行比较。通过这种方式来寻找最佳的匹配。因此,基于实例的算法常常也被称为“赢家通吃”学习或者“基于记忆的学习”。常见的算法包括k-NearestNeighbor(KNN),学习矢量量化(LearningVectorQuantization,LVQ),以及自组织映射算法(Self-OrganizingMap,SOM)。
3.正则化方法是其他算法(通常是回归算法)的延伸,根据算法的复杂度对算法进行调整。正则化方法通常对简单模型予以奖励而对复杂算法予以惩罚。常见的算法包括:RidgeRegression,LeastAbsoluteShrinkageandSelectionOperator(LASSO),以及弹性网络(ElasticNet)。
4.决策树算法根据数据的属性采用树状结构建立决策模型,决策树模型常常用来解决分类和回归问题。常见的算法包括:分类及回归树(ClassificationAndRegressionTree,CART),ID3(IterativeDichotomiser3),C4.5,C5.0,Chi-squaredAutomaticInteractionDetection(CHAID),DecisionStump,随机森林(RandomForest),多元自适应回归样条(MARS)以及梯度推进机(GradientBoostingMachine,GBM)
5.贝叶斯方法算法是基于贝叶斯定理的一类算法,主要用来解决分类和回归问题。常见算法包括:朴素贝叶斯算法,平均单依赖估计(AveragedOne-DependenceEstimators,AODE),以及BayesianBeliefNetwork(BBN)。
6.基于核的算法中最著名的莫过于支持向量机(SVM)了。基于核的算法把输入数据映射到一个高阶的向量空间,在这些高阶向量空间里,有些分类或者回归问题能够更容易的解决。常见的基于核的算法包括:支持向量机(SupportVectorMachine,SVM),径向基函数(RadialBasisFunction,RBF),以及线性判别分析(LinearDiscriminateAnalysis,LDA)等
7.聚类,就像回归一样,有时候人们描述的是一类问题,有时候描述的是一类算法。聚类算法通常按照中心点或者分层的方式对输入数据进行归并。所以的聚类算法都试图找到数据的内在结构,以便按照最大的共同点将数据进行归类。常见的聚类算法包括k-Means算法以及期望最大化算法(ExpectationMaximization,EM)。
8.关联规则学习通过寻找最能够解释数据变量之间关系的规则,来找出大量多元数据集中有用的关联规则。常见算法包括Apriori算法和Eclat算法等。
9.人工神经网络算法模拟生物神经网络,是一类模式匹配算法。通常用于解决分类和回归问题。人工神经网络是机器学习的一个庞大的分支,有几百种不同的算法。(其中深度学习就是其中的一类算法,可以单独讨论),重要的人工神经网络算法包括:感知器神经网络(PerceptronNeuralNetwork),反向传递(BackPropagation),Hopfield网络,自组织映射(Self-OrganizingMap,SOM)。学习矢量量化(LearningVectorQuantization,LVQ)
11.像聚类算法一样,降低维度算法试图分析数据的内在结构,不过降低维度算法是以非监督学习的方式试图利用较少的信息来归纳或者解释数据。这类算法可以用于高维数据的可视化或者用来简化数据以便监督式学习使用。常见的算法包括:主成份分析(PrincipleComponentAnalysis,PCA),偏最小二乘回归(PartialLeastSquareRegression,PLS),Sammon映射,多维尺度(Multi-DimensionalScaling,MDS),投影追踪(ProjectionPursuit)等。
12.集成算法用一些相对较弱的学习模型独立地就同样的样本进行训练,然后把结果整合起来进行整体预测。集成算法的主要难点在于究竟集成哪些独立的较弱的学习模型以及如何把学习结果整合起来。这是一类非常强大的算法,同时也非常流行。常见的算法包括:Boosting,BootstrappedAggregation(Bagging),AdaBoost,堆叠泛化(StackedGeneralization,Blending),梯度推进机(GradientBoostingMachine,GBM),随机森林(RandomForest)。
三。算法优缺点
1、决策树易于理解和解释,可以可视化分析,容易提取出规则。
2、可以同时处理标称型和数值型数据。既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值。
1、对缺失数据处理比较困难。
2、决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。随机森林可以很大程度上减少过拟合
如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。
1、对决策树进行剪枝。可以采用交叉验证法和加入正则化的方法。
2、使用基于决策树的combination算法,如bagging算法,randomforest算法,可以解决过拟合的问题
企业管理实践,企业投资决策,由于决策树很好的分析能力,在决策过程应用较多。
C4.5算法核心思想是ID3算法,是ID3算法的改进,改进方面有:
1)用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足;
2)在树构造过程中进行剪枝
3)能处理非离散的数据
4)能处理不完整的数据
C4.5算法优点:产生的分类规则易于理解,准确率较高。
缺点:
1)在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。
2)C4.5只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。
是一种决策树分类方法,采用基于最小距离的基尼指数估计函数,用来决定由该子数据集生成的决策树的拓展形。如果目标变量是标称的,称为分类树;如果目标变量是连续的,称为回归树。分类树是使用树结构算法将数据分成离散类的方法。
优点
1)非常灵活,可以允许有部分错分成本,还可指定先验概率分布,可使用自动的成本复杂性剪枝来得到归纳性更强的树。
2)在面对诸如存在缺失值、变量数多等问题时CART显得非常稳健。
补充:
1、KNN是一种在线技术,新数据可以直接加入数据集而不必进行重新训练
2、KNN理论简单,容易实现,可用于非线性分类;
4)理论成熟,思想简单,既可以用来做分类也可以用来做回归。
1、对于样本容量大的计算量比较大,需要大内存
2、样本不平衡时,预测偏差比较大。如:当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。
3、KNN每一次分类都会重新进行一次全局运算。
4、k值大小的选择。需要预先设定,而不能自适应
文本分类、模式识别、聚类分析,多分类领域,适用于对样本容量比较大的类域进行自动分类。
原理:
分类思想比较简单,从训练样本中找出K个与其最相近的样本,然后看这k个样本中哪个类别的样本多,则待判定的值(或说抽样)就属于这个类别。
2、解决非线性问题。
3、无局部极小值问题。(相对于神经网络等算法)
4、可以很好的处理高维数据集。
5、泛化能力比较强。
1、对于核函数的高维映射解释力不强,尤其是径向基函数。
2、对缺失数据敏感。
文本分类、图像识别、主要二分类领域
支持向量机是一种基于分类边界的方法。其基本原理是(以二维数据为例):如果训练数据分布在二维平面上的点,它们按照其分类聚集在不同的区域。基于分类边界的分类算法的目标是,通过训练,找到这些分类之间的边界(直线的――称为线性划分,曲线的――称为非线性划分)。对于多维数据(如N维),可以将它们视为N维空间中的点,而分类边界就是N维空间中的面,称为超面(超面比N维空间少一维)。线性分类器使用超平面类型的边界,非线性分类器使用超曲面。
支持向量机的原理是将低维空间的点映射到高维空间,使它们成为线性可分,再使用线性划分的原理来判断分类边界。在高维空间中是一种线性划分,而在原有的数据空间中,是一种非线性划分。
SVM在解决小样本、非线性及高维模式识别问题中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。
SVM有一个核心函数SMO,也就是序列最小最优化算法。SMO基本是最快的二次规划优化算法,其核心就是找到最优参数α,计算超平面后进行分类。SMO方法可以将大优化问题分解为多个小优化问题求解,大大简化求解过程。某些条件下,把原始的约束问题通过拉格朗日函数转化为无约束问题,如果原始问题求解棘手,在满足KKT的条件下用求解对偶问题来代替求解原始问题,使得问题求解更加容易。SVM还有一个重要函数是核函数。核函数的主要作用是将数据从低位空间映射到高维空间。总之,核函数可以很好的解决数据的非线性问题,而无需考虑映射过程。
参数C和g的选择对分类性能的影响:C是惩罚系数,C越大,交叉validation高,容易过学习;g是核函数的到达0的速率,g越小,函数下降快,交叉validation高,也容易造成过学习。
在选择核函数时,如果线性拟合不好,一般推荐使用默认的高斯核'rbf'。这时我们主要需要对惩罚系数C和核函数参数γ进行艰苦的调参,通过多轮的交叉验证选择合适的惩罚系数C和核函数参数γ。
1、很好的利用了弱分类器进行级联。
2、可以将不同的分类算法作为弱分类器。
3、AdaBoost具有很高的精度。
4、相对于bagging算法和RandomForest算法,AdaBoost充分考虑的每个分类器的权重。
1、AdaBoost迭代次数也就是弱分类器数目不太好设定,可以使用交叉验证来进行确定。
2、数据不平衡导致分类精度下降。
3、训练比较耗时,每次重新选择当前分类器最好切分点。
目前AdaBoost算法广泛的应用于人脸检测、目标图像识别等领域。,用于二分类和多分类场景
AdaBoost是boosting算法的代表分类器。boosting基于元算法(集成算法)。Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。如此反复迭代,直到达到所需的要求。AdaBoost泛化错误率低、易编码、可以应用在大部分分类器上、无参数调整,但对离群点敏感。该方法其实并不是一个独立的方法,而是必须基于元方法进行效率提升。
整个过程如下所示:1.先通过对N个训练样本的学习得到第一个弱分类器;2.将分错的样本和其他的新数据一起构成一个新的N个的训练样本,通过对这个样本的学习得到第二个弱分类器;3.将都分错了的样本加上其他的新样本构成另一个新的N个的训练样本,通过对这个样本的学习得到第三个弱分类器;4.如此反复,最终得到经过提升的强分类器。
1、对大数量训练和查询时具有较高的速度。即使使用超大规模的训练集,针对每个项目通常也只会有相对较少的特征数,并且对项目的训练和分类也仅仅是特征概率的数学运算而已。
2、支持增量式运算。即可以实时的对新增的样本进行训练。
3、朴素贝叶斯对结果解释容易理解。
对缺失数据不太敏感,算法也比较简单,常用于文本分类。
4.对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
1、由于使用了样本属性独立性的假设,所以如果样本属性有关联时其效果不好。
文本分类、欺诈检测中使用较多,电子邮件过滤
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。算法的基础是概率问题,分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。朴素贝叶斯假设是约束性很强的假设,假设特征条件独立,但朴素贝叶斯算法简单,快速,具有较小的出错率。
因为它是基于Bayes概率的一种分类方法。贝叶斯方法可以追溯到几百年前,具有深厚的概率学基础,可信度非常高。NaiveBaye中文名叫朴素贝叶斯,为啥叫“朴素”呢?因为其基于一个给定假设:给定目标值时属性之间相互条件独立。比如我说“我喜欢你”,该假设就会假定“我”、“喜欢”、“你”三者之间毫无关联。仔细想想,这几乎是不可能的。马克思告诉我们:事物之间是有联系的。同一个事物的属性之间就更有联系了。所以,单纯的使用NB算法效率并不高,大都是对该方法进行了一定的改进,以便适应数据的需求。NB算法在文本分类中用的非常多,因为文本类别主要取决于关键词,基于词频的文本分类正中NB的下怀。但由于前面提到的假设,该方法对中文的分类效果不好,因为中文顾左右而言他的情况太多,但对直来直去的老美的语言,效果良好。
1、计算代价不高,易于理解和实现
1、容易产生欠拟合。
2、分类精度不高。
用于二分类领域,可以得出概率值,适用于根据分类概率排名的领域,如搜索排名等。
Logistic回归的扩展softmax可以应用于多分类领域,如手写字识别等。
1、分类准确度高,学习能力极强。
2、对噪声数据鲁棒性和容错性较强。
3、有联想能力,能逼近任意非线性关系。
1、神经网络参数较多,权值和阈值。
2、黑盒过程,不能观察中间结果。
3、学习过程比较长,有可能陷入局部极小值。
目前深度神经网络已经应用与计算机视觉,自然语言处理,语音识别等领域并取得很好的效果。
是一个简单的聚类算法,把n的对象根据他们的属性分为k个分割,k 其中N为样本数,K是簇数,rnkb表示n属于第k个簇,uk是第k个中心点的值。然后求出最优的uk 缺点是,分组的数目k是一个输入参数,不合适的k可能返回较差的结果。 EM算法是基于模型的聚类方法,是在概率模型中寻找参数最大似然估计的算法,其中概率模型依赖于无法观测的隐藏变量。E步估计隐含变量,M步估计其他参数,交替将极值推向最大。 EM算法比K-means算法计算复杂,收敛也较慢,不适于大规模数据集和高维数据,但比K-means算法计算结果稳定、准确。EM经常用在机器学习和计算机视觉的数据集聚(DataClustering)领域。 Apriori算法是一种挖掘关联规则的算法,用于挖掘其内含的、未知的却又实际存在的数据关系,其核心是基于两阶段频集思想的递推算法。 Apriori算法分为两个阶段: 1)寻找频繁项集 2)由频繁项集找关联规则 1)在每一步产生侯选项目集时循环产生的组合过多,没有排除不应该参与组合的元素; 2)每次计算项集的支持度时,都对数据库中的全部记录进行了一遍扫描比较,需要很大的I/O负载。 通常,推荐先用逻辑回归。逻辑回归是一种具有很好表现的分类算法,只要你的【特征】是线性或近似线性的并且【问题】是线性可分的就可以用它进行训练。你可以通过【特征工程】将大多数非线性特征简单的转化成较好的线性的特征。它抗噪声干扰能力强,并且你可以通过使用l2和l1正则化的方法来对特征进行选择从而避免过度拟合。逻辑回归也可以用在大数据的场景中,因为它是非常有效并且可以分布式的使用,如,ADMM(logreg)。逻辑回归LR最大的优点就是它的输出的是几率,更容易解释,这样还可以直接拿来用,例如,用排行来代替分类。 即使你认为逻辑回归方法不能十分的有效,那也请你使用一个简单的l2-regularizedLR来试一下。 好了,那么假设你已经了解了并简单使用了LR,下一步该做什么?主要推荐两个合适的方向:1.SVM2.决策树集。如果不知道你要分类的问题,那肯定会使用决策树集成的方法 SupportVectorMachines(SVMs)使用与LR不同的损失函数(Hinge)。他们的解释也不相同(最大间距)。然而,实际上,一个使用线性核的SVM与之前讲的逻辑回归没有太大的区别。(如果你很好奇这一点,你可以看AndrewNg如果从逻辑递归中导出SVMsSupportVectorMachinesOptimizationobjectivePS:反正我也看不懂。AndrewNg是个中国人,叫吴恩达,他的主页有不错的东西)。使用SVM代替逻辑回归的主要原因是因为你的问题可能不是线性可分的。这种情况下,你可能必须要使用一个SVM并且使用一个非线性的核(例如,RBF)。实际上,逻辑回归同样可以使用不同的核,但是重点是你可能在实际使用中发现SVM更好用。另一个使用SVM的原因是如果你的数据是在一个高维空间中。例如,SVMs被报道过对文本的分类效果更佳。 不幸得是,SVMs的主要缺点是它的费劲、低效率的训练过程。所以,当你有很多训练样本时,不推荐你使用SVM来处理。进一步说,对企业级规模的数据我都不推荐使用SVM。任何稍微大一点的数据使用别的算法可能会更好的接近。 第三大算法家庭:决策树集。它主要包括了两个不同的算法:随机森林算法-RandomForests(Algorithm)和梯度提升决策树GradientBoostedTrees。一会再说他们的不同,这会儿我想把它们当作一种来说,为了与逻辑回归进行比较。 决策树集与逻辑回归相比有不同的优势。一个主要的优势就是它们不期望线性的特征或者相互之间有线性作用的特征。逻辑回归能很好的应对二值得特征(即绝对的特性,要么零,要么一)。决策树集里因为有许多的决策树组成,可以很好的处理连续型的特征。其它的主要优点是,因为它的结构组成(使用装袋或加速),这类算法可以很好的处理高纬空间的大数量的训练样本。 至于随机森林RFs和梯度提升决策树GBDTs的不同,简单的理解可以认为GBDTs通常表现的更好,但是很难使用。更具体一点说,GBDTs有超多的参数可以调整,并且更容易过饱和。而RFs则可以“开箱即用”,这就是为什么它那么受欢迎的原因。 总结一下,先从一些简单的方法,例如逻辑回归等方法开始,作为一个基准,如果需要提高,再一点点使用更复杂的方法。(PS:主要是剃刀原则)。到那时,决策树集,特别是随机森林,非常容易调试,可能是一个不错的方法。如果你用完随机森林仍然觉得还有很大的提升空间,那你就试试用GBDT或更加发烧的去用深度学习方法。 你也可以看一下网站KaggleCompetitions。通过关键字“classification”并且选择那些已经完成的,那你可以看到人用来赢得竞赛的例子,其中有可能和你手中遇到的问题一样。到那个时候你可能会明白使用集的方法哪个是会让结果更好。集的唯一问题就是:它们需要维持所有相互独立的平行方法。这可能是你最后的花哨的一步!