本文申明:本文原创,如有转载请申明。数据代码来自实验数据都是来自【美】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的童鞋,根据新特性修改。