数据分析算法应用之从决策树到GBDT的优化

4,731 阅读4分钟

多分类问题概述

分类是一种典型的有监督学习问题,其应用场景如:信用风险评估、医学诊断和电子邮件分类等。

一个典型的分类模型构建流程如图所示:

二分类任务

“拆分法”:可以解决多分类问题,即将多分类任务拆为若干个二分类任务:

  • 一对一(OvO)
  • 一对其余(OvR)
  • 多对多(MvM)

图片来源:周志华.机器学习.清华大学出版社,2016

回归问题概述

在一个回归模型中,我们需要关注或预测的变量叫做因变量,我们选取的用来解释因变量变化的变量叫做自变量

决策树

  • 监督学习,分类(二分类或者多分类)或者回归;
  • 基于树结构进行决策

一个例子---相亲问题:

根据一系列特征作出决策;每一次选择一个变量,作为树,最终结果作为叶子结点

假设我们希望判断一个人未来5年的收入水平是否会超过100w,这可以视为一个分类问题;我们可以收集如下特征:性别,年龄,工作城市,行业,工作年限,工作城市平均收入,工作行业平均收入,职位类别,职位类别平均收入等等,如上我们同样可以构建一个决策树,但是这里每一层的分裂特征怎么选?

决策树核心---决策规则

  • ID3:根据信息增益( Information Gain )来选取feature作为决策树分裂的节点
  • C4.5 :用信息增益比率( gain info) 来选择feature
  • CART(Classification and Regression Tree):使用基尼指数选择Feature

决策树构建

ID3的思想

  1. 自顶向下,贪心搜索遍历所有可能的决策空间,优先选择最优的决策空间( ID3和C4.5算法的基础)
  2. 从选择根节点开始
  3. 用统计的方法确定每个属性单独分类样例的能力,优先选择分类最好的属性作为当前节点(根节点)
  4. 为节点属性的每个可能值产生一个分值,并根据取值分割样例
  5. 重复这个过程,直到达到终止条件

C4.5

C4.5是ID3的改进算法

  1. 用信息增益率来选择属性
  2. 在树构造过程中进行剪枝( 一定程度避免overfitting )

避免过拟合

  1. 增加对连续值特征的处理
  2. 增加对缺失值的处理

CART

  • CART:分类回归树

CART使用GINI指数选择feature

  • 二叉树,每个决策都是“是”与“否”

  • 分类树:输出的离散的样本类标

  • 回归树:输出的是连续的实树预估值( 房价、点击率等)

常见的决策树模型

模型可处理的特征类型不纯度度量方式分割后子节点数量目标特征类型
ID3离散型信息增益大于等于2离散型
C4.5离散型、连续型信息增益率大于等于2离散型
CART离散型、连续型Gini系数等于2离散型、连续型

模型优劣及超参数

优势: 模型简单,可解释性强,可以省去一定程度的特征处理,对缺失值有比较好的处理机制,在相对短的时间内能够对大型数据源做出可行且效果良好的结果。

劣势: 单棵树泛化能力不强,容易发生过拟合;容易忽略数据集中属性的相互关联;

超参数: 树的最大深度,叶节点的最小元素个数

GBDT

梯度提升树,Gradient Boosting Decision Tree

以回归树为基学习器的boosting方法

用损失函数的负梯度来拟合每轮损失的近似值,

GradianBoostingClassifier类

scikit-learn.org/stable/modu…

参数功能
loss指定损失函数,默认为“deviance”,(对数损失),可为“exponential”(指数损失)
learning_rate学习率,默认为0.1
n_estimators弱分类器个数,默认为100
subsample拟合基学习器的训练集样本数占总样本数的比例,0到1之间的浮点数,默认为1.0
属性说明
feature_ importances_特征重要性
oob_improvement_每增加一个基分类器,袋外样本的损失函数减少值
train_score_每增加一个基分类器,训练集上损失函数的值

GradientBoostindRegressor类

参数说明
loss- 指定损失函数,默认为“ls”(平方损失) ,还可为:
  •   “lad”(绝对值损失)
  •   “huber”( huber损失)
  •   “quantile”(分位数回归) | | alpha | 当loss=“huber”或”quantile” 时有效,两个损失中的参数,默认为0.9 | | learning_rate | 学习率,默认为0.1 | | n_estimators | 弱分类器个数,默认为100 | | subsample | 拟合基学习器的训练集样本数占总样本数的比例,0到1之间的浮点数,默认为1.0 |

构建GBDT模型

from sklearn.ensemble import GradientBoostingClassifier
import matplotlib.pyplot as plt

# 建立并训练GBDT模型
model_gdbt = GradientBoostingClassifier(random_state=10,subsample=.7)
model_gdbt.fit(X_train, Y_train)

#  弱分类器袋外样本损失减小值和训练集损失
plt.figure(figsize=(8,6))
plt.plot(model_gdbt.oob_improvement_, 'y-+', label='oob')
plt.plot(model_gdbt.train_score_, 'b--*', label='train')
plt.xlabel('estimator_order')
plt.legend()

随着弱分类器的增加,训练集的损失在不断降低,袋外样本的损失减小值慢慢趋于平稳。