『机器学习』 —— 决策树算法(Decision Tree)
文章首发地址见个人博客
决策树(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−Pilog2Pi
其中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−Pilog2Pi=−145log2(149)−145log2(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×(−52log252−53log253)+144×(−44log244−40log240)+145×(−53log253−52log252)=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(creditrating)=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)相关推荐
- 机器学习 决策树算法 (Decision Tree)
____tz_zs学习笔记 决策树算法概念: 决策树(decision tree)是一个类似于流程图的树结构:其中,每个内部结点表示在一个属性上的测试,每个分支代表一个属性输出,而每个树叶结点代表类或 ...
- 复习05统计学习方法(决策树算法Decision Tree)---图片版
- 【机器学习】决策树(Decision Tree)
[机器学习]k近邻算法(KNN) [机器学习]决策树(Decision Tree) [机器学习]朴素贝叶斯(Naive Bayes) 一.概述 决策树(Decision Tree)是有监督学习中的一种 ...
- python决策树实例_Python机器学习之决策树算法实例详解
本文实例讲述了Python机器学习之决策树算法.分享给大家供大家参考,具体如下: 决策树学习是应用最广泛的归纳推理算法之一,是一种逼近离散值目标函数的方法,在这种方法中学习到的函数被表示为一棵决策树. ...
- 机器学习:决策树算法(ID3算法)的理解与实现
机器学习:决策树算法(ID3算法)的理解与实现 文章目录 机器学习:决策树算法(ID3算法)的理解与实现 1.对决策树算法的理解 1.概述 2.算法难点 选择最优划分属性 1.信息熵 2.信息增益 2 ...
- 机器学习算法——决策树算法详细介绍,并使用sklearn实现案例预测,可视化决策树
目录 一.决策树算法简介 二.决策树分类原理 1.熵 1.1 概念 1.2 案例 2.决策树的划分依据一:信息增益 2.1 概念 2.2 案例: 3.决策树的划分依据二:信息增益率 3.1 概念 3. ...
- 机器学习3决策树算法模型
决策树算法模型 1.什么是决策树? 2.决策树的归纳 2.1 (选择分裂特征)特征的选择 2.2 决策树的生成 2.2.1 ID3 算法 2.2.2 C4.5 算法 2.2.3 Card算法 2.2 ...
- 机器学习基础 决策树算法
文章目录 一.决策树算法简介 二.决策树分类原理 1. 熵 1.1 概念 1.2 案例 2. 决策树的划分依据一----信息增益 2.1 概念 2.2 案例 3. 决策树的划分依据二----信息增益率 ...
- 【CSDN软件工程师能力认证学习精选】机器学习之决策树(Decision Tree)及其Python代码实现
CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...
最新文章
- 从游戏脚本语言说起,剖析Mono所搭建的脚本基础
- javascript 异步实现方案
- 原 c++中map与unordered_map的区别
- MySQL—04—MySQL的其他对象
- linux awk 分组统计
- Lambda-函数式接口(1)
- pthread-win32在VC2005下的使用
- php微信40037,服务号发送模板消息问题,错误码:40037
- 多线程调用生成主键流水号存储过程产生主键冲突问题解决方案
- ubuntu16下安装mongodb 3.6
- B - Vicious Keyboard
- Android Context简单说明
- 微信小程序微商城(七):动态API实现商品分类
- Lagrangian乘子法 对偶问题 KKT条件 Slater条件 与凸优化
- 最全的数据中心(IDC)机房整体工程介绍
- 左右滑屏设置_android手势滑屏及左右滑屏
- HTML5 —新增标签
- ios label文字行间距_UILabel UITextField调整行间距【原创】
- 全国多地新冠病例0增长,教你用Python画出当下疫情最火玫瑰图!
- C#在透明窗体WinForm上面画图(电子尺小工具的实现)
热门文章
- Python 遍历列表
- WinForm中弹出新窗体的方法
- 婴儿患小儿脐疝肚子鼓起 父亲竟一刀划开肚脐“放气”
- 2021.01.30刷题总结
- Javaweb或javaEE完整项目名及包名、资源名命名规则
- dnf游戏币比例计算机,DNF游戏币比例下降到30,玩家们却不搬砖呢,工作室说出心声...
- MCE 抗乳腺癌化合物库上线丨靶向乳腺癌知多少?
- html图片gif格式转换,嵌入在HTML文档中的图像格式可以是?
- executeQuery和execute区别
- 学计算机了情话,经典情话_甜言蜜语_表白的话_结婚祝福语_爱情宣言句子_情诗绝句_暧昧短信大全...