Day 22 : 决策树

决策树(Decision trees)是一种过程直觉单纯、执行效率也相当高的监督式机器学习模型,适用於classification 及 regression 资料类型的预测,与其它的ML模型比较起来,执行速度是它的一大优势。

此外,Decision trees 的特点是每个决策阶段都相当的明确清楚(不是YES就是NO),相较之下,Logistic Regression 与 Support Vector Machines 就好像黑箱一样,我们很难去预测或理解它们内部复杂的运作细节。而且 Decision trees 有提供指令让我们实际的模拟并绘出从根部、各枝叶到最终节点的决策过程。

什麽是决策树?

  • 用来处理问题的树状结构
  • 每个内部节点表示一个评估欄位
  • 模仿人类决策的过程

原理

刚刚提到的决策边界,你现在找到有三个特徵

A:是否戴口罩

B:是否打疫

C:是否14天有出国

假设是你发现找到确诊案例的公式是 sigmoid(-50 + 300 * A + 240 * B + 163 * C) > 0.5 则代表是确诊。你很开心地跑去跟卫生署的人说明,但是却很少人可以懂你的模型在干麽。这时候你用了决策树,你改变你的说法,只要没有打口罩,有70%会确诊;若带口罩的前提之下但是没有打疫苗,还是有70%会确诊...

於是让非专业资料分析人员也可以清楚在干麽,解释力也很强,这就是决策树的优点

优缺点

  • 优点
    • 简单且具有高度解释力
    • 执行速度快
  • 缺点
    • 模型容易过度拟合
    • 特徵过多的时候,树会非常多分支

决策树的评估指标

  • 以吉尼系数(Gini)作为选择依据(不纯度计算)
  • 亦可用资讯增益(Information Gain)(用熵计算)

吉尼不纯度(Gini Impurity)

  • 假设资料集合 S 包含 n 个類别,吉尼系數 Gini(S) 定义为,pj为在S中的值组属於類别j的机率

  • 利用属性A分割资料集合 S 为 S1 与 S2 (二元分割)。则根据此一分割要件的吉尼系數GiniA(S)为

  • Gini impurity (吉尼不纯度)降低值:

https://chart.googleapis.com/chart?cht=tx&chl=%24%24%20%5CDelta%20Gini(A)%20%3D%20Gini(S)%20-%20Gini_A(S)%24%24

挑选拥有最大不纯度的降低值或吉尼不纯度GiniA(S)最小的属性作为分割属性。

说明 计算
female的 Gini index https://chart.googleapis.com/chart?cht=tx&chl=%24%24%201%20-%20(2%2F10)%5E2%20-%20(8%2F10)%5E2%20%3D%200.32%24%24
male的 Gini index https://chart.googleapis.com/chart?cht=tx&chl=%24%24%201%20-%20(13%2F20)%5E2%20-%20(7%2F20)%5E2%20%3D%200.455%24%24
加权计算後 Gini index https://chart.googleapis.com/chart?cht=tx&chl=%24%24%20(10%2F30)*0.32%20%2B%20(20%2F30)*0.455%20%3D%200.41%24%24

说明 计算
more than 30 的 Gini index https://chart.googleapis.com/chart?cht=tx&chl=%24%24%201%20-%20(6%2F14)%5E2%20-%20(8%2F14)%5E2%20%3D%200.489%20%24%24
less than 30 的 Gini index https://chart.googleapis.com/chart?cht=tx&chl=%24%24%201%20-%20(9%2F16)%5E2%20-%20(7%2F16)%5E2%20%3D%200.492%24%24
加权计算後 Gini index https://chart.googleapis.com/chart?cht=tx&chl=%24%24%20(16%2F30)*0.489%20%2B%20(14%2F30)*0.492%20%3D%200.49%24%24

性别的分类有比较小的Gini不纯度,代表用该特徵分类後资料比较不混乱

资讯获利(Information Gain, IG)

以熵 (Entropy) 为基础
熵 (乱度),可当作资讯量的凌乱程度 (不确定性) 指标,当熵值愈大,则代表资讯的凌乱程度愈高。

https://chart.googleapis.com/chart?cht=tx&chl=%24%24%20(16%2F30)*0.489%20%2B%20(14%2F30)*0.492%20%3D%200.49%24%24
https://chart.googleapis.com/chart?cht=tx&chl=%24%24%20IG%20%3D%20-p%20*%20log_2%20p%20-%20q%20*%20log_2%20q%24%24

说明 计算
female的 Entropy https://chart.googleapis.com/chart?cht=tx&chl=%20%24%24%20-%20(2%2F10)log_2(2%2F10)%20-%20(8%2F10)log_2(8%2F10)%20%3D%200.72%20%24%24
male的 Entropy https://chart.googleapis.com/chart?cht=tx&chl=%24%24%20%20-%20(13%2F20)log_2(13%2F10)%20-%20(7%2F20)log_2(7%2F20)%20%3D%200.93%24%24
加权计算後 Entropy https://chart.googleapis.com/chart?cht=tx&chl=%24%24%20(10%2F30)*0.72%20%2B%20(20%2F30)*0.93%20%3D%200.86%24%24

说明 计算
more than 30 的 Entropy https://chart.googleapis.com/chart?cht=tx&chl=%24%24%20%20-%20(6%2F14)log_2(6%2F14)%20-%20(8%2F14)log_2(8%2F14)%20%3D%200.99%20%24%24
less than 30 的 Entropy https://chart.googleapis.com/chart?cht=tx&chl=%24%24%20-%20(9%2F16)log_2(9%2F16)%20-%20(7%2F16)log_2(7%2F16)%20%3D%200.99%20%24%24
加权计算後 Entropy https://chart.googleapis.com/chart?cht=tx&chl=%24%24%20(14%2F30)*0.99%20%2B%20(16%2F30)*0.99%20%3D%200.99%24%24

性别的分类有比较小熵,代表用该特徵分类後资料比较不混乱

实作程序码

一样套用上次的模板,我们将资料进行切割後喂给模型

from sklearn.tree import DecisionTreeClassifier
classifier = DecisionTreeClassifier(criterion = 'entropy', random_state = 0)
classifier.fit(X_train, y_train)

y_pred = classifier.predict(X_test)

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)

print(cm)
>>> [[57 10]
     [ 6 27]]
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))

视觉化

绘制 trainin set 和 testing set 的图


树状图

# 建立决策树 (3 层) 并预测结果
model = DecisionTreeClassifier(max_depth=3)
model.fit(dx_train, dy_train)
predict = model.predict(dx_test)
test_score = model.score(dx_test, dy_test) * 100
# 印出预测精确率
print(f'Accuracy: {test_score:.1f}%')
# 印出文字版的决策树
print(export_text(model, feature_names=list(feature_names)))
# 绘制决策树
plt.figure(figsize=(16, 16))
plot_tree(model,  # 填满颜色, 开启圆角, 显示百分比
          filled=True, rounded=True, proportion=True,
          feature_names=feature_names,
          class_names=class_names)
plt.savefig('tree.jpg')  # 写入到档案

github 程序码

更详细可以请参考连结


<<:  虹语岚访仲夏夜-20(专业的小四篇)

>>:  Day 22 - 运算过载,warning ! warning !

Day 25 - 云端备份是降低专案风险的一环

一定要强调一下资料备份的重要性, 分享一个亲身经历的实际案例, 因为我本身还算是ASUS的爱用者,...

[Day 2] Reactive Programming - Programming paradigm

前言 在程序历史的进程中,就像是动物历史一样,是在漫漫的演变当中前进。动物会根据环境最适者生存,程序...

Day 1 | 在安装之後

这是第一次参加铁人赛,期待自己可以依照书上的教学将Kotlin学好,并具备开发小型系统的能力。 此次...

【Day16-搜寻】茫茫文海当中找到那个对的词——文字处理利器之正规表达式在python的应用

前一天我们就如何让程序可以认得不同的单字稍微讨论了一下一些基本的处理,那今天我们就继续文字的主题来介...

Day 28 网路身分认证-Cognito

今天我们来谈谈网路的身分认证-Cognito 1. Cognito应用价值 现在的生活环境,不管是网...