一、决策树

1. 什么是决策树

决策树是一种常见的机器学习方法,其核心思想是相同(或相似)的输入产生相同(或相似)的输出,通过树状结构来进行决策,其目的是通过对样本不同属性的判断决策,将具有相同属性的样本划分到一个叶子节点下,从而实现分类或回归. 以下是几个生活中关于决策树的示例.

【示例1】

男生看女生与女生看男生的决策树模型

2. 决策树的结构

一般来说,一棵决策树包含一个根节点、若干个内部节点和若干个叶子节点. 叶子节点对应最终的决策结果,其它每个节点则对应与一个属性的测试. 最终划分到同一个叶子节点上的样本,具有相同的决策属性,可以对这些样本的值求平均值来实现回归,对这些样本进行投票(选取样本数量最多的类别)实现分类.

3. 如何构建决策树

1)构建决策树算法

决策树的构建,就是不断选取好的特征作为决策节点,构建一颗泛化能力较强的树结构,其基本算法描述如下:

显然,决策树的构建是一个递归的过程,核心是以下两个问题:

  • 如何选取特征. 决策树构建的每一步,应该挑选最优的特征,进行决策对数据集划分效果最好;
  • 决定何时停止分裂子节点.

classification and regression tree

回归: 划分最优分割特征的方式:均方误差

2)如何选择特征

① 信息熵

信息熵(information entropy)是度量样本集合纯度的常用指标,该值越大,表示该集合纯度越低(或越混乱),该值越小,表示该集合纯度越高(或越有序). 信息熵定义如下:

\[H = -\sum_{i=1}^{n}{P(x_i)log_2P(x_i)} \]

其中,\(P(x_i)\)表示集合中第i类样本所占比例,当\(P(x_i)\)为1时(只有一个类别,比例为100%), \(log_2P(x_i)\)的值为0,整个系统信息熵为0;当类别越多,则\(P(x_i)\)的值越接近于0,\(log_2P(x_i)\)趋近去负无穷大,整个系统信息熵就越大.以下代码,展示了类别数量从1...10的集合信息熵变化:

# 信息熵计算演示
import math
import numpy as np
import matplotlib.pyplot as mp

class_num = 10  # 类别最大数量


def entropy_calc(n):
    p = 1.0 / n  # 计算每个类别的概率
    entropy_value = 0.0  # 信息熵

    for i in range(n):
        p_i = p * math.log(p)
        entropy_value += p_i

    return -entropy_value  # 返回熵值


entropies = []
for i in range(1, class_num + 1):
    entropy = entropy_calc(i)  # 计算类别为i的熵值
    entropies.append(entropy)

print(entropies)

# 可视化回归曲线
mp.figure('Entropy', facecolor='lightgray')
mp.title('Entropy', fontsize=20)
mp.xlabel('Class Num', fontsize=14)
mp.ylabel('Entropy', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle='-')
x = np.arange(0, 10, 1)
print(x)
mp.plot(x, entropies, c='orangered', label='entropy')

mp.legend()
mp.show()

执行结果:

随着决策树的节点划分,纯度是在不断的提升,熵值不断的减小

② 信息增益

决策树根据属性进行判断,将具有相同属性的样本划分到相同节点下,此时,样本比划分之前更加有序(混乱程度降低),信息熵的值有所降低。用划分前的信息熵减去划分后的信息熵,就是决策树获得的信息增益。可以用以下表达式表示:

\[Gain(D, a) = Ent(D) - \sum_{v=1}^{V} \frac{|D^v|}{|D|} Ent(D^v) \]

其中,D表示样本集合,a表示属性,v表示属性可能的取值\({v^1, v^2,...,v^n}\), \(\frac{|D^v|}{|D|}\)表示权重,样本越多的分支对分类结果影响更大,赋予更高的权重, \(Gain(D, a)\)表示在样本集合D上使用属性a来划分子节点所获得的信息增益. 以下是一个关于信息增益计算的示例.

说明:

  • 香蕉占2/5,所以\(P_1=0.4\);梨占1/5,所以\(P_2 = 0.2\);黄瓜占1/5,所以\(P_3 = 0.4\)
  • 根节点信息熵:\(-(0.4 * log_2 0.4 + 0.2 * log_2 0.2 + 0.4 * log_2 0.4) \approx 1.522\)
  • 根据颜色划分后:黄色分支信息熵\(-(\frac{2}{3} * log_2 \frac{2}{3} + \frac{1}{3} * log_2 \frac{1}{3}) \approx 0.918\);绿色分支信息熵\(-(1.0 * log_2 1.0) = 0\);整个第二层信息熵为\(0.6 * 0.918 + 0.4 * 0 \approx 0.55\)
  • 根据颜色划分后的信息增益:\(1.522 - 0.55 \approx 0.97\)

由以上示例可知,经过对样本按颜色进行类别划分,划分后的信息熵比原来下降了,下降的值就是信息增益。一般来说,信息增益越大,以该属性划分所获得的“纯度提升”越大. 著名的ID3决策树学习算法就是以信息增益为准则来划分属性.

③ 增益率

增益率不直接采用信息增益,而采用信息增益与熵值的比率来作为衡量特征优劣的标准. C4.5算法就是使用增益率作为标准来划分属性. 增益率定义为:

\[Gain\_ratio(D, a) = \frac{Gain(D, a)}{IV(a)} \]

其中

\[IV(a) = - \sum_{v=1}^{V} \frac{|D^v|}{|D|} log_2 \frac{|D^v|}{|D|} \]

④ 基尼系数

信息熵越大,数据越混乱,信息熵越小,数据越纯
Gini系数越大,数据越混乱,Gini系数越小,数据越纯
基尼系数定义为:

\[Gini(p) = \sum_{k=1}^{k} p_k (1-p_k) = 1 - \sum_{k=1}^{k} p_k^2 \]

直观来说,基尼系数反映了从数据集D中随机抽取两个样本,类别标记不一致的概率. 因此,基尼系数越小,数据集的纯度越高. CART决策树(Classification And Regression Tree)使用基尼系数来选择划分属性,选择属性时,选择划分后基尼值最小的属性作为最优属性. 采用和上式相同的符号表示,数据集D下属性a的基尼系数定义为:

\[Gini\_index(D, a) = \sum_{v=1}^{V} \frac{|D^v|}{|D|} Gini(D^v) \]

cart: 回归:均方误差mse

​ 分类:Gini系数

ID3: 信息增益

C4.5: 增益率
用信息增益除以自身熵值。
划分之前熵值不变,谁划分后的信息熵增益越大,谁的增益率就越高

  • 信息熵:描述一下当前的样本纯不纯
  • 信息增益:划分之后的熵值比划分之前的熵值,减少了,说明我划分的对。
  • 信息增益:(划分之前的熵值-划分之后的熵值)

3)如何停止分裂

以下几种情况会停止决策树子节点的构建:

  • 当前节点所有样本属于同一个类别,无需划分
  • 当前属性集为空,或者所有样本取值相同,无法划分
  • 当前节点包含的样本集合为空,不能划分
  • 当前节点样本数量少于指定数量

4. 如何实现决策树

scikit-learn中决策树相关API:

# 模型
model = st.DecisionTreeRegressor(max_depth=4)  # 决策树回归器
model = st.DecisionTreeClassifier(max_depth=4)

# 训练
model.fit(train_x, train_y)
# 预测
pre_test_y = model.predict(test_x)

TO_DO
聚类(上)视频后半段的思路很好

 posted on 2023-04-02 20:15  怪兽饲养员Y  阅读(33)  评论(0)    收藏  举报