学习了机器学习中的决策树算法,总结一下自己的理解,以此加深印象~~
1、决策树算法
决策树算法最关键的就是决策树的训练(树的构造过程),而树的创建最关键的是特征的选择,应该将最’关键‘的特征放在树的根的位置,越’关键‘的特征离树根越近(越优先判断),而特征的’关键‘要根据熵和信息增益来判断,如果选择一个特征A,将数据集进行划分之后(分成多个分支(子集)),熵减小最大(数据无序性减少的最多),信息增益最大,那么就应该先判断该特征A。
创建树(训练)的过程是:先选择最好的特征将数据集划分成几个分支(要看该特征有几个取值),然后依次判断每个分支,每个分支有两种情况,一种是该分支的所有数据集都属于同一类,那么该分支不需处理,返回该分支的类标签;另一种情况是该分支的样本属于不同的类,那么就递归,在该子集中选取最好的特征,将数据集划分,然后依次判断......进行如此操作,直到所有的分支都只属于同一类。(可能,有的数据集直到最后一个特征使用(判断)完毕之后,某个分支仍然还不属于一类,那么此时,如果是测试集的数据判断到此处,则返回该分支中出现最多次数的类),然后,将该特征判断过程保存到一个树(Python中的字典结构)中,以便进行测试。
创建树一般流程:
createBatch(){
if 已经属于同一类:
return 类标签
else {
寻找划分数据及最好的特征
利用该特征将数据集划分成为不同的分支
for 该特征点的每个分支:
createBatch()
return 分支节点
测试: 从测试集中取第一个测试样本,然后设计算法与训练创建的决策树比较,首先取第一个特征,看该测试样本的该特征的取值是多少,然后找到对应的取值,如果返回的是类,则停止,否则继续判断第二个特征...
实例:dicisiontree_dict
= {'no surfacing': {0: 'no', 1: {'flapper': {0: 'no', 1: 'yes'}}}}
feature_index = [0,1] #'no surfacing':0 ; flapper:1
test_sample = [1,0]
先由第一个特征'no surfacing',它的索引号是0,找到测试样本的第0个取值是1,于是找到该特征取值’1‘对应的分支==》{1: {'flapper': {0: 'no', 1: 'yes'}},仍然是一个字典,于是继续判断特征‘flapper',它的索引号是1,找到测试样本的第1个取值是0,于是找到该特征取值为’0‘对应的分支==》{0:
'no'},属于类’no‘,于是返回该特征所属类’no‘。
2、决策树具体实现
准备:(1)数据集
形如:dataSet
=
[[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]
其中每个list的最后一个元素是该sample的类标签。
(2)熵的计算
熵:度量数据中的不确定因素(信息),度量数据无序的程度 (熵越大,越不确定,数据越无序)
信息增益:熵的减少,数据无序度的减少
(3)划分数据集
根据特征和特征的某个值来划分数据集,形成决策树的一个分支;(同一个特征,如果取值有多个,要分别处理)。
决策树方法
(1)根据训练集的特征和类标签创建一棵决策树;(python 可以用一个字典结构来存储,如:{'no surfacing': {0: 'no', 1: {'flapper': {0: 'no', 1: 'yes'}}}},其结构就是决策的整个过程)
* 决策树的创建应该将能够最大程度降低数据的无序性的特征放在靠近树的根的位置(即:将越是关键的特征越先判断),而量化数据的无序性的(不无额定性)要用熵;
* 因此,先求得最初的整个原始(不确定的,无序的)数据集的熵,然后,求利用每个特征划分数据集,并分别求该(每个)特征划分数据集后的信息增益(数据无序度的减少的大小),然后按照信息增益选最大(关键)的作为当前最好的特征。先找最好的特征,然后利用该特征将数据集划分成多个分支,然后判断,如果该子分支属于同一类,则返回该类,否则递归,选择该分支内最好的特征继续划分该数据子集......
(2)将拿测试集的每个测试样本进行分类,按照树的结构来设计分类过程(就是决策树的判断流程)
为了加深印象,比较啰嗦~~如有问题,欢迎指正~~