机器学习理论入门:第二章 经典监督学习算法-决策树
第二章 经典监督学习算法-决策树
一、决策树总体概览
概念:是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。
能解决的问题
–分类问题(较多使用)
–回归问题决策树的种类(主要根据属性划分的依据来进行算法的分类)
–ID3决策树
–C4.5决策树
–CART(Classification And Regression Tree)决策树优缺点
二、信息论-信息熵
随机事件及其信息
–概念:随机事件是在随机试验中,可能出现也可能不出现,而在大量重复试验中具有某种规律性的事件叫做随机事件
–信息:对于一个随机变量X,它的每一个可能值的出现都可以看作是一个信息,每当X的一个可能值被观测到,我们称不确定性减少了,即信息增加了
信息熵
–概念:是信息增益的数学期望
热力学中的熵
–概念:表示系统混乱程度的量度最大熵增原则
–概念:当根据不完整的信息作为依据进行推断时,应该由满足分布限制条件的具有最大熵的概率分布推得
–推论:对于给定的方差,在任意的随机变量中高斯随机变量的熵最大
三、信息论-交叉熵与KL散度
联合熵
–概念:若X,Y是一对离散型随机变量,且联合概率分布为p(x,y),则X,Y的联合熵为:
–作用:描述了一对随机变量的平均信息量条件熵
–概念:给定随机变量X的情况下,随机变量Y的条件熵为:
熵的连锁规则
互信息
–定义
–作用:反应的是知道了Y以后X的不确定性的减少量相对熵(KL散度)
–定义
–推论
交叉熵(在深度学习中占据重要地位)
–定义
–作用:衡量估计出来的概率分布和真实概率分布之间的差异情况
四、属性选择的依据
决策树的结构及作用
–叶节点:输出分类结果
–内部节点:用于属性测试
–根节点:内节点的一种,位置特殊决策树的输入
根节点的一些特殊情况
–若训练集中的数据都属于同一类,那么将RootNode标记为该类的叶节点。返回(返回也意味着算法的结束)
–若属性集为空集,或者训练集中的所有数据的所有属性都相等,那么将RootNode标记为训练集中出现次数最多的类的叶节点,返回决策树的一般算法流程
信息增益
–计算样本集的信息熵
–使用特定属性a进行划分的信息增益
–用法
A)某个属性的信息增益越大,则使用该属性进行划分所得的“纯度提升”越大
B)ID3算法使用信息增益作为属性选择的依据
–缺点
A)对可取值数目较多的属性有偏好增益率
–定义
–缺点
A)对可取值数目较少的属性有偏好
–缺点的解决办法(C4.5算法):先从属性中找到信息增益高于平均水平的属性,然后再从中选出增益率最高的基尼指数
–样本集的基尼值公式
–基尼值作用:反映了随机抽取两个样本,其所属的类别不一致的概率
–属性a的基尼指数定义
–选择标准:选择基尼指数最小的属性
五、剪枝操作
决策树中的过拟合
–概念:决策树的生成过程有时候导致决策树的分支过多(分支过多意味着考虑了过多的边缘情况,边缘情况很多时候由个体差异引起),从而导致过拟合验证集
–概念:决策树在构造的过程中使用验证集进行测试,来决定当前属性是否要进行分裂剪枝的定义:将本来为内部节点的节点变成叶节点的过程叫做剪枝
预剪枝(决策树边生成边进行剪枝操作)
–操作:在决策树生成过程中,每个节点在划分之前先在验证集上进行一次测试,若当前节点的划分无法提高泛化性能,则不做划分处理,直接将此节点作为叶节点(使得一些分支不能展开,降低了过拟合)后剪枝(决策树完全生成之后才开始剪枝,并且是自下向上的进行)
–优点:树的分支相对于预剪枝较多;泛化性能优于预剪枝
–缺点:训练时间较长
六、决策树的拓展
- 连续值处理
–连续属性离散化
A)C4.5算法采用“二分法”:假设有一个连续属性a,那么将数据划分为a≤t和a>t两个部分
2.多变量决策树
–属性的线性组合
七、编程实现(Python)
from math import log
import operatordef calc_entropy(labels):# 计算信息熵label_num = len(labels)label_show_up_times_dict = {}for label in labels:if label not in label_show_up_times_dict.keys():label_show_up_times_dict[label] = 0label_show_up_times_dict[label] += 1entropy = 0.0for key in label_show_up_times_dict:prob = float(label_show_up_times_dict[key]) / label_numentropy += prob * log(prob, 2)return -entropydef split_dataset(dataset, labels, index, value):# 根据特征所在的位置index和特征的值value,从原数据集中分割出那些值等于value的子集和标签子集sub_dataset = []sub_labels = []fc_index = 0for fc in dataset:if fc[index] == value:# 如果遇到了值相等的,那么把这个索引剔除,然后把剔除该索引之后的特征向量加入到子集中temp = fc[:index]temp.extend(fc[index + 1:])sub_dataset.append(temp)# 把该特征向量对应的标签也挑出来fc_index += 1return sub_dataset, sub_labelsdef select_best_attribute(dataset, labels):# 选择最佳属性,依据信息增益,即找到信息增益最大的属性feature_num = len(dataset[0]) # 特征个数base_entropy = calc_entropy(labels) # 当前数据集的信息熵max_info_gain = -1 # 最大信息增益best_feature = -1 # 最佳的特征所在的索引for i in range(feature_num):# 当前特征位置上所有值的Listfeature_value_list = [example[i] for example in dataset]# 获取所有可能的值(不重复)unique_vals = set(feature_value_list)# 此特征的信息熵new_entropy = 0.0for value in unique_vals:# 获取子集sub_dataset, sub_labels = split_dataset(dataset, i, value)# 子集占的比例prob = float(len(sub_dataset)) / len(dataset)# new_entropy加上相应的部分new_entropy += prob * calc_entropy(sub_labels)# 计算当前特征的信息增益info_gain = base_entropy - new_entropyif info_gain > max_info_gain:# 如果比best_info_gain高,那么更新best_info_gain和best_featuremax_info_gain = info_gainbest_feature = ireturn best_featuredef majority_count(labels):# 选出所占比例最高的labellabel_count = {}for vote in labels:if vote not in label_count.keys():label_count[vote] = 0label_count[vote] += 1sorted_class_count = sorted(label_count.iteritem(), key=operator.itemgetter(1), reverse=True)return sorted_class_countdef decision_tree(dataset, feature_names, labels):if labels.count(labels[0]) == len(labels):# label中所有元素都相等,及类别完全相同,停止划分return labels[0]if len(dataset[0]) == 1:# 如果只有一个特征return majority_count(labels)# 选出根节点的最最佳属性best_feature_index = select_best_attribute(dataset, labels)best_feature_name = feature_names[best_feature_index]tree = {best_feature_name: {}}del (feature_names[best_feature_index])attr_values = [example[best_feature_index] for example in dataset]unique_vals = set(attr_values)for value in unique_vals:sub_dataset, sub_labels = split_dataset(dataset, best_feature_index, value)tree[best_feature_name][value] = decision_tree(sub_dataset, sub_labels)return tree
机器学习理论入门:第二章 经典监督学习算法-决策树相关推荐
- 【XLPNet车牌识别算法】第二章 检测部分-算法篇1
[XLPNet车牌识别算法]第二章 检测部分-算法篇1 1. XLPNet检测算法前言 2. XLPNet检测算法详解 2.1 起源 2.2 算法细节 2.1 算法命名 2.2 数据集 2.3 预备知 ...
- webrtc 入门第二章 音视频录制
webrtc 入门第二章 音视频录制 一.介绍 1.媒体录制原理 在很多场景中回放音视频资源的需求是非常重要的例如会议,直播授课等.任何媒体形式的表情都可进行录制,如 ,,等.其中内容更加自由用户 ...
- 机器学习理论入门:第一章 监督学习与非监督学习介绍
第一章 监督学习与非监督学习简介 一.机器学习基本概念 概念:研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有 的知识结构使之不断改善自身的性能 输入 基本概念 –特征向量: ...
- 第二章kNN分类算法sorted函数
sorted函数可以用于对列表等临时排序,sort()则是永久排序(python入门到实践P39): 此处要讲解的是机器学习实践第二章遇到的sorted()函数,sorted()其他用法可以参考官网: ...
- Java基础入门第二章
大二学的java,一个假期过去,学的差不多都忘光了,在这里再重学一遍,也算不上重学吧,相当于复习吧.第一章讲的是jdk及开发工具的安装,这里就不多赘述了,废话不多说,我们直接从第二章开始. 2.1Ja ...
- WPF编程基础入门 ——— 第二章 XAML
XAML 简述 XAML(eXtensible Application Markup Language,可扩展应用程序标记语言)是微软公司创建的一种新的描述性语言,用于搭建应用程序用户界面.XAML实 ...
- TYD深度学习入门 第二章
目录 课时9 梯度下降通俗解释 课时10 参数更新的方法 课时12 反向传播 课时13 神经网络整体框架 课时14 神经网络结构细节 课时15 神经元个数对结果的影响 课时16 正则化与激活函数 课时 ...
- [算法竞赛入门]第二章_循环结构程序设计
第2章 循环结构程序设计 [学习内容相关章节] 2.1for循环 2.2循环结构程序设计 2.3文件操作 2.4小结与习题 [学习目标] (1)掌握for循环的使用方法: (2)掌握while循环的使 ...
- 机试指南第二章-经典入门-查找例题自解
查找: 对于查找问题,有难有易.可能只是直接地对某个数字的查找,也可能涉及搜索等相对难度更大的算法.这里先介绍查找的基础概念和方法. 例 2.9 找 x AC代码: #include<cstri ...
最新文章
- 全球及中国制糖行业销售规模与运营态势研究报告2022版
- linux日志文件备份,LINUX 自动备份程序日志(shell)
- java同时输出多个数字_java从命令行接收多个数字,求和之后输出结果
- ASP.Net学习笔记001--ASP.Net简介1
- linux停止rpc服务,Linux系统安装启动rpc服务,解决Loadrunner监控不到资源问题
- python 卷积神经网络 应用_卷积神经网络在目标定位中的应用
- 如果同时需要两张表,但其中一个表中没有另一个表中的字段,该如何正确使用
- 什么是空号检测api接口?哪些行业会用到?
- 抖音小程序开发教程之 02 创建第一个hello world 小程序(教程含源码)
- codecombat计算机科学入门二(python)
- 黑蚁数据工坊-地理信息行业数据生产全流程管控“工厂”
- 1553B为什么要加耦合器?
- java 不登录购物车_java-没有用户登录时存储购物车(playframework疑问)
- android Wifi热点启动流程,[android]WIFI热点启动流程分析
- [渝粤教育] 西南科技大学 园艺作物高产栽培 在线考试复习资料
- iphone麦克风_如何从iPhone或iPad上的蓝牙麦克风录制音频
- 计算机基本基础知识实训总结,计算机基础实训总结范文
- jenkins自动化_通过Jenkins自动化PSR合规性
- 《Android之大话设计模式》--设计原则 第三章:开放封闭原则 孙悟空任弼马温一职
- 实验20:OSPF多区域配置
热门文章
- 你知道从浏览器发送请求给SpringBoot后端时,是如何准确找到哪个接口的?(下篇)学废了吗?
- php trimmsg,c语言实现php的trim标签
- 免费的FTP linux 服务器中文,linux ftp服务器的搭建和中文字体乱码的解决
- html5 css3 设计模式,html5+css3设计模式
- mysql 创建外键实例_mysql 外键创建实例
- linux网络寻址顺序,51CTO博客-专业IT技术博客创作平台-技术成就梦想
- 北京中考计算机,规则丨2018考生:2017北京中考统招计算机录取规则
- java 2d svg_SVG 2D入门1 - SVG综述
- ue4 classuobject没有成员beginplay_关于UE4使用的一些想法(一)
- 多于2个字符串的拼接,禁止使用“+”,而应该用join