决策树(DTs)是一种用于分类和回归的非参数监督学习方法。目标是创建一个模型,通过学习从数据特征推断出的简单决策规则来预测目标变量的值。树可以看作是一个分段常数近似。
在本文,我们将会简单的阐述决策分类树的原理,以及如何利用sklearn库完成一个简单的案例。
注:文章为自己总结,水平有限,若有错误与疑问,欢迎交流~
代码已开源在Github中sklearn仓库,Email:yuhan.huang@whu.edu.cn
DecisionTree
概述
这里的内容是对于youtube博主statQuest内容的总结,并不会深入的研究数学原理(因为sklearn封装的很好,我们主要在于应用),原视频链接:statQuest:决策分类树。
形象地说,我们可以以如下的树状结构来进行表示:
在分类任务中,我们通常要对于多个内容进行分类,因此,我们需要经历上图的过程,对于一个数据进行判断,在A>B这个条件下,分类成两个结点...再以此重复进行,直至无法继续。
上面的图只是一个整体思路,接下来,我们利用实际案例进行说明(注意条件修改了,这个长颈鹿和豹子也要交换一下,因为找的案例图不是很好):
在这里,我们利用决策树对于动物进行分类,我们先对于颜色进行判断,把颜色为黄色的动物样本放在一类中,非黄色的动物放在另一类中。与此同时,再通过高度等条件进行判断,得到最终结果。
Gini Impurity(基尼不纯度)
光看前面的图片,有的同学或许会产生疑惑? 既然我有颜色,高度,那么我怎么知道第一个决策判断是根据颜色还是高度?决策的选择有没有什么依据?这个时候我们就要引出gini impurity了,这是我们在决策束中常用的一种计算错误(衡量分裂质量)的方法,同样的还有Entropy(熵)、Log Loss(对数损失)。计算方法为:
其中pi表示的是样本分类为某一类的概率。接下来我会告诉大家如何利用基尼不纯度进行决策树的生成。
参考上面的图片,我们拥有2头长颈鹿(黄色, 高度大于10)、两只豹子(黄色,高度小于10),1头大象(非黄色,高度大于10),1只猴子(非黄色,高度小于10)。那么我们则对于两个特征都进行分类并进行gini系数的计算,选择gini系数较低的结果。
以黄色为例,我们会分类得到 (2长颈鹿, 2豹子) + (1大象, 1猴子)的结果,在计算Giniyellow过程中,p1和p2皆为1/2。其余计算也是相同
所以,在这个案例中,两个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)
得到结果如下: