文章首发地址见个人博客

决策树(Decision Tree)


1、机器学习算法中分类和预测算法的评估

  • 准确率
  • 速度
  • 强壮性
  • 可规模性
  • 可解释性

2、什么是决策树(Decision Tree)?
决策树是一种类似流程图的树形结构,每个结点表示一个属性测试,每条边表示一个属性输出,每个树叶结点表示类或者类分布。决策树的决策过程需要从决策树的根节点开始,待测数据与决策树中的特征节点进行比较,并按照比较结果选择选择下一比较分支,直到叶子节点作为最终的决策结果。

3、决策树的学习过程

  • 特征选择:从训练数据的特征中选择一个特征作为当前节点的分裂标准(如上图中,“颜色”为上述决策树的一个特征),特征选择的标准不同产生了不同的特征决策算法
  • 决策树生成:根据所选特征峰评估标准,从上至下递归生成子节点,知道数据集不可分则停止决策树生成
  • 剪 枝:决策树容易过拟合,需要剪枝来缩小树的结构和规模(包括预剪枝和后剪枝)。

实现决策树的算法包括ID3、C4.5算法等
4、ID3算法
ID3算法是由Ross Quinlan提出的决策树的一种算法实现,以信息论为基础,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类。
ID3算法是建立在奥卡姆剃刀的基础上:越是小型的决策树越优于大的决策树(be simple简单理论)。

  • 信息熵:用来衡量一个随机变量出现的期望值,如果信息的不确定性越大,熵的值也就越大,出现的各种情况也就越多。信息熵的计算公式为:
    Entropy(S)=∑i=1n−Pilog2PiEntropy(S)=\sum_{i=1}^n-P_ilog_2P_iEntropy(S)=i=1∑n​−Pi​log2​Pi​
    其中SSS为所有事件的集合,PiP_iPi​为事件iii发生的概率,nnn为特征总数
  • 信息增益:是指信息划分前后信息熵的变化,也就是说由于使用了某个特征划分,使得信息熵发生变化,而两者之间的差值就是信息增益,其计算公式如下:
    Gain(S,A)=Entropy(S)−∑v∈Value(A)∣Sv∣sEntropy(Sy)Gain(S,A) = Entropy(S) - \sum_{v∈Value(A)}\frac{|S_v|}{s}Entropy(S_y)Gain(S,A)=Entropy(S)−v∈Value(A)∑​s∣Sv​∣​Entropy(Sy​)
    其中——号后面的部分表示为属性A对S划分的期望值(划分后的信息熵)

算法实现:

  • 初始化属性集合和数据集合
  • 计算数据集合信息熵S和所有属性的信息熵,选择信息增益最大的属性作为当前决策节点
  • 更新数据集合和属性集合(删除掉上一步中使用的属性,并按照属性值来划分不同分支的数据集合)
  • 依次对每种取值情况下的子集重复第二步
  • 若子集只包含单一属性,则为分支为叶子节点,根据其属性值标记。
  • 完成所有属性集合的划分

5、案例实现
通过决策树算法根据一个人的信息来判断他是否会购买电脑。数据如下:
|RID|age|income|student|credit_rating | Class:buys_computer|
|-------|------|-------|------------|--------|
|1|youth|high|no|fair|no|
|2|youth|high|no|excellent|no|
|3|middle_aged|high|no|fair|yes|
|4|senior|medium|no|fair|yes|
|5|senior|low|yes|fair|yes|
|6|senior|low|yes|excellent|no|
|7|middle_aged|low|yes|excellent|yes|
|8|youth|medium|no|fair|no|
|9|youth|low|yes|fair|yes|
|10|senior|medium|yes|fair|yes|
|11|youth|medium|yes|excellent|yes|
|12|middle_aged|medium|no|excellent|yes|
|13|middle_aged|high|yes|fair|yes|
|14|senior|medium|no|excellent|no|
整体数据集合的信息熵:
Info(D)=∑i=1n−Pilog2Pi=−514log2(914)−514log2(514)=0.940bitsInfo(D) = \sum_{i=1}^n-P_ilog_2P_i = -\frac{5}{14}log_2(\frac{9}{14})-\frac{5}{14}log_2(\frac{5}{14})=0.940bitsInfo(D)=i=1∑n​−Pi​log2​Pi​=−145​log2​(149​)−145​log2​(145​)=0.940bits
通过年龄划分后的信息熵:
Infoage(D)=514×(−25log225−35log235)+414×(−44log244−04log204)+514×(−35log235−25log225)=0.694bitsInfo_{age}(D) = \frac{5}{14}\times(-\frac{2}{5}log_2\frac{2}{5}-\frac{3}{5}log_2\frac{3}{5})+\frac{4}{14}\times(-\frac{4}{4}log_2\frac{4}{4}-\frac{0}{4}log_2\frac{0}{4})+\frac{5}{14}\times(-\frac{3}{5}log_2\frac{3}{5}-\frac{2}{5}log_2\frac{2}{5})=0.694bitsInfoage​(D)=145​×(−52​log2​52​−53​log2​53​)+144​×(−44​log2​44​−40​log2​40​)+145​×(−53​log2​53​−52​log2​52​)=0.694bits
通年龄划分的信息增益:
Gain(age)=Info(D)−Infoage(D)=0.940−0.694=0.246bitsGain(age) = Info(D)-Info_{age}(D)=0.940-0.694=0.246bitsGain(age)=Info(D)−Infoage​(D)=0.940−0.694=0.246bits
同上可以计算出
Gain(income)=0.029Gain(income)=0.029Gain(income)=0.029
Gain(student)=0.151Gain(student)=0.151Gain(student)=0.151
Gain(creditrating)=0.048Gain(credit_rating)=0.048Gain(creditr​ating)=0.048
根据算法的原来选择age为第一个结点,当age确定为根节点时,此时的决策树为下图所示:

当第一个结点确定后删除age属性,继续之前的操作,计算出整体数据的信息熵和通过剩余属性划分的信息熵,作差计算出每个属性的信息增益从而决定下一个结点,如此迭代直至所有结点确定。
代码实现(Python)

数据文件下载:AllElectronics.csv ----->Download

from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import tree
from sklearn import preprocessing
from sklearn.externals.six import StringIO# Read in the csv file and put features into list of dict and list of class label
allElectronicsData = open(r'AllElectronics.csv的文件路径', 'rt')
reader = csv.reader(allElectronicsData)
#headers = reader.next()   python3.0已经不支持
headers = next(reader)print(headers)featureList = []
labelList = []for row in reader:labelList.append(row[len(row)-1])rowDict = {}for i in range(1, len(row)-1):rowDict[headers[i]] = row[i]featureList.append(rowDict)print(featureList)# Vetorize features
vec = DictVectorizer()
dummyX = vec.fit_transform(featureList) .toarray()print("dummyX: " + str(dummyX))
print(vec.get_feature_names())print("labelList: " + str(labelList))# vectorize class labels
lb = preprocessing.LabelBinarizer()
dummyY = lb.fit_transform(labelList)
print("dummyY: " + str(dummyY))# Using decision tree for classification
# clf = tree.DecisionTreeClassifier()
clf = tree.DecisionTreeClassifier(criterion='entropy')
clf = clf.fit(dummyX, dummyY)
print("clf: " + str(clf))# Visualize model
with open("allElectronicInformationGainOri.dot", 'w') as f:f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f)oneRowX = dummyX[0, :]
print("oneRowX: " + str(oneRowX))newRowX = oneRowX
newRowX[0] = 1
newRowX[2] = 0
print("newRowX: " + str(newRowX))predictedY = clf.predict([newRowX])
print("predictedY: " + str(predictedY))

说明
运行程序之后会生成一个.dot的文件(在本案例中生成的文件为allElectronicInformationGainOri.dot)
通过安装Graphviz可以将.dot文件转换为可视化的决策树,具体操作方法为

  • 下载Graphviz可视化工具选择graphviz-2.38.zip文件下载解压到安装目录
  • Window系统PC右键我的电脑,点击属性–>高级系统设置–>环境变量–>选择系统变量中的Path点击编辑–>右侧新建–>填入Graphviz安装目录下bin文件夹的目录(eg:C:\Users\Peter\Desktop\graphviz-2.38\release\bin)
  • 设置好环境变量后打开cmd窗口输入dot -Tpng dot文件路径 -o 输出文件.png

本案例输出的决策树为

『机器学习』 —— 决策树算法(Decision Tree)相关推荐

  1. 机器学习 决策树算法 (Decision Tree)

    ____tz_zs学习笔记 决策树算法概念: 决策树(decision tree)是一个类似于流程图的树结构:其中,每个内部结点表示在一个属性上的测试,每个分支代表一个属性输出,而每个树叶结点代表类或 ...

  2. 复习05统计学习方法(决策树算法Decision Tree)---图片版

  3. 【机器学习】决策树(Decision Tree)

    [机器学习]k近邻算法(KNN) [机器学习]决策树(Decision Tree) [机器学习]朴素贝叶斯(Naive Bayes) 一.概述 决策树(Decision Tree)是有监督学习中的一种 ...

  4. python决策树实例_Python机器学习之决策树算法实例详解

    本文实例讲述了Python机器学习之决策树算法.分享给大家供大家参考,具体如下: 决策树学习是应用最广泛的归纳推理算法之一,是一种逼近离散值目标函数的方法,在这种方法中学习到的函数被表示为一棵决策树. ...

  5. 机器学习:决策树算法(ID3算法)的理解与实现

    机器学习:决策树算法(ID3算法)的理解与实现 文章目录 机器学习:决策树算法(ID3算法)的理解与实现 1.对决策树算法的理解 1.概述 2.算法难点 选择最优划分属性 1.信息熵 2.信息增益 2 ...

  6. 机器学习算法——决策树算法详细介绍,并使用sklearn实现案例预测,可视化决策树

    目录 一.决策树算法简介 二.决策树分类原理 1.熵 1.1 概念 1.2 案例 2.决策树的划分依据一:信息增益 2.1 概念 2.2 案例: 3.决策树的划分依据二:信息增益率 3.1 概念 3. ...

  7. 机器学习3决策树算法模型

    决策树算法模型 1.什么是决策树? 2.决策树的归纳 2.1 (选择分裂特征)特征的选择 2.2 决策树的生成 2.2.1 ID3 算法 2.2.2 C4.5 算法 2.2.3 Card算法 2.2 ...

  8. 机器学习基础 决策树算法

    文章目录 一.决策树算法简介 二.决策树分类原理 1. 熵 1.1 概念 1.2 案例 2. 决策树的划分依据一----信息增益 2.1 概念 2.2 案例 3. 决策树的划分依据二----信息增益率 ...

  9. 【CSDN软件工程师能力认证学习精选】机器学习之决策树(Decision Tree)及其Python代码实现

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

最新文章

  1. 从游戏脚本语言说起,剖析Mono所搭建的脚本基础
  2. javascript 异步实现方案
  3. 原 c++中map与unordered_map的区别
  4. MySQL—04—MySQL的其他对象
  5. linux awk 分组统计
  6. Lambda-函数式接口(1)
  7. pthread-win32在VC2005下的使用
  8. php微信40037,服务号发送模板消息问题,错误码:40037
  9. 多线程调用生成主键流水号存储过程产生主键冲突问题解决方案
  10. ubuntu16下安装mongodb 3.6
  11. B - Vicious Keyboard
  12. Android Context简单说明
  13. 微信小程序微商城(七):动态API实现商品分类
  14. Lagrangian乘子法 对偶问题 KKT条件 Slater条件 与凸优化
  15. 最全的数据中心(IDC)机房整体工程介绍
  16. 左右滑屏设置_android手势滑屏及左右滑屏
  17. HTML5 —新增标签
  18. ios label文字行间距_UILabel UITextField调整行间距【原创】
  19. 全国多地新冠病例0增长,教你用Python画出当下疫情最火玫瑰图!
  20. C#在透明窗体WinForm上面画图(电子尺小工具的实现)

热门文章

  1. Python 遍历列表
  2. WinForm中弹出新窗体的方法
  3. 婴儿患小儿脐疝肚子鼓起 父亲竟一刀划开肚脐“放气”
  4. 2021.01.30刷题总结
  5. Javaweb或javaEE完整项目名及包名、资源名命名规则
  6. dnf游戏币比例计算机,DNF游戏币比例下降到30,玩家们却不搬砖呢,工作室说出心声...
  7. MCE 抗乳腺癌化合物库上线丨靶向乳腺癌知多少?
  8. html图片gif格式转换,嵌入在HTML文档中的图像格式可以是?
  9. executeQuery和execute区别
  10. 学计算机了情话,经典情话_甜言蜜语_表白的话_结婚祝福语_爱情宣言句子_情诗绝句_暧昧短信大全...