本来看了一天的分类器方面的代码,乱乱的,索性再把最基础的概念拿过来,现总结一下机器学习的算法吧!
按照不同的分类标准,可以把机器学习的算法做不同的分类。
我们先从机器学习问题本身分类的角度来看,我们可以分成下列类型的算法:
监督学习算法
机器学习中有一大部分的问题属于『监督学习』
的范畴,简单口语化地说明,这类问题中,给定的训练样本中,每个样本的输入x都对应一个确定的结果y,我们需要训练出一个模型(数学上看是一个x→y的映射关系f),在未知的样本x′给定后,我们能对结果y′做出预测。
这里的预测结果如果是离散值(很多时候是类别类型,比如邮件分类问题中的垃圾邮件/普通邮件,比如用户会/不会购买某商品),那么我们把它叫做分类问题(classification problem);如果预测结果是连续值(比如房价,股票价格等等),那么我们把它叫做回归问题(regression problem)。
有一系列的机器学习算法是用以解决监督学习问题的,比如最经典的用于分类问题的朴素贝叶斯、逻辑回归、支持向量机等等;比如说用于回归问题的线性回归等等。
无监督学习
有另外一类问题,给我们的样本并没有给出『标签/标准答案』,就是一系列的样本。而我们需要做的事情是,在一些样本中抽取出通用的规则。这叫做『无监督学习』
。包括关联规则和聚类算法在内的一系列机器学习算法都属于这个范畴。
半监督学习
这类问题给出的训练数据,有一部分有标签,有一部分没有标签。我们想学习出数据组织结构的同时,也能做相应的预测。此类问题相对应的机器学习算法有自训练(Self-Training)、直推学习(Transductive Learning)、生成式模型(Generative Model)等。
用一个直观的图来介绍下:
我们也可以从算法的共性(比如功能,运作方式)角度对机器学习算法分类。下面我们根据算法的共性去对它们归个类。不过需要注意的是,我们下面的归类方法可能对分类和回归有比较强的倾向性,而这两类问题也是最常遇到的。
回归算法是一种通过最小化预测值与实际结果值之间的差距,而得到输入特征之间的最佳组合方式的一类算法。对于连续值预测有线性回归等,而对于离散值/类别预测,我们也可以把逻辑回归等也视作回归算法的一种,常见的回归算法如下:
Ordinary Least Squares Regression (OLSR) (最小二乘回归)
Linear Regression (线性回归)
Logistic Regression (Log回归)
Stepwise Regression (逐步回归)
Locally Estimated Scatterplot Smoothing (LOESS) (局部估计的散点图平滑)
Multivariate Adaptive Regression Splines (MARS) (自适应回归样条 )
这里所谓的基于实例的算法,我指的是我们最后建成的模型,对原始数据样本实例依旧有很强的依赖性。这类算法在做预测决策时,一般都是使用某类相似度准则,去比对待预测的样本和原始样本的相近度,再给出相应的预测结果。常见的基于实例的算法有:
k-Nearest Neighbour (kNN) (k-最近邻算法)
Learning Vector Quantization (LVQ) (学习矢量化)
Self-Organizing Map (SOM) (自组织映射)
Locally Weighted Learning (LWL) (局部加权学习)
决策树类算法,会基于原始数据特征,构建一颗包含很多决策路径的树。预测阶段选择路径进行决策。常见的决策树算法包括:
Classification and Regression Tree (CART) (分类和回归树)
Iterative Dichotomiser 3 (ID3) (迭代二分3)
C4.5 and C5.0 (different versions of a powerful approach)
Chi-squared Automatic Interaction Detection (CHAID) (卡方自动交互探测 )
M5
Conditional Decision Trees (有条件的决策树)
这里说的贝叶斯类算法,指的是在分类和回归问题中,隐含使用了贝叶斯原理的算法。包括:
Naive Bayes (朴素贝叶斯)
Gaussian Naive Bayes (高斯朴素贝叶斯)
Multinomial Naive Bayes (多项朴素贝叶斯)
Averaged One-Dependence Estimators (AODE) (平均一个依赖性评估)
Bayesian Belief Network (BBN) (贝叶斯置信网络)
Bayesian Network (BN) (贝叶斯网络)
聚类算法做的事情是,把输入样本聚成围绕一些中心的『数据团』,以发现数据分布结构的一些规律。常用的聚类算法包括:
k-Means (K-均值)
Hierarchical Clustering (分层聚类)
Expectation Maximisation (EM) (最大期望算法)
关联规则算法是这样一类算法:它试图抽取出,最能解释观察到的训练样本之间关联关系的规则,也就是获取一个事件和其他事件之间依赖或关联的知识,常见的关联规则算法有:
Apriori algorithm (关联规则)
Eclat algorithm (Eclat规则)
这是受人脑神经元工作方式启发而构造的一类算法。需要提到的一点是,我把『深度学习』单拎出来了,这里说的人工神经网络偏向于更传统的感知算法,主要包括:
Perceptron (感知机(模拟人类视神经控制系统的图形识别机))
Back-Propagation (反向传播)
深度学习是近年来非常火的机器学习领域,相对于上面列的人工神经网络算法,它通常情况下,有着更深的层次和更复杂的结构。有兴趣的同学可以看看我们另一个系列机器学习与计算机视觉,最常见的深度学习算法包括:
Deep Boltzmann Machine (DBM) (深度玻耳兹曼机)
Deep Belief Networks (DBN) (深度置信网络)
Convolutional Neural Network (CNN) (卷积神经网络)
Stacked Auto-Encoders (叠加自动编码)
从某种程度上说,降维算法和聚类其实有点类似,因为它也在试图发现原始训练数据的固有结构,但是降维算法在试图,用更少的信息(更低维的信息)总结和描述出原始信息的大部分内容。
有意思的是,降维算法一般在数据的可视化,或者是降低数据计算空间有很大的作用。它作为一种机器学习的算法,很多时候用它先处理数据,再灌入别的机器学习算法学习。主要的降维算法包括:
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)
严格意义上来说,这不算是一种机器学习算法,而更像是一种优化手段/策略,它通常是结合多个简单的弱机器学习算法,去做更可靠的决策。拿分类问题举个例,直观的理解,就是单个分类器的分类是可能出错,不可靠的,但是如果多个分类器投票,那可靠度就会高很多。常用的模型融合增强方法包括:
Random Forest
Boosting
Bootstrapped Aggregation (Bagging)
AdaBoost
Stacked Generalization (blending)
Gradient Boosting Machines (GBM)
Gradient Boosted Regression Trees (GBRT)
scikit-learn作为一个丰富的python机器学习库,实现了绝大多数机器学习的算法,有相当多的人在使用,于是我这里把machine learning cheat sheet for sklearn搬过来了,原文可以看这里。既然讲机器学习,我们就用机器学习的语言来解释一下,这是针对实际应用场景的各种条件限制,对scikit-learn里完成的算法构建的一颗决策树,每一组条件都是对应一条路径,能找到相对较为合适的一些解决方法,具体如下:
首先样本量如果非常少的话,其实所有的机器学习算法都没有办法从里面『学到』通用的规则和模式,所以,需要多获取一些数据。然后根据问题是有/无监督学习和连续值/离散值预测,分成了分类
、聚类
、回归
和维度约减
四个方法类,每个类里根据具体情况的不同,又有不同的处理方法。
下面我们试着总结在拿到一个实际问题的时候,如何着手使用机器学习算法去解决问题,其中的一些注意点以及核心思路。主要包括以下内容:
拿到数据后怎么了解数据(可视化)
选择最贴切的机器学习算法
定位模型状态(过/欠拟合)以及解决方法
大量极的数据的特征分析与可视化
各种损失函数(loss function)的优缺点及如何选择
备注:这里写的这个小教程,主要是作为一个通用的建议和指导方案,你不一定要严格按照这个流程解决机器学习问题。
(未完待续......)