机器学习-决策树

决策树

1. 决策树算法核心解决的2个问题

1.1 如何选择最优划分的属性

使用不纯度划分。衡量纯度可以分信息熵和基尼值。

1.1.1 信息熵

信息熵(information entropy)是度量不纯度最常用指标。

不纯度计算是基于节点来结算,树中的每个节点都会有不纯度。

1.1 假设当前节点t中第k类样本所含比例为 p k p_k pk,则信息熵定义为:

E n t ( t ) = − ∑ k = 1 c p k l o g 2 p k Ent(t) = -\sum_{k=1}^cp_klog_2{p_k} Ent(t)=k=1cpklog2pk

ps: c表示当前节点中总共有分了c类。

  • Ent(t)值越小,纯度越高。
  • Ent(t)最小值是0,最大值是 l o g 2 c log_2^c log2c,如果是二分类最大值则是1。
  • Ent(t)越接小(接近0),表示样本分类不平衡;越大,表示样本分类平衡
1> 信息增益 ID3

假定样本集合D,其中属性a有V个可能的取值{ a 1 , a 2 . . . a v a^1,a^2...a^v a1,a2...av},其中第V个分支节点包含了集合D在属性a上取值为 a v a^v av的样本,记为 D v D^v Dv,根据上式可以计算出 D v D^v Dv的信息熵;
同时考虑到各分支节点包含的样本量不同,给予分支节点权重 ∣ D v ∣ / ∣ D ∣ |D^v|/|D| Dv/D,于是可以算出属性a对样本集D进行划分所获得的信息增益,

G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D,a) = Ent(D)-\sum_{v=1}^V\frac{|D^v|}{|D|}Ent(D^v) Gain(D,a)=Ent(D)v=1VDDvEnt(Dv)

  • 信息增益越大,则使用属性a划分获得的“纯度提升”越大;故使用信息增益最大的属性进行划分。
  • 如果有多个属性均得到了最大的信息增益,则可任选其中之一。
    2)优缺点
  • 不能处理连续型变量
  • 对可取值数目多的属性有所偏好
2> 增益率 C4.5

为解决信息增益对可取数目较多属性的偏好,使用“增益率”

G a i n   r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) Gain~ratio(D,a) = \frac{Gain(D,a)}{IV(a)} Gain ratio(D,a)=IV(a)Gain(D,a)
分 支 度 I V ( a ) = − ∑ v = 1 v ∣ D v ∣ ∣ D ∣ l o g 2 ∣ D v ∣ ∣ D ∣ 分支度 IV(a) = -\sum_{v=1}^v\frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|} IV(a)=v=1vDDvlog2DDv

  • 通常属性a的取值数目越多,IV(a)值越大。

  • 注意:增益率对可取数目较少的属性有所偏好

  • 处理连续值:使用二分法;针对连续变量每个间隔划分为两类,分别计算gain_ratio,找出最大的gain_ratio。

故C4.5算法并不是直接选信息增益率最大的属性,而是一个启发式:先找出信息增益(Gain)高于平均水平的属性,在从中选择增益率(Gain_ratio)最高的

1.1.2 基尼值

基尼值:也是针对每个节点计算

G i n i ( t ) = ∑ k = 1 c p k ( 1 − p k ) = 1 − ∑ k = 1 c p k 2 Gini(t) = \sum_{k=1}^cp_k(1-p_k) = 1-\sum_{k=1}^cp_k^2 Gini(t)=k=1cpk(1pk)=1k=1cpk2

  • 基尼值反映从数据集中随机抽取两个样本,其类别标记不一致的概率。
  • 因此,基尼值越小,数据集纯度越高。
  • 一般基尼值介于0-0.5,接近与0表明样本越不平衡;越接近0.5,样本越平衡。
1>基尼指数 CART 二叉树

G i n i   i n d e x ( D , a ) = ∑ k = 1 v ∣ D v ∣ ∣ D ∣ G i n i ( D v ) Gini~index(D,a) = \sum_{k=1}^v\frac{|D_v|}{|D|}Gini(D^v) Gini index(D,a)=k=1vDDvGini(Dv)

所以,选择基尼指数最小的那个属性进行划分。

1.1.3 回归树最优属性划分衡量指标

以上均是针对分类树,对于回归树(预测值为连续型变量):

  1. CART可用于回归树,针对每个叶子节点使用均值作为预测值,使用方差作为不纯度衡量指标
  2. M5-Quinlan,提出针对每个叶子节点使用线性回归预测,使用标准差做为不纯度衡量指标
    方差理解:

未 分 组 样 本 方 差 : s 2 = ∑ i − 1 n ( x − x ˉ ) n − 1 未分组样本方差: s^2 = \frac{\sum_{i-1}^n(x-\bar{x})}{n-1} s2=n1i1n(xxˉ)
分 组 样 本 方 差 : s 2 = ∑ i − 1 k ( M i − x ˉ 2 ) f i n − 1 分组样本方差: s^2 = \frac{\sum_{i-1}^k(M_i-\bar{x}^2)f_i}{n-1} s2=n1i1k(Mixˉ2)fi

  • 在根节点处是全部数据集,求全部的数据的均值,再用每个原数据减去均值求方差
  • 当有分支时,相当于分组数据,针对每个组计算均值 x ˉ \bar{x} xˉ,每个组数据 M i M_i Mi减去其对应组的 x ˉ \bar{x} xˉ,再乘以其所在组数据所占比重 f i f_i fi
  • 选用方差下降做多的属性做划分。

sklearn中使用如下:

  1. mse 均方误差,叶节点使用均值预测

M S E = 1 N ∑ i = 1 n ( f i − y i ) 2 MSE = \frac{1}{N}\sum_{i=1}^n(f_i-y_i)^2 MSE=N1i=1n(fiyi)2

  1. friedman_mse
  2. mae 平均绝对误差,叶节点使用中位数预测。

M A E = 1 N ∑ i = 1 n ∣ f i − y i ∣ MAE = \frac{1}{N}\sum_{i=1}^n|f_i-y_i| MAE=N1i=1nfiyi

均选根据父节点与子节点额差额最大的属性作为最佳划分属性。

1.2 如何让树停止生长,防止过拟合

剪枝处理

1> 预剪枝
  • 原理:指在决策树生长过程中,对每个节点在划分前进行估计,若当前节的划分不能使泛化能力提升,则停止划分并将当前节点标记为叶节点。(用验证集验证泛化能力)
  • 优点:显著减少决策树的训练时间和测试时间开销,降低了过拟合风险。
  • 缺点:但也有欠拟合的风险。(当前划分可能不能提高返还能力,但在其基础上进行的后续划分却有可能导致性能显著提高)
2> 后剪枝
  • 原理:指先从训练集中生成一颗完整的决策树,然后自底向上地对非叶节点进行考察,如果该节点对应的子树替换为叶节点能带来泛化能力的提升,则将该子树替换成叶节点。(用验证集验证泛化能力)
  • 优点:后剪枝通常比预剪枝保留更多的分支,欠拟合风险很小,有效降低过拟合风险,泛化能力优于预剪枝。
  • 缺点:时间开销比预剪枝大的多。

2. 决策树在sklearn中实现

from sklearn.tree import DecisionTreeClassfier   # 分类决策树
from sklearn.tree import DecisionTreeRegressor   # 回归决策树
#分类树与回归树参数一致,只是分类树比回归树多了一个class_weight参数。
DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort='deprecated', ccp_alpha=0.0)

DecisionTreeRegressor(criterion='mse', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, presort='deprecated', ccp_alpha=0.0)

【参考资料】
1.西瓜书
2.菜菜的sklern课堂
3.CDA数据培训

你可能感兴趣的:(机器学习)