决策树
决策树既可以用来做回归模型,也可以用来做分类模型。
核心思想
相似的输入必会产生相似的输出。
首先从训练样本矩阵中选择一个特征进行子表划分,使每个子表中该特征值的值全部相同,然后再在每个子表中选择下一个特征按照同样的规则继续划分更小的子表,不断重复直到所有特征值全部相同。对于待预测样本,根据其每一个特征的值,选择对应的子表,逐一匹配,直到找到与之完全匹配的叶级子表,用该子表中样本的输出,通过平均(回归)或者投票(分类)为待预测样本提供输出。
决策树的底层为一个二叉树
决策树分类
当我们在构建决策树的过程中,发现它其实就是一个递归构建的过程,但是在构建的过程中会遇到以下两个核心问题:
- 如何选取特征。决策树构建的每一步,应该挑选最优的特征,进行决策对数据集划分效果最好;
- 决定何时停止分类子节点
如何选取特征值呢
信息熵
信息熵(information entropy)是度量样本集合纯度的常用指标,该值越大,表示该集合纯度越低(或越混乱),该值越小,表示该集合纯度越高(或越有序),信息熵定义如下:
H
=
−
∑
i
=
1
n
P
(
x
i
)
log
2
P
(
x
i
)
{\text{H}} = - \sum\limits_{i = 1}^n {P({x_i}){{\log }_2}P({x_i})}
H=−i=1∑nP(xi)log2P(xi)
其中,
P
(
x
i
)
P({x_i})
P(xi)表示集合中第i类样本所占比例,当其为1时(只有1个类别,比例为100%),
log
2
P
(
x
i
)
{{\log }_2}P({x_i})
log2P(xi)的值为0,整个系统信息熵为0;当类别越多,
P
(
x
i
)
P({x_i})
P(xi)的值越等于0,
log
2
P
(
x
i
)
{{\log }_2}P({x_i})
log2P(xi)趋近于负无穷大,整个系统信息熵就越大
手写实现信息熵并绘图观察其变化
"""
1-10个类别信息熵
"""
import math
import numpy as np
import matplotlib.pyplot as plt
class_num = 10
def cal_entropy(n):
p = 1.0 / n # 概率
total_entropy = 0.0 # 总熵值
for i in range(n):
p_i = p * math.log2(p)
total_entropy += p_i
return -total_entropy
entropies = []
for i in range(1, class_num + 1):
entropy = cal_entropy(i)
entropies.append(entropy)
plt.plot(np.arange(1, class_num + 1),
entropies, color='orangered')
plt.show()
输出结果如下图:
由上图可以看出,分类越多,熵值越大,越混乱。是不是很像高中化学中的那个熵值呢?