[ML] Decision Tree & Ensembling Metholds

热身:分类问题若干策略


SVM, LR, Decision Tree的比较

一样是分类:SVM、LR、决策树,三者之间有什么优劣势呢?html

答:Are decision tree algorithms linear or nonlinear: nonlinear! 更接近 "神经网络"。算法

 

1、与"判别式分类"的比较

Ref:逻辑回归,决策树,支持向量机 选择方案网络

逻辑回归 LR

LR的优点:app

  1. 对观测样本的几率值输出
  2. 实现简单高效
  3. 多重共线性的问题能够经过L2正则化来应对
  4. 大量的工业界解决方案
  5. 支持online learning(我的补充

LR的劣势:框架

  1. 特征空间太大时表现不太好
  2. 对于大量的分类变量无能为力
  3. 对于非线性特征须要作特征变换
  4. 依赖全部的样本数据

 

支持向量机器 SVM

SVM的优势:dom

  1. 可以处理大型特征空间
  2. 可以处理非线性特征之间的相互做用
  3. 无需依赖整个数据 

SVM的缺点:机器学习

  1. 当观测样本不少时,效率并非很高
  2. 有时候很难找到一个合适的核函数

 

决策树

决策树的优势:函数

  1. 直观的决策规则
  2. 能够处理非线性特征
  3. 考虑了变量之间的相互做用 

决策树的缺点: post

  1. 训练集上的效果高度优于测试集,即过拟合[随机森林克服了此缺点]
  2. 没有将排名分数做为直接结果

 

2、结论

我总结出了一个工做流程来让你们参考如何决定使用哪一个模型: 学习

1. 使用LR试一把总归不会错的,至少是个baseline 
2. 看看决策树相关模型例如随机森林,GBDT有没有带来显著的效果提高,即便最终没有用这个模型,也能够用随机森林的结果来去除噪声特征 
3. 若是你的特征空间和观测样本都很大,有足够的计算资源和时间,试试SVM吧,

 

 

 

决策树算法


Ref: 算法杂货铺——分类算法之决策树(Decision tree)

1、构造决策树

属性选择度量算法有不少,通常使用自顶向下递归分治法,并采用不回溯的贪心策略。这里介绍ID3C4.5两种经常使用算法。

使用属性选择度量来选择将元组最好地划分红不一样的类的属性。所谓决策树的构造就是进行属性选择度量肯定各个特征属性之间的拓扑结构。

 

2、模型参数

官方文档:https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeRegressor.html

也可用于 ”回归问题“:回归树,模型树。

 

 

 

决策“森林”


Ensemble method(集成方法),参考博文:机器学习--集成学习(Ensemble Learning)

主流的两种方式

1、Bootstrap Aggregating (缩写:Bagging)

Bootstrap 样本集,“有放回去” 的方式。 举个栗子:构造 Random Forest(随机森林) 

(1) 得到 Bootstrap 作为一个 dataset

(2) 随机选择d个特征

开始训练一颗树。 

 

2、Boosting(弱弱变强)

boost算法是基于PAC学习理论(probably approximately correct)而创建的一套集成学习算法(ensemble learning)。

其根本思想在于经过多个简单的弱分类器,构建出准确率很高的强分类器,PAC学习理论证明了这一方法的可行性。

 

 

(1)在每一轮如何改变训练数据的权值或几率分布?

经过提升那些在前一轮被弱分类器分错样例的权值,减少前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。

【划分的很差就多重视一点】

 

(2)经过什么方式来组合弱分类器?

经过加法模型将弱分类器进行 "线性组合",好比以下三种方式:

* AdaBoost(Adaptive boosting)算法:刚开始训练时对每个训练例赋相等的权重,而后用该算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重,也就是让学习算法在每次学习之后更注意学错的样本,从而获得多个预测函数。

经过拟合残差的方式逐步减少残差,将每一步生成的模型叠加获得最终模型。

# AdaBoost Algorithm
from sklearn.ensemble import AdaBoostClassifier
clf = AdaBoostClassifier()
...
clf.fit(x_train,y_train)
clf.predict(x_test)

 

* GBDT(Gradient Boost Decision Tree),每一次的计算是为了减小上一次的残差,GBDT在残差减小(负梯度)的方向上创建一个新的模型。

# Gradient Boosting 
from sklearn.ensemble import GradientBoostingClassifier
clf = GradientBoostingClassifier()
# n_estimators = 100 (default)
# loss function = deviance(default) used in Logistic Regression
clf.fit(x_train,y_train)
clf.predict(x_test)

 

* XGBoost (Extreme Gradient Boosting),掀起了一场数据科学竞赛的风暴。

# XGBoost 
from xgboost import XGBClassifier
clf = XGBClassifier()
# n_estimators = 100 (default)
# max_depth = 3 (default)
clf.fit(x_train,y_train)
clf.predict(x_test)

 

 

二者的综合对比

1、Bagging,Boosting 两者之间的区别

1)样本选择上

  Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。

  Boosting:每一轮的训练集不变,只是训练集中每一个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。

2)样例权重

  Bagging:使用均匀取样,每一个样例的权重相等

  Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。

3)预测函数

  Bagging:全部预测函数的权重相等。

  Boosting:每一个弱分类器都有相应的权重,对于分类偏差小的分类器会有更大的权重。

4)并行计算

  Bagging:各个预测函数能够并行生成

  Boosting:各个预测函数只能顺序生成,由于后一个模型参数须要前一轮模型的结果。 

 

2、决策树与算法框架进行结合

1)Bagging + 决策树 = 随机森林

2)AdaBoost + 决策树 = 提高树 Boosting Tree

3)Gradient Boosting + 决策树 = GBDT

  

   

第三种融合策略

1、Stacking(有层次的融合模型)

Ref: 数据挖掘竞赛利器-Stacking和Blending方式

用不一样特征训练出来的三个GBDT模型进行融合时,咱们会将三个GBDT做为基层模型,在其上在训练一个次学习器(一般为线性模型LR)【有点像mlp】

 

  /* continue ... */

相关文章
相关标签/搜索