第二章 经典监督学习算法-决策树

一、决策树总体概览

  1. 概念:是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。

  2. 能解决的问题
    –分类问题(较多使用)
    –回归问题

  3. 决策树的种类(主要根据属性划分的依据来进行算法的分类)
    –ID3决策树
    –C4.5决策树
    –CART(Classification And Regression Tree)决策树

  4. 优缺点

二、信息论-信息熵

  1. 随机事件及其信息
    –概念:随机事件是在随机试验中,可能出现也可能不出现,而在大量重复试验中具有某种规律性的事件叫做随机事件
    –信息:对于一个随机变量X,它的每一个可能值的出现都可以看作是一个信息,每当X的一个可能值被观测到,我们称不确定性减少了,即信息增加了

  2. 信息熵
    –概念:是信息增益的数学期望

  3. 热力学中的熵
    –概念:表示系统混乱程度的量度

  4. 最大熵增原则
    –概念:当根据不完整的信息作为依据进行推断时,应该由满足分布限制条件的具有最大熵的概率分布推得
    –推论:对于给定的方差,在任意的随机变量中高斯随机变量的熵最大

三、信息论-交叉熵与KL散度

  1. 联合熵
    –概念:若X,Y是一对离散型随机变量,且联合概率分布为p(x,y),则X,Y的联合熵为:
    –作用:描述了一对随机变量的平均信息量

  2. 条件熵
    –概念:给定随机变量X的情况下,随机变量Y的条件熵为:

  3. 熵的连锁规则

  4. 互信息
    –定义

    –作用:反应的是知道了Y以后X的不确定性的减少量

  5. 相对熵(KL散度)
    –定义

    –推论

  6. 交叉熵(在深度学习中占据重要地位)
    –定义

    –作用:衡量估计出来的概率分布和真实概率分布之间的差异情况

四、属性选择的依据

  1. 决策树的结构及作用
    –叶节点:输出分类结果
    –内部节点:用于属性测试
    –根节点:内节点的一种,位置特殊

  2. 决策树的输入

  3. 根节点的一些特殊情况
    –若训练集中的数据都属于同一类,那么将RootNode标记为该类的叶节点。返回(返回也意味着算法的结束)
    –若属性集为空集,或者训练集中的所有数据的所有属性都相等,那么将RootNode标记为训练集中出现次数最多的类的叶节点,返回

  4. 决策树的一般算法流程

  5. 信息增益
    –计算样本集的信息熵
    –使用特定属性a进行划分的信息增益

    –用法
    A)某个属性的信息增益越大,则使用该属性进行划分所得的“纯度提升”越大
    B)ID3算法使用信息增益作为属性选择的依据
    –缺点
    A)对可取值数目较多的属性有偏好

  6. 增益率
    –定义

    –缺点
    A)对可取值数目较少的属性有偏好
    –缺点的解决办法(C4.5算法):先从属性中找到信息增益高于平均水平的属性,然后再从中选出增益率最高的

  7. 基尼指数
    –样本集的基尼值公式

    –基尼值作用:反映了随机抽取两个样本,其所属的类别不一致的概率
    –属性a的基尼指数定义

    –选择标准:选择基尼指数最小的属性

五、剪枝操作

  1. 决策树中的过拟合
    –概念:决策树的生成过程有时候导致决策树的分支过多(分支过多意味着考虑了过多的边缘情况,边缘情况很多时候由个体差异引起),从而导致过拟合

  2. 验证集
    –概念:决策树在构造的过程中使用验证集进行测试,来决定当前属性是否要进行分裂

  3. 剪枝的定义:将本来为内部节点的节点变成叶节点的过程叫做剪枝

  4. 预剪枝(决策树边生成边进行剪枝操作)
    –操作:在决策树生成过程中,每个节点在划分之前先在验证集上进行一次测试,若当前节点的划分无法提高泛化性能,则不做划分处理,直接将此节点作为叶节点(使得一些分支不能展开,降低了过拟合)

  5. 后剪枝(决策树完全生成之后才开始剪枝,并且是自下向上的进行)

    –优点:树的分支相对于预剪枝较多;泛化性能优于预剪枝
    –缺点:训练时间较长

六、决策树的拓展

  1. 连续值处理
    –连续属性离散化
    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

机器学习理论入门:第二章 经典监督学习算法-决策树相关推荐

  1. 【XLPNet车牌识别算法】第二章 检测部分-算法篇1

    [XLPNet车牌识别算法]第二章 检测部分-算法篇1 1. XLPNet检测算法前言 2. XLPNet检测算法详解 2.1 起源 2.2 算法细节 2.1 算法命名 2.2 数据集 2.3 预备知 ...

  2. webrtc 入门第二章 音视频录制

    webrtc 入门第二章 音视频录制 一.介绍 1.媒体录制原理 ​ 在很多场景中回放音视频资源的需求是非常重要的例如会议,直播授课等.任何媒体形式的表情都可进行录制,如 ,,等.其中内容更加自由用户 ...

  3. 机器学习理论入门:第一章 监督学习与非监督学习介绍

    第一章 监督学习与非监督学习简介 一.机器学习基本概念 概念:研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有 的知识结构使之不断改善自身的性能 输入 基本概念 –特征向量: ...

  4. 第二章kNN分类算法sorted函数

    sorted函数可以用于对列表等临时排序,sort()则是永久排序(python入门到实践P39): 此处要讲解的是机器学习实践第二章遇到的sorted()函数,sorted()其他用法可以参考官网: ...

  5. Java基础入门第二章

    大二学的java,一个假期过去,学的差不多都忘光了,在这里再重学一遍,也算不上重学吧,相当于复习吧.第一章讲的是jdk及开发工具的安装,这里就不多赘述了,废话不多说,我们直接从第二章开始. 2.1Ja ...

  6. WPF编程基础入门 ——— 第二章 XAML

    XAML 简述 XAML(eXtensible Application Markup Language,可扩展应用程序标记语言)是微软公司创建的一种新的描述性语言,用于搭建应用程序用户界面.XAML实 ...

  7. TYD深度学习入门 第二章

    目录 课时9 梯度下降通俗解释 课时10 参数更新的方法 课时12 反向传播 课时13 神经网络整体框架 课时14 神经网络结构细节 课时15 神经元个数对结果的影响 课时16 正则化与激活函数 课时 ...

  8. [算法竞赛入门]第二章_循环结构程序设计

    第2章 循环结构程序设计 [学习内容相关章节] 2.1for循环 2.2循环结构程序设计 2.3文件操作 2.4小结与习题 [学习目标] (1)掌握for循环的使用方法: (2)掌握while循环的使 ...

  9. 机试指南第二章-经典入门-查找例题自解

    查找: 对于查找问题,有难有易.可能只是直接地对某个数字的查找,也可能涉及搜索等相对难度更大的算法.这里先介绍查找的基础概念和方法. 例 2.9 找 x AC代码: #include<cstri ...

最新文章

  1. 全球及中国制糖行业销售规模与运营态势研究报告2022版
  2. linux日志文件备份,LINUX 自动备份程序日志(shell)
  3. java同时输出多个数字_java从命令行接收多个数字,求和之后输出结果
  4. ASP.Net学习笔记001--ASP.Net简介1
  5. linux停止rpc服务,Linux系统安装启动rpc服务,解决Loadrunner监控不到资源问题
  6. python 卷积神经网络 应用_卷积神经网络在目标定位中的应用
  7. 如果同时需要两张表,但其中一个表中没有另一个表中的字段,该如何正确使用
  8. 什么是空号检测api接口?哪些行业会用到?
  9. 抖音小程序开发教程之 02 创建第一个hello world 小程序(教程含源码)
  10. codecombat计算机科学入门二(python)
  11. 黑蚁数据工坊-地理信息行业数据生产全流程管控“工厂”
  12. 1553B为什么要加耦合器?
  13. java 不登录购物车_java-没有用户登录时存储购物车(playframework疑问)
  14. android Wifi热点启动流程,[android]WIFI热点启动流程分析
  15. [渝粤教育] 西南科技大学 园艺作物高产栽培 在线考试复习资料
  16. iphone麦克风_如何从iPhone或iPad上的蓝牙麦克风录制音频
  17. 计算机基本基础知识实训总结,计算机基础实训总结范文
  18. jenkins自动化_通过Jenkins自动化PSR合规性
  19. 《Android之大话设计模式》--设计原则 第三章:开放封闭原则 孙悟空任弼马温一职
  20. 实验20:OSPF多区域配置

热门文章

  1. 你知道从浏览器发送请求给SpringBoot后端时,是如何准确找到哪个接口的?(下篇)学废了吗?
  2. php trimmsg,c语言实现php的trim标签
  3. 免费的FTP linux 服务器中文,linux ftp服务器的搭建和中文字体乱码的解决
  4. html5 css3 设计模式,html5+css3设计模式
  5. mysql 创建外键实例_mysql 外键创建实例
  6. linux网络寻址顺序,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  7. 北京中考计算机,规则丨2018考生:2017北京中考统招计算机录取规则
  8. java 2d svg_SVG 2D入门1 - SVG综述
  9. ue4 classuobject没有成员beginplay_关于UE4使用的一些想法(一)
  10. 多于2个字符串的拼接,禁止使用“+”,而应该用join