1.机器学习算法简述
按照不同的分类标准,可以把机器学习的算法做不同的分类。
1.1 从机器学习问题角度分类
我们先从机器学习问题本身分类的角度来看,我们可以分成下列类型的算法:
- 监督学习算法
机器学习中有一大部分的问题属于『监督学习』的范畴,这类问题中,给定的训练样本中,每个样本的输入x都对应一个确定的结果y,我们需要训练出一个模型(数学上看是一个x→y的映射关系f),在未知的样本x′给定后,我们能对结果y′做出预测。
这里的预测结果如果是离散值(比如用户会/不会购买某商品),我们将这类问题叫做分类问题(classification problem);如果预测结果是连续值(比如房价,股票价格等),我们将这类问题叫做回归问题(regression problem)。
解决监督学习问题的机器学习算法很多,如朴素贝叶斯、逻辑回归、支持向量机等等;比如说
- 无监督学习
另外一类问题,我们的样本并没有给出『标签/标准答案』,仅有一系列的数据样本。我们将这类问题叫做无监督学习问题,需要做的事情是在这些样本中抽取出通用的规则,这叫做『无监督学习』。解决无监督问题的机器学习算法如关联规则和聚类算法等。
- 半监督学习
这类问题给出的训练数据,有一部分有标签有一部分没有标签。我们想学习出数据组织结构的同时,也能做相应的预测。此类问题相对应的机器学习算法有自训练(Self-Training)、直推学习(Transductive Learning)、生成式模型(Generative Model)等。
总体说来,最常见是前两类问题,而对应前两类问题的一些机器学习算法如下:
1.2 从算法的功能角度分类
1.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)
1.2.2 基于实例的算法(Instance-based Algorithms)
这里的基于实例的算法,指的是最后建成的模型,对原始数据样本实例有很强的依赖性。这类算法在做预测决策时,一般都是使用某类相似度准则,去比对待预测的样本和原始样本的相近度,再给出相应的预测结果。常见的基于实例的算法有:
-
k-Nearest Neighbour (kNN)
-
Learning Vector Quantization (LVQ)
-
Self-Organizing Map (SOM)
-
Locally Weighted Learning (LWL) 1.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
1.2.4 贝叶斯类算法(Bayesian Algorithms)
- Naive Bayes
- Gaussian Naive Bayes
- Multinomial Naive Bayes
- Averaged One-Dependence Estimators (AODE)
- Bayesian Belief Network (BBN)
- Bayesian Network (BN)
1.2.5 聚类算法(Clustering Algorithms)
聚类算法就是将输入样本聚成围绕一些中心的数据团,以发现数据分布结构的规律。常用的聚类算法包括:
- k-Means
- Hierarchical Clustering
- Expectation Maximisation (EM)
1.2.6 关联规则算法(Association Rule Learning Algorithms)
关联规则算法:它试图抽取出最能解释观察到的训练样本之间关联关系的规则,即获取一个事件和其他事件之间依赖或关联知识,常见的关联规则算法有:
- Apriori algorithm
- Eclat algorithm
1.2.7 人工神经网络算法(Artificial Neural Network Algorithms)
这是受人脑神经元工作方式启发而构造的一类算法。本文将『深度学习』单列出来,这里说的人工神经网络偏向于更传统的感知算法,主要包括:
- Perceptron
- Back-Propagation
- Radial Basis Function Network (RBFN)
1.2.8 深度学习(Deep Learning Algorithms)
深度学习相对于上面列的人工神经网络算法,有着更深的层次和更复杂的结构。,最常见的深度学习算法包括:
- Deep Boltzmann Machine (DBM)
- Deep Belief Networks (DBN)
- Convolutional Neural Network (CNN)
- Stacked Auto-Encoders
1.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)
1.2.10 模型融合算法(Ensemble Algorithms)
严格意义上模型融合更像是一种优化手段/策略,它通常是结合多个简单的弱机器学习算法去做更可靠的决策。拿分类问题举例,直观的理解就是单个分类器的分类是可能出错的,但是多个分类器投票那可靠度就会高很多。常用的模型融合增强方法包括:
- Random Forest
- Boosting
- Bootstrapped Aggregation (Bagging)
- AdaBoost
- Stacked Generalization (blending)
- Gradient Boosting Machines (GBM)
- Gradient Boosted Regression Trees (GBRT)
2. 机器学习算法使用图谱
scikit-learn作为一个丰富的python机器学习库,实现了绝大多数机器学习算法。
若样本量非常少,其实所有的机器学习算法都没有办法从里面『学到』通用的规则和模式,机器学习算法需要以大量的数据为基础,根据问题是有/无监督学习和连续值/离散值预测,分成了分类、聚类、回归和维度缩减四个方法类,每个类里根据具体情况的不同,又有不同的处理方法。
3. 机器学习问题解决思路
下面总结在拿到一个实际问题的时候,如果着手使用机器学习算法去解决问题,其中的一些注意点以及核心思路。主要包括以下内容:
- 拿到数据后怎么了解数据(可视化)
- 选择最贴切的机器学习算法
- 定位模型状态(过/欠拟合)以及解决方法
- 大量数据的特征分析与可视化
- 各种损失函数(loss function)的优缺点及如何选择
3.1 数据与可视化
数据的可视化有很多工具包,比如下面我们用来做数据可视化的工具包Seaborn。最简单的可视化就是数据散列分布图和柱状图,相关性图
3.2 机器学习算法选择
我们在确定一些数据以及对应的特征之后,我们可以考虑先选用机器学习算法做一个baseline的系统。这里我们继续参照上面提到过的机器学习算法使用图谱。
我们只有1000个数据样本,是分类问题,同时是一个有监督学习,因此我们根据图谱里教的方法,使用
LinearSVC(support vector classification with linear kernel)。LinearSVC需要选择正则化方法以缓解过拟合问题;
3.2.1 过拟合的定位与解决
针对过拟合,有几种办法可以处理:
- 增大样本量 过拟合的主要原因是模型太努力地去记住训练样本的分布状况,而加大样本量,可以使得训练集的分布更加具备普适性,噪声对整体的影响下降。
- 减少特征的量(只用我们觉得有效的特征)
- 增强正则化作用(比如说这里是减小LinearSVC中的C参数) 正则化在不损失信息的情况下,最有效的缓解过拟合现象的一种方法。 -使用更复杂一点的模型(比如说用非线性的核函数) \
3.3 关于大数据样本集和高维特征空间
3.3.1 大数据情形下的模型选择与学习曲线
在大数据样本集上训练我们的模型如我们用LinearSVC可能就会有点慢了,我们注意到机器学习算法使用图谱推荐我们使用SGDClassifier。其实本质上说,这个模型也是一个线性核函数的模型,不同的地方是它使用了随机梯度下降做训练,所以每次并没有使用全部的样本,收敛速度会快很多。再多提一点,SGDClassifier对于特征的幅度非常敏感,也就是说,我们在把数据灌给它之前,应该先对特征做幅度调整,当然,用sklearn的StandardScaler可以很方便地完成这一点。
SGDClassifier每次只使用一部分(mini-batch)做训练,在这种情况下,我们使用交叉验证(cross-validation)并不是很合适,我们会使用相对应的progressive validation:简单解释一下,estimator每次只会拿下一个待训练batch在本次做评估,然后训练完之后,再在这个batch上做一次评估,看看是否有优化。
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强。