在机器学习中,监督分类(自己先选定好特征参数)有朴素贝叶斯,支持向量机SVM,还有决策树。对于前两个,可以看下面两篇文章复习:
决策树,听名字就知道很简单,所以这个算法我也是非常简单的过一下
构建决策树 Decision Trees
下图的样本,通过决策树,要进行三次分割
代码是十分简单
#导入模块
from sklearn import tree
X = [[0, 0], [1, 1]]
Y = [0, 1]
#创建分类器,进行拟合
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, Y)
用决策树拟合出来的决策面是小锯齿形的,如下图这样
决策树参数
1.min_samples_split 当前节点允许分裂的最小样本数
也就是根节点的样本数小于这个值的时候就不用再分裂了,例如下图
当min_samples_split=2时,最右边的值为1的根节点不需要再分裂,其他均需再分裂
当min_samples_split=41时,所有根节点都不需要再分裂
2.entropy 熵 一系列样本中的不纯度的测量值
例如再无人车驾驶时,蓝色为加速,红色为减速,第一幅图是地面坡度与颠簸程度,第二幅图是地面坡度与速度限制,很明显,第二幅图的纯度更高
熵的公式:
H ( X ) = − ∑ i = 1 n p ( x i ) l o g 2 p ( x i ) H(X)=-\sum_{i=1}^np(x_{i})log_{2}p(x_{i}) H(X)=−i=1∑np(xi)log2p(xi)
其中
p
(
x
i
)
p(x_{i})
p(xi)
是第i类中的样本占总样本数的比例
如果所有的样本都属于同一类(class),那么熵的值为0,如果所有的样本都是均匀分布在所有的类中,那么熵的值为1
3.Information Gain 信息增益:父节点的熵减去子节点的熵的加权平均
我们来看一个例子:
坡度 | 颠簸 | 限速 | 速度 |
---|---|---|---|
陡 | 颠簸 | 限 | 慢 |
陡 | 平滑 | 限 | 慢 |
缓 | 颠簸 | 不限 | 快 |
陡 | 平滑 | 不限 | 快 |
现在有一个父节点是:慢慢快快,熵为1
我们按照坡度来进行划分,得到两个子节点,一个是“慢慢快”,一个是“快”
右边的“慢"结点的熵为:0
左边的”慢慢快“的熵为:0.9183(其中P(慢)=2/3, P(快)=1/3)
如果计算有困难,可以直接在Python IDLE里面计算:
import scipy.stats
print scipy.stats.entropy([2,1],base=2)
那么信息增熵(坡度)=父节点的熵减去子节点的熵的加权平均=1-1/4(3×0.9183+1×0)=0.3112
同样的方法,得到
信息增熵(颠簸)=0
信息增熵(限速)=1
因此限速就是我们应该划分的变量
OK,这就是决策树的全部,其实决策树理解起来非常简单,而熵和信息增熵是其中比较难的点,不过没关系,相信你这么聪明,一定看得懂的啦~
更多的文章,请看: