机器学习笔记----- ID3算法的python实战
本文申明:本文原创,如有转载请申明。数据代码来自实验数据都是来自【美】Peter Harrington 写的《Machine Learning in Action》这本书,侵删。
Hello,又和大家见面了,今天心情出奇的好,不知道为什么。就是好。。。此处省略一万字。。。上一次和大家说了,决策树的理论部分,今天我们就来动手帮助眼科医生做一个系统,让这个系统学会给需要隐形眼睛的用户一个建议,让用户可以知道自己适合哪种眼睛。老规矩,系统先从数据中学习。
一:计算给定数据集的香浓熵
大家还记得我们上一讲中求信息增益的公式: ,首先我们求H(D),H(D)为数据D的经验熵,公式为: .求这个公式的代码如下:

熵越高,那么混合的数据也就越多。反之亦然。再一次推荐吴军大神的《数据之美》。通过代码发现,语言真的只是一门工具。JAVA python 都是我们奴隶。不对吗?所以我们并不需要怕我们奴隶,我们只要了解他,征服他就可以了。
二:划分数据集
假如一个魔鬼,把你女神捉去了。魔鬼给你出一道题,让你把包含黑色豆子白色豆子红色豆子的三种豆子按照颜色不同分开,白的和白的在一起,黑的在一起,红的在一起。这是不是很简单,其实划分数据集也是这么简单。看数据中的某一特征项,然后,把这个项中相同的一项放在一起,不同的分开。这就是划分数据集。代码如下:

三:选择最好的划分数据集的方式
你划分了数据集,但是却不知道,你划分的数据集是不是最好的划分,大家都知道ID3算法的核心部分是根据信息增益来判断这样划分好不好。划好了第一个其他就递归下就可以了。代码如下:

其实,上面的一二三部分就是求我们的信息增益比公式。那么接下来就是构造一个决策树,然后在把多余的树枝给裁剪了,不就行了么?哈哈,听着简单吧,其实就很简单.
四:构建一个决策树
1:多数表决
其实有时候,特征数目并不是在每次划分数据分组的时候都减少,所以我们要在算法开始运行前计算列的数目,让我们知道算法是否使用了所有属性就可以了。如果数据集已经处理了所有属性。但是类标签依然不是唯一的,那么我们需要决定如何定义该叶子阶段。那个我们该如何定义叶子节点呢?
仔细想想这个是不是一个小型的分类问题,既然是分类问题,那么我们是不是可以用上一张说的KNN算法中的多数表决的方法。(多数表决的方法,就好像我们的民主投票,天朝嘛,你懂得。。这个我倒是对美国的民主大选颇赞同)。
多数表决代码如下:

KNN代码如下:

大家可以比较一下,是不是很像。
2:创建树
上面我们已经说过,第一次判定之后,我们只需要递归地调用判定函数就可以了。
递归结束的两个判定条件为:
1:所有的类标签完全相同,返回类标签(这不是废话么,都一样了,还分毛的类)
2:使用完了所有的分组还是不能将数据集划分成仅包含唯一类别的分组,既然无法返回唯一的,那么我们就被代表一波吧。就是我们上文的多数表决机制,返回出现次数最多的类别。这不就是人民代表大会制度吗, 。
代码如下:

大家有看不懂的可以私聊我,我帮你解答。
现在我们来测试一下,测试结果如下:

咦,似乎挺好用的样子。。。
五.使用决策树预测隐形眼镜类型
(1)收集数据
(2)准备数据
(3)分析数据
(4)训练数据
(5)测试数据
(6)使用算法
这六个步骤是我们研究机器学习必须经过的六个步骤,大家一定要牢记。
隐形眼镜的测试数据结果:


链接:http://pan.baidu.com/s/1bpolbBL 密码:mzjj 这个是这个实验的源代码。适合2.7版本的Python环境,请用3.x的童鞋,根据新特性修改。
机器学习笔记----- ID3算法的python实战的更多相关文章
- 机器学习之决策树(ID3)算法与Python实现
机器学习之决策树(ID3)算法与Python实现 机器学习中,决策树是一个预测模型:他代表的是对象属性与对象值之间的一种映射关系.树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每 ...
- python机器学习笔记 ID3决策树算法实战
前面学习了决策树的算法原理,这里继续对代码进行深入学习,并掌握ID3的算法实践过程. ID3算法是一种贪心算法,用来构造决策树,ID3算法起源于概念学习系统(CLS),以信息熵的下降速度为选取测试属性 ...
- 机器学习决策树ID3算法,手把手教你用Python实现
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第21篇文章,我们一起来看一个新的模型--决策树. 决策树的定义 决策树是我本人非常喜欢的机器学习模型,非常直观容易理解 ...
- 决策树之ID3算法实现(python)
决策树的概念其实不难理解,下面一张图是某女生相亲时用到的决策树: 基本上可以理解为:一堆数据,附带若干属性,每一条记录最后都有一个分类(见或者不见),然后根据每种属性可以进行划分(比如年龄是>3 ...
- 李宏毅机器学习课程笔记-2.5线性回归Python实战
本文为作者学习李宏毅机器学习课程时参照样例完成homework1的记录. 任务描述(Task Description) 现在有某地空气质量的观测数据,请使用线性回归拟合数据,预测PM2.5. 数据集描 ...
- 机器学习笔记--KNN算法2-实战部分
本文申明:本系列的所有实验数据都是来自[美]Peter Harrington 写的<Machine Learning in Action>这本书,侵删. 一案例导入:玛利亚小姐最近寂寞了, ...
- [置顶] ID3算法的python实现
这篇文章的内容接着http://blog.csdn.net/xueyunf/article/details/9214727的内容,所有还有部分函数在http://blog.csdn.net/xueyu ...
- 机器学习笔记—svm算法(上)
本文申明:本文原创,如转载请注明原文出处. 引言:上一篇我们讲到了logistic回归,今天我们来说一说与其很相似的svm算法,当然问题的讨论还是在线性可分的基础下讨论的. 很多人说svm是目前最好的 ...
- 机器学习笔记--KNN算法1
前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的狐朋狗友算法---KNN算法,为什么叫狐朋狗友算法呢,在这里我先卖个关子,且听我慢慢道来. 一 K ...
随机推荐
- ALinq Dynamic 使用指南——慨述(上)
一.使用 1.程序集与命名空间的引用使用 ALinq Dynamic,你需要引用ALinq.Dynamic.dll(ALinq用户)或者System.Data.Linq.Dynamic.dll (Li ...
- FlashFXP|FTP
经典的FTP传输工具FlashFxp,留作几年吧!看和曾经用的软件代表着岁月的流逝和时间的推进性! 洒脱度过生活中的每一天.每一分钟,Mvpbang追随一生! 压缩包中有秘钥文件-flashfxp.k ...
- C++的异常处理之一:throw是个一无是处的东西
看这篇文章学习C++异常处理的基础知识.看完后,还不过瘾,为什么大家在C++代码中都不用Exception?为什么C++11会引入一些变化? 为什么C++ exception handling需要un ...
- java中的集合和数组
数组Array和集合的区别: (1)数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型) (2)JAVA集合可以存储和操作数目不固定的一组数据. (3)若程序时不知道究竟需要多 ...
- android 监听短信并发送到服务器
1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. 2. 应用观察者模式,监听短信数据库,操作短信内容. 实例如下: SystemE ...
- Redis集群(六):集群常用命令及说明
一.本文目的 介绍集群的基本情况及常用命令 二.集群的特点 3.集群优缺点 三.集群客户端命令(redis-cli -c -p port) 集群cluster info ...
- Entity Framework Code First (五)Fluent API - 配置关系
上一篇文章我们讲解了如何用 Fluent API 来配置/映射属性和类型,本文将把重点放在其是如何配置关系的. 文中所使用代码如下 public class Student { public int ...
- 哈希 poj 1480
计算可能的数目 a3*x3^3+a4*x4^3+a5*x5^5=-(a1*x1^3+a2*x2^3); 列举右边的 结果存到数组 z[i] 和为i的右边等式的数目 如果和小于0 +2500000 ...
- 区间DP lightoj 1031
在此游戏中任意时刻的状态都是原始序列的一段子序列故: 定义d(i, j) : 表示原来序列的第i ~ j个元素组成的子序列,在双方都采取最优策略的情况下,先手得分的最大值. 状态转移时,需要枚举从左边 ...
- win10 google浏览器设置
在浏览器地址栏中输入命令: chrome://flags/ 撤销:chrome设置了禁止此页弹出提示框 chrome://settings/contentExceptions#popups