在这里,我想以更直观的方式帮助各位理解、掌握并且运用【注意:是运用 】决策树,从而为机器学习作铺垫。
PS:但还是希望大家稍微知道决策树大概是什么样子。
一、简单概念
1.根结点(root node):没有入边,但有零条或多条出边
2.内部结点(internal node):恰有一条入边和 两条或多条出边
3.叶结点(leaf node): 恰有一条入边,无出边
4.熵(entropy):这个不太容易解释。首先,一条信息的信息量大小和它的不确定性有直接的关系,要搞清楚一件非常非常不确定的事,需要了解大量信息。所以,信息量的度量就等于不确定性的多少。而不确定性越大,则熵也就越大。
熵的计算公式为:(后面会很重要)
这里:P表示概率。后面会以计算的形式来阐述怎么使用。
二、选择属性判断结点
决策树是由一个一个结点组成的,结点其实就是判断条件。但条件众多,选择哪个条件为根结点,哪些条件为内部结点,需要根据信息获取量(Info Gain)来计算。
公式:Gain(A) = Info(D) - Info_A[D];通过A作为结点分类获取了多少信息。
D:数据集。
先看一组数据:
14个样本,9个buy。4个不buy。可以得到整个数据集的熵。
然后计算以age为根结点的熵。其中5个youth,4个mid,5个senior。根据公式计算熵。
然后计算Info Gain。
计算完后,分别以其他属性为根节点的熵。最终确定age为根结点。然后不考虑age,在下个结点中用同样方法选取。
只要结点设置好了,其实决策树就差不多完成了。
三、代码实现决策树算法
# -*- coding: utf-8 -*-
'''
@author: mckee
'''
import csv
from sklearn.feature_extraction import DictVectorizer
from sklearn import tree
if __name__ == '__main__':
attributeList = []
labelList = []
#首先上面表中信息存储与csv文件中,所以需要读取出来
handle = csv.reader(open('data.csv'))
n = 0
for line in handle:
if n == 0:
attribute = line #第一行就是属性名称
else:
if line[-1] == 'yes':
labelList.append(1)
else:
labelList.append(0)#然后确定分类label,买就是1,不买就是0
feature = {}
feature[attribute[1]] = line[1]
feature[attribute[2]] = line[2]
feature[attribute[3]] = line[3]
feature[attribute[4]] = line[4]
attributeList.append(feature)#之后,将每行信息以dict形式保存与list中
n = n+1
vec = DictVectorizer()
feature_Matrix = vec.fit_transform(attributeList).toarray()#因为属性中的值都是string,所以需要转化为0,1.例:一个年轻人:老中青的value就是[0 0 1].
describe = ['middle_aged','senior','youth','excellent','fair','high','low','medium','no','yes']#这是对上面生成的矩阵每列含义进行描述,便于理解
print feature_Matrix
print describe
print labelList
classifier = tree.DecisionTreeClassifier(criterion='entropy')
print classifier #分类器的默认参数
classifier = classifier.fit(feature_Matrix,labelList)
handle1 = open('decisionTREE.txt','w')
handle1 = tree.export_graphviz(classifier,feature_names = vec.get_feature_names(),out_file=handle1)#将生成的决策树输出
#决策树建立好,就可以对第三方测试集进行测试。
test = feature_Matrix[2]
predict = classifier.predict(test)
print predict
生成的决策树为:
为了更直观理解,我动手画了一下。
四、决策树优缺点
1.优点:直观、便于理解,小规模数据集有效
2.缺点:(1)处理连续变量不好,比如income,需要设置阈值进行离散化eg:>10K , <20K,>20K
(2)类别较多时,错误增加比较快
(3) 可规模性一般
五、附
上传一下自己的笔记,以后自己回顾也更方便