常用机器学习算法汇总比较(上)

2,547 阅读12分钟

机器学习入门系列(2)--如何构建一个完整的机器学习项目,第七篇

该系列的前六篇文章:

前面六篇文章从一个项目的终极目标、寻找和获取数据,到数据预处理,做特征工程,接下来就需要开始选择合适的算法模型,进行训练评估和测试了。

所以接下来会整理下比较常用的机器学习算法的汇总比较,包括:

  1. 线性回归
  2. 逻辑回归
  3. 决策树
  4. 随机森林
  5. 支持向量机
  6. 朴素贝叶斯
  7. KNN 算法
  8. K-均值算法
  9. 提升方法(Boosting)
  10. GBDT
  11. 优化算法
  12. 卷积神经网络

因为篇幅问题,主要简单介绍每个算法的基本原理,优缺点等,以及为了保证每篇文章不会太长,可能会分成两篇或者三篇来介绍。


1. 线性回归

简述

定义:线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。

这种函数是一个或多个称为回归系数的模型参数的线性组合(自变量都是一次方)。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归

线性回归的模型函数如下:

h_\theta = \theta ^T x

它的损失函数如下:

J(\theta) = {1\over {2m}} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2

通过训练数据集寻找参数的最优解,即求解可以得到 minJ(\theta) 的参数向量 \theta ,其中这里的参数向量也可以分为参数 w和b , 分别表示权重和偏置值。

求解最优解的方法有最小二乘法和梯度下降法

优缺点

优点:结果易于理解,计算上不复杂。 缺点:对非线性数据拟合不好。 适用数据类型:数值型和标称型数据。 算法类型:回归算法

代码实现

#Import Library
#Import other necessary libraries like pandas, numpy...
from sklearn import linear_model
#Load Train and Test datasets
#Identify feature and response variable(s) and values must be numeric and numpy arrays

x_train=input_variables_values_training_datasets
y_train=target_variables_values_training_datasets
x_test=input_variables_values_test_datasets

# Create linear regression object
linear = linear_model.LinearRegression()

# Train the model using the training sets and check score
linear.fit(x_train, y_train)
linear.score(x_train, y_train)

#Equation coefficient and Intercept
print('Coefficient: \n', linear.coef_)
print('Intercept: \n', linear.intercept_)

#Predict Output
predicted= linear.predict(x_test)

2. 逻辑回归

简述

Logistic 回归算法基于 Sigmoid 函数,或者说 Sigmoid 就是逻辑回归函数。Sigmoid 函数定义如下:\frac{1}{1+e^{-z}}。函数值域范围(0,1)。

因此逻辑回归函数的表达式如下:

h_\theta(x) =g(\theta^T X) = \frac{1}{1+e^{-\theta^TX}} \\
其中,g(z) = \frac{1}{1+e^{-z}}

而逻辑回归的代价函数如下所示:

J(\theta) = -\frac{1}{m} [\sum_{i=1}^my^{(i)}logh_\theta(x^{(i)})+(1-y^{(i)}log(1-h_\theta(x^{(i)}))]

可以使用梯度下降算法来求解使得代价函数最小的参数。其梯度下降法公式为:

优缺点

优点
  1. 实现简单,广泛的应用于工业问题上;
  2. 分类时计算量非常小,速度很快,存储资源低
  3. 便于观测样本概率分数
  4. 对逻辑回归而言,多重共线性并不是问题,它可以结合L2正则化来解决该问题。
缺点
  1. 容易欠拟合,一般准确度不太高
  2. 只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分
  3. 特征空间很大时,逻辑回归的性能不是很好;
  4. 不能很好地处理大量多类特征或变量
  5. 对于非线性特征,需要进行转换。

适用数据类型:数值型和标称型数据。 类别:分类算法。 试用场景:解决二分类问题。

代码实现

#Import Library
from sklearn.linear_model import LogisticRegression
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset

# Create logistic regression object

model = LogisticRegression()

# Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)

#Equation coefficient and Intercept
print('Coefficient: \n', model.coef_)
print('Intercept: \n', model.intercept_)

#Predict Output
predicted= model.predict(x_test)

3. 决策树

简述

定义:分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点和有向边组成。结点有两种类型:内部结点和叶结点。内部结点表示一个特征或属性,叶结点表示一个类。

决策树学习本质上是从训练数据集中归纳出一组分类规则,也可以说是由训练数据集估计条件概率模型。它使用的损失函数通常是正则化的极大似然函数,其策略是以损失函数为目标函数的最小化。

决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。

决策树的生成对应于模型的局部选择,决策树的剪枝对应于模型的全局选择。决策树的生成只考虑局部最优,相对地,决策树的剪枝则考虑全局最优

决策树学习通常包括3个步骤:特征选择、决策树的生成和决策树的修剪

特征选择

特征选择的准则通常是信息增益或者信息增益比

信息增益的定义如下图所示:

其中 Entropy(S) 表示样例集合 S 的信息熵,A 是属性集合,信息增益 Gain(S, A) 表示的就是在知道属性 A 后得到的关于目标函数值的信息,它越大,表示得到的信息越多。

信息增益的缺点是存在偏向于选择取值较多的特征的问题。为了解决这个问题,可以使用信息增益比。

因此,特征 A 对训练数据集 D 的信息增益比的定义如下:

g_R(D, A) = \frac{g(D,A)}{H_A(D)}

信息增益比也存在对可取值数目较少的属性有所偏好的问题。

决策树的生成

简单介绍决策树的生成算法,包括 ID3,C4.5 算法。

ID3

ID3 算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树。

ID3 算法的思路如下:

  1. 首先是针对当前的集合,计算每个特征的信息增益
  2. 然后选择信息增益最大的特征作为当前节点的决策决策特征
  3. 根据特征不同的类别划分到不同的子节点(比如年龄特征有青年,中年,老年,则划分到3颗子树)
  4. 然后继续对子节点进行递归,直到所有特征都被划分

ID3 的缺点是

1)容易造成过度拟合(over fitting); 2)只能处理标称型数据(离散型); 3)信息增益的计算依赖于特征数目较多的特征,而属性取值最多的属性并不一定最优; 4)抗噪性差,训练例子中正例和反例的比例较难控制

C4.5

C4.5算法继承了 ID3 算法的优点,并在以下几方面对 ID3 算法进行了改进:

  • 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足;
  • 在树构造过程中进行剪枝;
  • 能够完成对连续属性的离散化处理;
  • 能够对不完整数据进行处理。

C4.5算法有如下优点:产生的分类规则易于理解,准确率较高

其缺点是:

  1. 算法低效,在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效
  2. **内存受限,**只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。

实际上由于信息增益比的缺点,C4.5 算法并没有直接选择信息增益比最大的候选划分属性,而是先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择信息增益比最高的

无论是 ID3 还是 C4.5 最好在小数据集上使用,决策树分类一般只适用于小数据。当属性取值很多时最好选择 C4.5 算法,ID3 得出的效果会非常差。

剪枝

在生成树的过程中,如果没有剪枝的操作的话,就会长成每一个叶都是单独的一类的样子。这样对我们的训练集是完全拟合的,但是对测试集则是非常不友好的,泛化能力不行。因此,我们要减掉一些枝叶,使得模型泛化能力更强。 根据剪枝所出现的时间点不同,分为预剪枝和后剪枝。预剪枝是在决策树的生成过程中进行的;后剪枝是在决策树生成之后进行的。

决策树的剪枝往往是通过极小化决策树整体的损失函数或代价函数来实现的。简单来说,就是对比剪枝前后整体树的损失函数或者是准确率大小来判断是否需要进行剪枝。

决策树剪枝算法有多种,具体参考决策树剪枝算法这篇文章。

优缺点

优点
  1. 计算量简单,可解释性强,比较适合处理有缺失属性值的样本,能够处理不相关的特征

  2. 效率高,决策树只需要一次构建,反复使用。

  3. 训练时间复杂度较低,预测的过程比较快速,每一次预测的最大计算次数不超过决策树的深度。对于N个样本,每个样本都包含M个属性,在不考虑连续属性离散化以及子树增长的代价情况下,决策树算法的平均时间复杂度仅为O(M*N*logN)。构建一个决策树,最坏情况下的复杂度是O(tree  depth),其中树的深度一般呈对数增长。

缺点
  1. 单颗决策树分类能力弱,并且对连续值变量难以处理
  2. 容易过拟合(后续出现了随机森林,减小了过拟合现象);
  3. 可能或陷于局部最小值中
  4. 没有在线学习

解决决策树的过拟合

1.剪枝

  • 前置剪枝:在分裂节点的时候设计比较苛刻的条件,如不满足则直接停止分裂(这样干决策树无法到最优,也无法得到比较好的效果)
  • 后置剪枝:在树建立完之后,用单个节点代替子树,节点的分类采用子树中主要的分类(这种方法比较浪费前面的建立过程) 2.交叉验证 3.随机森林

代码实现

#Import Library
#Import other necessary libraries like pandas, numpy...

from sklearn import tree
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset

# Create tree object 
model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  

# model = tree.DecisionTreeRegressor() for regression

# Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)

#Predict Output
predicted= model.predict(x_test)

4. 随机森林

简介

随机森林指的是利用多棵树对样本进行训练并预测的一种分类器。

它是由多棵 CART(Classification And Regression Tree) 构成的。对于每棵树,其使用的训练集是从总的训练集中有放回采样出来的,这意味着总训练集中有些样本可能多次出现在一棵树的训练集中,也可能从未出现在一棵树的训练集中。在训练每棵树的节点时,使用的特征是从所有特征中按照一定比例随机地无放回的抽取的,假设总的特征数是M,则这个比例可以是 \sqrt(M), \frac{1}{2} \sqrt(M), 2\sqrt(M)

优缺点

优点
  • 在数据集上表现良好,在当前的很多数据集上,相对其他算法有着很大的优势
  • 它能够处理很高维度(特征很多)的数据,并且不用做特征选择
  • 可以评估特征的重要性
  • 在创建随机森林的时候,对 generlization error 使用的是无偏估计
  • 训练速度快,容易做成并行化方法
  • 在训练过程中,能够检测到特征间的互相影响
  • 实现比较简单
  • 对于不平衡的数据集来说,它可以平衡误差
  • 可以应用在特征缺失的数据集上,并仍然有不错的性能
缺点
  1. 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟
  2. 对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。

代码实现

简单使用 sklearn 中随机森林算法的例子:

#Import Library
from sklearn.ensemble import RandomForestClassifier
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset

# Create Random Forest object
model= RandomForestClassifier()

# Train the model using the training sets and check score
model.fit(X, y)

#Predict Output
predicted= model.predict(x_test)

小结

简单介绍了前四种算法,线性回归、逻辑回归、决策树以及随机森林,其中后三种算法都比较常用,特别是逻辑回归算法特别常用,在很多算法比赛中,都会考虑先实现一个逻辑回归算法来跑通整个算法流程,再考虑替换根据复杂的算法模型。而随机森林算是决策树的升级版,性能更好,而且它还能用于评估特征的重要性,可以做特征选择,属于三大特征选择方法中的最后一种,嵌入式选择方法,学习器会自动选择特征。


参考:


欢迎关注我的微信公众号--机器学习与计算机视觉,或者扫描下方的二维码,大家一起交流,学习和进步!