DecisionTreeClassifier决策分类树详解(sklearn),并利用红酒数据集进行分类(0基础也能学会,超级详细)

        决策树(DTs)是一种用于分类和回归的非参数监督学习方法。目标是创建一个模型,通过学习从数据特征推断出的简单决策规则来预测目标变量的值。树可以看作是一个分段常数近似。

         在本文,我们将会简单的阐述决策分类树的原理,以及如何利用sklearn库完成一个简单的案例。

        注:文章为自己总结,水平有限,若有错误与疑问,欢迎交流~

        代码已开源在Github中sklearn仓库,Email:yuhan.huang@whu.edu.cn

 

DecisionTree

概述

        这里的内容是对于youtube博主statQuest内容的总结,并不会深入的研究数学原理(因为sklearn封装的很好,我们主要在于应用),原视频链接:statQuest:决策分类树

        形象地说,我们可以以如下的树状结构来进行表示:

19ad525997394fcea635cee8bafaafe8.png

        在分类任务中,我们通常要对于多个内容进行分类,因此,我们需要经历上图的过程,对于一个数据进行判断,在A>B这个条件下,分类成两个结点...再以此重复进行,直至无法继续。

        上面的图只是一个整体思路,接下来,我们利用实际案例进行说明(注意条件修改了,这个长颈鹿和豹子也要交换一下,因为找的案例图不是很好):

8e121cb0568448eab26697379d516708.png

        在这里,我们利用决策树对于动物进行分类,我们先对于颜色进行判断,把颜色为黄色的动物样本放在一类中,非黄色的动物放在另一类中。与此同时,再通过高度等条件进行判断,得到最终结果。

        Gini Impurity(基尼不纯度)

        光看前面的图片,有的同学或许会产生疑惑? 既然我有颜色,高度,那么我怎么知道第一个决策判断是根据颜色还是高度?决策的选择有没有什么依据?这个时候我们就要引出gini impurity了,这是我们在决策束中常用的一种计算错误(衡量分裂质量)的方法,同样的还有Entropy(熵)、Log Loss(对数损失)。计算方法为:

eq?Gini%20%3D%201%20-%20%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%20p_i%5E2

eq?Entropy%20%3D%20-%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%20p_i%20%5Clog_2%28p_i%29

eq?Log%5C%20Loss%20%3D%20-%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%20p_i%20%5Clog%28p_i%29

        其中pi表示的是样本分类为某一类的概率。接下来我会告诉大家如何利用基尼不纯度进行决策树的生成。

        参考上面的图片,我们拥有2头长颈鹿(黄色, 高度大于10)、两只豹子(黄色,高度小于10),1头大象(非黄色,高度大于10),1只猴子(非黄色,高度小于10)。那么我们则对于两个特征都进行分类并进行gini系数的计算,选择gini系数较低的结果。

        以黄色为例,我们会分类得到 (2长颈鹿, 2豹子) + (1大象, 1猴子)的结果,在计算Giniyellow过程中,p1和p2皆为1/2。其余计算也是相同 

eq?Gini_%7B%5Ctext%7Byellow%7D%7D%20%3D%201%20-%20%5Cleft%28%5Cleft%28%5Cfrac%7B2%7D%7B4%7D%5Cright%29%5E2%20+%20%5Cleft%28%5Cfrac%7B2%7D%7B4%7D%5Cright%29%5E2%5Cright%29%20%3D%200.5%20%5C%5C%20Gini_%7B%5Ctext%7Bnon-yellow%7D%7D%20%3D%201%20-%20%5Cleft%28%5Cleft%28%5Cfrac%7B1%7D%7B2%7D%5Cright%29%5E2%20+%20%5Cleft%28%5Cfrac%7B1%7D%7B2%7D%5Cright%29%5E2%5Cright%29%20%3D%200.5%20%5C%5C%20Gini_%7B%5Ctext%7Bcolor%7D%7D%20%3D%20%5Cleft%28%5Cfrac%7B4%7D%7B6%7D%5Cright%29%20Gini_%7B%5Ctext%7Byellow%7D%7D%20+%20%5Cleft%28%5Cfrac%7B2%7D%7B6%7D%5Cright%29%20Gini_%7B%5Ctext%7Bnon-yellow%7D%7D%20%3D%20%5Cfrac%7B1%7D%7B2%7D

eq?Gini_%7B%5Cleq%2010%7D%20%3D%201%20-%20%5Cleft%28%5Cleft%28%5Cfrac%7B2%7D%7B4%7D%5Cright%29%5E2%20+%20%5Cleft%28%5Cfrac%7B2%7D%7B4%7D%5Cright%29%5E2%5Cright%29%20%3D%200.5%20%5C%5C%20Gini_%7B%3E%2010%7D%20%3D%201%20-%20%5Cleft%28%5Cleft%28%5Cfrac%7B1%7D%7B2%7D%5Cright%29%5E2%20+%20%5Cleft%28%5Cfrac%7B1%7D%7B2%7D%5Cright%29%5E2%5Cright%29%20%3D%200.5%20%5C%5C%20Gini_%7B%5Ctext%7Bheight%7D%7D%20%3D%20%5Cleft%28%5Cfrac%7B4%7D%7B6%7D%5Cright%29%20Gini_%7B%5Cleq%2010%7D%20+%20%5Cleft%28%5Cfrac%7B2%7D%7B6%7D%5Cright%29%20Gini_%7B%3E%2010%7D%20%3D%20%5Cfrac%7B1%7D%7B2%7D

        所以,在这个案例中,两个gini系数是一样的,我们先选择哪个特征都可以,注意,数据不同,决策树的生成也会有随机性。这个系数在sklearn函数中以参数的形式出现,我们不需要计算,只需要选择使用哪一个就行。

(这个GINI系数计算我也不是很确定,但是思路是这样肯定没有问题,我们也不需要自己计算,欢迎大家指正讨论)

 

红酒数据集进行决策树分类(建议查看我Github中ipynb文件,中间过程更详细)

 

首先我们导入需要的包:

import sklearn
import numpy as py
import pandas as pd
from sklearn import tree
from sklearn import datasets
from sklearn import model_selection

然后读取数据

# load datasets
data = datasets.load_wine()
X, y, features, classes = data.data, data.target, data.feature_names, data.target_names

分割数据集

train_X, test_X, train_y, test_y = model_selection.train_test_split(X, y, test_size=0.33, random_state=42)

进行训练,并可视化决策树,获取特征重要性:

clf = tree.DecisionTreeClassifier(
    criterion='gini',
    splitter='best',
    max_depth=3,
    random_state=42
)
clf = clf.fit(train_X, train_y)
score = clf.score(test_X, test_y)
print(clf.score(train_X, train_y))
print(score)
print(sorted([*zip(features, clf.feature_importances_)], key=lambda f:f[1]))
tree.plot_tree(clf, filled=True, rounded=True, class_names=classes)

得到结果如下:

42e1e726bfaa472f9924ea3ca04f8f28.png

 

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香蕉也是布拉拉

随缘打赏不强求~ 谢谢大家

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值