目录
1.概述
2.决策树的优缺点:
2.1.决策树的优点:
2.2.决策树的缺点:
3.决策树算法模型
3.1.特征选择的准则
3.2.树的生成
3.3.树的剪枝
4.决策树在sklearn中的类
4.1.分类
4.2.回归
5.书本案例sklearn实现
决策树是一种用来分类和回归的无参监督学习方法,其目的是创建一种模型从数据特征中简单的决策规则来预测一个目标变量的值;
决策树的宗旨在于构建一个与训练数据集你和比较好的模型,同时保证模型的复杂度比较小;
决策树学习算法包括3部分:特征的选择、树的生成和树的剪枝。
熵值只与X的分布有关,与X的取值无关。
随机变量(X,Y)的联合概率分布为:
条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性:
经验熵, 经验条件熵
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件熵分别称为经验熵和经验条件熵就是从已知 的数据计算得到的结果。
特征A对训练数据集D的信息增益g(D|A),定义为集合D的经验熵H(D)与特征A给定的条件下D的经验条件熵H(D|A)之差:
熵与条件熵的差称为互信息.
决策树中的信息增益等价于训练数据集中的类与特征的互信息。
考虑ID这种特征, 本身是唯一的。按照ID做划分, 得到的经验条件熵为0, 会得到最大的信息增益。所以, 按照信息增益的准则来选择特征, 可能会倾向于取值比较多的特征。
ID3算法:
输入:训练数据集D, 特征集A,阈值
输出:决策树T
算法流程:
输入:训练数据集D, 特征集A,阈值
输出:决策树T
算法流程:
输入:训练数据集D
输出:回归树f(x)
算法流程:
遍历变量j,对固定的切分变量j扫描切分点s,得到满足上面关系的(j,s):
用选定的$(j,s)$, 划分区域并决定相应的输出值 :
对两个子区域调用(1)(2)步骤, 直至满足停止条件
将输入空间划分为M个区域,生成决策树:
决策树损失函数:
树T的叶结点个数为|T|,t是树T的叶结点,该结点有个样本点,其中k类的样本点有个,为叶结点$t$上的经验熵,为参数,决策树学习的损失函数可以定义为:
这时有:
其中C(T)表示模型对训练数据的误差,|T|表示模型复杂度,参数控制两者之间的影响。
熵与概率的关系:
输入:生成算法生成的整个树T,参数
输出:修剪后的子树
算法流程:
DecisionTreeClassifier
:
能够在数据集上进行二分类也可以进行多分类,同其他训练方法一样,fit(x,y)既是训练模型,predict(x_test)既是预测的过程返回分类预测的结果;
DecisionTreeRegressor:
用来解决回归问题。在分类设置中,拟合方法将数组X和数组y作为参数,只有在这种情况下,y数组预期才是浮点值;同其他训练方法一样,fit(x,y)既是训练回归模型,predict(x_test)既是预测的过程返回回归预测的结果。
from sklearn.tree import DecisionTreeClassifier
from sklearn.externals.six import StringIO
import pydot
from sklearn import tree
import numpy as np
import matplotlib.pyplot as plt
def dataset():
train_data = np.array([[1, 0, 0, 0],
[1, 0, 0, 1],
[1, 1, 0, 1],
[1, 1, 1, 0],
[1, 0, 0, 0],
[2, 0, 0, 0],
[2, 0, 0, 1],
[2, 1, 1, 1],
[2, 0, 1, 2],
[2, 0, 1, 2],
[3, 0, 1, 2],
[3, 0, 1, 1],
[3, 1, 0, 1],
[3, 1, 0, 2],
[3, 0, 0, 0]])
train_label = np.array([0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0])
return train_data, train_label.reshape((-1, 1))
def main(train_data, label_data, test_data):
dec_model = DecisionTreeClassifier()
dec_model.fit(train_data, label_data)
pred = dec_model.predict(test_data)
dot_data = StringIO()
tree.export_graphviz(dec_model, out_file=dot_data)
graph = pydot.graph_from_dot_data(dot_data.getvalue())
graph[0].write_dot('DecisionTree.dot')
graph[0].write_png('DecisionTree.png')
print(pred)
return pred
# A={青年=1,否=0,是=1,一般=0}
# 输出:1=是,0=否
train_data, train_label = dataset()
test_data = np.array([[1, 0, 1, 0], [2, 1, 0, 1], [3, 0, 1, 0]])
print(train_data.shape, train_label.shape, test_data.shape)
pred = main(train_data, train_label, test_data)
参考:
1.https://github.com/SmirkCao/Lihang/blob/master/CH05/README.md
2.《统计学习方法》 李航
3.http://sklearn.apachecn.org/#/