决策树采用的是信息熵或者Gini系数来作为分类标准。
信息熵公式:
Gini系数公式:
一般构造一个分类器(sklearn.tree.DecisionTreeClassifier),默认参数criterion有{“gini”, “entropy”}, 其中default=”gini”。这两个计算公式不一样而已。
我在这里计算的是信息熵的公式,另外的一个也都一样,换一个公式而已。
我们在提到概率问题的时候都会有一个前提假设,假设这些变量或者特征都是相互之间没有关系的,就不会存在组合的情况,不然就没办法计算概率了
信息熵它是用来描述信息的紊乱程度,也就是不确定度。当所有数据都是一种类别的时候,他的紊乱度为0,也就是信息熵为0.信息熵可以大于1,通过公式可以看出,这里的log是以2为底。
比如有一组数据(1,1,1,1,0,0,0,0),四个1四个0,他的信息熵是多少?
通过公式我们先计算1出现概率为1/2,那么有 -1/2*(log(1/2)),
再计算0出现概率为1/2,那么有 -1/2*(log(1/2))。接着把他们求和就是-1.这就是这组数的信息熵。
如果是[1,1,1,1,2,2,2,2,3,3,3,3]也是一样的计算方法:
-1/3 * log(1/3) -1/3 * log(1/3) -1/3 * log(1/3)
有几个种类就计算几次,求和即可。
当我们用决策树对数据进行分类的时候,因为他基于CART算法,所以是一个二叉树。
CART(分类树和回归树)与C4.5非常相似,但是区别在于它支持数字目标变量(回归)并且不计算规则集。CART使用在每个节点处产生最大信息增益的特征和阈值构造二叉树。
可以看出我们分类的时候就是找到这个能够有最大信息增益的阈值,最大信息增益就是上一次的信息熵减去分类后的信息熵,也就是找出分类后信息熵最小化的那个阈值。那么怎么找到这个值呢?当然要一个一个试。因为就算是人都不会一眼就看出来,更别说计算机了。
我们一鸢尾花的数据为例,因为这个我们很熟悉
import numpy as np
from sklearn.tree import DecisionTreeClassifier
import sklearn.datasets as datasets
iris = datasets.load_iris()
# 我们使用全部的数据进行计算。因为我们主要不是为了做预测
X = iris["data"]
y = iris["target"]
# 构造分类器,使用entropy,也就是信息熵计算分类
clf = DecisionTreeClassifier(criterion="entropy")
clf.fit(X,y)
这时候其实决策树已经分好了。因为决策树是可以被看见的。我们把他到处到PDF文件。
from sklearn import tree
# graphviz要pip 另外还得去官网下载一个安装文件配一下环境变量
import graphviz
g = tree.export_graphviz(clf,out_file=None,filled=True)