机器学习入门(十二):决策树——告诉你 Hello Kitty 是人是猫

Hello Kitty 的种族问题

Hello Kitty,一只以无嘴造型40年来风靡全球的萌萌猫,在其40岁生日时,居然被其形象拥有者宣称:Hello Kitty 不是猫!

2014年8月,研究 Hello Kitty 多年的人类学家 Christine R. Yano 在写展品解说时,却被 Hello Kitty 持有商三丽鸥纠正:Hello Kitty 是一个卡通人物,她是一个小女孩,是一位朋友,但她“绝不”是一只猫。

enter image description here

粉了快半个世纪的世界萌猫,你说是人就是人啦?!就算是形象持有者,也没权利下这个定论啊!

谁有权认定 Hello Kitty 是人是猫呢?我们把裁决权交给世界上最公正无私的裁判—— 计算机。让机器来决定。

机器如何具备区分一个形象属于哪个物种的知识呢?让它学习呀!机器是可以学习的。我们用计算机编个程序,再输入一堆数据,等着这个程序运行一个算法来处理这些数据。最后,我们需要的结论就显示在屏幕上啦。就是这么简单!

那么来看看我们需要的数据和算法吧。

训练数据

如下图所示,左边一堆是一群小女孩,右边一堆是一群猫。

enter image description here

特征选取

我们提取七个特征,用来判断一个形象,是人是猫。这七个特征包括:有否蝴蝶结;是否穿衣服;是否高过5个苹果;是否有胡子;是否圆脸;是否有猫耳朵;是否两脚走路。

用一个表格来表现这七个特征则,如下图所示(第一列为 Label,第2至8列为7个特征,每个特征只有两个取值,Yes 或者 No):

enter image description here

<center style="font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; box-sizing: border-box; caret-color: rgb(63, 63, 63); color: rgb(63, 63, 63); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei"; outline: 0px !important;">Table-1</center>

用 ID3 算法构造分类树

本例中,我们选用最简单的 ID3 算法,代入数据进行计算。

(1)根据信息熵的概念,我们先来计算 Entropy(S)。因为总共只有两个类别:人和猫,因此 n==2。

Entropy(S)=−∑ni=1pilog(pi)=−pGirllog(pGirl)−pCatlog(pCat)=−9/17⋅log(9/17)−8/17⋅log(8/17)=0.69

(2)然后我们再分别计算各个特征的:

Entropy(S|T)=∑value(T)|Sv||S|Entropy(Sv)

因为无论哪个特征,都只有两个特征值:Yes 或者 No,因此 value(T) 总共只有两个取值。

下面以“Has a bow”为例来示意其计算过程。

Entropy(S|HasABow)=pYes(−p(Girl|Yes)log(p(Girl|Yes))–p(Cat|Yes)log(p(Cat|Yes)))+pNo(−p(Girl|No)log(p(Girl|No))–p(Cat|No)log(p(Cat|No)))=8/17⋅(−4/8⋅log(4/8)–4/8⋅log(4/8))+9/17⋅(−5/9⋅log(5/9)–4/9⋅log(4/9))=0.69

InformationGain(T)=Entropy(S)−∑value(T)|Sv||S|Entropy(Sv)

依次计算其他几项,得出如下结果:

(3)进一步计算,得出 InfoGain(Has cat ears) 最大,因此“Has cat ears”是第一个分裂节点。

而从这一特征对应的类别也可以看出,所有特征值为 No 的都一定是 Girl;特征值为 Yes,可能是 Girl 也可能是 Cat,那么第一次分裂,我们得出如下结果:

enter image description here

现在“Has cat ears”已经成为了分裂点,则下一步将其排除,用剩下的6个 Feature 继续分裂成树:

enter image description here

<center style="font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; box-sizing: border-box; caret-color: rgb(63, 63, 63); color: rgb(63, 63, 63); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei"; outline: 0px !important;">Table-2</center>

Table-2 为第二次分裂所使用的训练数据,相对于 Table-1,“Has cat ears”列,和前7行对应“Has cat ears”为 No 的数据都已经被移除,剩下部分用于第二次分裂。

如此反复迭代,最后使得7个特征都成为分裂点。

需要注意的是,如果某个特征被选为当前轮的分裂点,但是它在现存数据中只有一个值,另一个值对应的记录为空,则这个时候针对不存在的特征值,将它标记为该特征在所有训练数据中所占比例最大的类型。

对本例而言,当我们将“Wear Clothes”作为分裂点时,会发现该特征只剩下了一个选项——Yes(如下 Table-3 所示)。此时怎么给“Wear Clothes”为 No 的分支做标记呢?

enter image description here

<center style="font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; box-sizing: border-box; caret-color: rgb(63, 63, 63); color: rgb(63, 63, 63); font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei"; outline: 0px !important;">Table-3</center>

这时就要看在 Table-1 中,“Wear Clothes”为 No 的记录中是 Girl 多还是 Cat 多。一目了然,在 Table-1 中这两种记录数量为 0:6,因此“Wear Clothes”为 No 的分支直接标志成 Cat。

根据上述方法,最终我们构建出了如下决策树:

enter image description here

决策树构建过程,如下代码所示:

后剪枝优化决策树

决策树剪枝

剪枝是优化决策树的常用手段。剪枝方法大致可以分为两类:

  1. 先剪枝(局部剪枝):在构造过程中,当某个节点满足剪枝条件,则直接停止此分支的构造;
  2. 后剪枝(全局剪枝):先构造完成完整的决策树,再通过某些条件遍历树进行剪枝。

后剪枝优化 Hello Kitty 树

现在,决策树已经构造完成,所以我们采用后剪枝法,对上面决策树进行修剪。

如图中显示,最后两个分裂点“Has round face”和“Has a bow”存在并无意义——想想也是啊,无论人猫,都有可能是圆脸,也都可以戴蝴蝶结啊。

所以我们遍历所有节点,将没有区分作用的节点删除。完成后,我们的决策树变成了下面这样:

enter image description here

用决策树对 Hello Kitty 进行分类

我们将 Hello Kitty 的特征带入 Cat-Girl 决策树,发现 Hello Kitty:Has cat ears: Yes -> Walk on 2 feet: Yes -> Wear Clothes: Yes -> Has whiskers: Yes -> Less than 5 apples: Yes -> Cat。

Bingo! Hello Kitty 是只猫!这是我们的 ID3 决策树告诉我们的!

代码实现

下面的代码就是用 numpy 和 sklearn 来实现例子中的训练分类树来判断 Hello Kitty 种族所对应的程序。

最后输出为:

[1 1 0 0]

0.75

[0]

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容