信息论和决策树算法
- 1. 信息论
- 1.1 信息量的大小
- 1.2 信息熵 entropy
- 1.3 基尼系数
- 1.4 能力层级
- 2. 决策树
- 2.1 评价几种机器学习算法
- 3. 代码
- 3.1 计算系统的信息熵
- 3.2 决策树预测鸢尾花
1. 信息论
- 香农:信息论的创立者
1.1 信息量的大小
- 小概率时间发生了,信息量很大;
- 大概率事件发生了,信息量很小。
1.2 信息熵 entropy
- 熵是一个系统的混乱程度:
- 熵越大,系统越混乱;
- 熵越小,系统越有序。
- 信息熵的计算公式
H ( X ) = − ∑ i = 1 n P ( x i ) log 2 ( P ( x i ) ) H(X) = -\sum_{i=1}^{n} P(x_i) \log_2(P(x_i)) H(X)=−i=1∑nP(xi)log2(P(xi))
1.3 基尼系数
- [p1, p2, p3]
- -(p1 * log2(p1) + p2 * log2(p2) + p3 * log2(p3))
- 化简后:p1 * (1 - p1) + p2 * (1 - p2) + p3 * (1 - p3)
- 基尼系数没有实际意义,它只是工程数学上的化简。
- 基尼系数的内涵和信息熵是一样的,但是基尼系数的计算代价大大降低了。
1.4 能力层级
- 看得懂公式
- 能够用科学计算的方法写出这个公式的代码
- 跟编程语言没有什么大的关系
2. 决策树
2.1 评价几种机器学习算法
- KNN:KNN算法是一种很重要的编程范式,作为一种思想;
- 贝叶斯:贝叶斯是判别式常用的模型,现在用的也少了;
- 决策树:决策树是机器视觉里面最重要的算法,它的解释性比较好,而且有筛选特征的能力。而且决策树算法是机器学习算法中唯一一个可以控制模型大小的算法。
3. 代码
3.1 计算系统的信息熵
- 假设一个系统的输出有两种情况,下面数字代表输出该结果的概率,以下哪一个系统的熵比较大?
- A: [0.9,0.1]
- B: [0.6,0.4]
- C: [0.5,0.5]
import numpy as np
PA = np.array([0.9,0.1])
PB = np.array([0.6,0.4])
PC = np.array([0.5,0.5])
entropyA = -(np.log(PA)*PA).sum()
entropyB = -(np.log(PB)*PB).sum()
entropyC = -(np.log(PC)*PC).sum()
print(entropyA,entropyB,entropyC)
0.3250829733914482 0.6730116670092565 0.6931471805599453
3.2 决策树预测鸢尾花
# 加载数据
from sklearn.datasets import load_iris
X,y = load_iris(return_X_y=True)
# 切分数据
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2)
# 引入决策树
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import plot_tree
# 构建模型
dtc = DecisionTreeClassifier(criterion='entropy')
# 训练模型
dtc.fit(X=X_train,y=y_train)
# 预测模型
y_pred = dtc.predict(X_test)
# 评价模型
acc = (y_pred == y_test).mean()print(acc) # 打印这棵树
plot_tree(dtc)
[Text(0.5, 0.9, ‘x[2] <= 2.45\nentropy = 1.584\nsamples = 120\nvalue = [42, 40, 38]’),
Text(0.375, 0.7, ‘entropy = 0.0\nsamples = 42\nvalue = [42, 0, 0]’),
Text(0.625, 0.7, ‘x[3] <= 1.75\nentropy = 1.0\nsamples = 78\nvalue = [0, 40, 38]’),
Text(0.5, 0.5, ‘x[2] <= 4.95\nentropy = 0.365\nsamples = 43\nvalue = [0, 40, 3]’),
Text(0.25, 0.3, ‘x[3] <= 1.65\nentropy = 0.169\nsamples = 40\nvalue = [0, 39, 1]’),
Text(0.125, 0.1, ‘entropy = 0.0\nsamples = 39\nvalue = [0, 39, 0]’),
Text(0.375, 0.1, ‘entropy = 0.0\nsamples = 1\nvalue = [0, 0, 1]’),
Text(0.75, 0.3, ‘x[0] <= 6.4\nentropy = 0.918\nsamples = 3\nvalue = [0, 1, 2]’),
Text(0.625, 0.1, ‘entropy = 0.0\nsamples = 2\nvalue = [0, 0, 2]’),
Text(0.875, 0.1, ‘entropy = 0.0\nsamples = 1\nvalue = [0, 1, 0]’),
Text(0.75, 0.5, ‘entropy = 0.0\nsamples = 35\nvalue = [0, 0, 35]’)]