机器学习-决策树(decision tree)

  • 机器学习中分类和预测算法的评估:
  • 准确率
  • 速度
  • 强壮性(算法中当有噪音和某些值缺失时,算法能否依然很好)
  • 可规模性
  • 可解释性(能否很好的解释模型)

一、什么是决策树?

1、判定树(决策树)是一个类似于流程图的树结构,其中,每个内部节点表示在一个属性上的测试,每一个分支代表一个属性输出,而每个树叶结点代表类或类分布。树的最顶层是根结点。
机器学习-决策树(decision tree)
2.决策树是机器学习中分类方法中的一个重要算法
3.熵(entropy)概念:
信息和抽象如何度量?
1948年,香农提出了“信息熵(entropy)”的概念。
一条信息的信息量大小和它的不确定性有直接的关系,要搞清楚一件非常非常不确定的事情,或者是我们一无所知的事情,需要了解大量信息==》信息量的度量等于不确定性的多少。
比特(bit)来衡量信息的多少。
信息熵计算公式:
机器学习-决策树(decision tree)
变量的不确定性越大,熵也就越大。

二、决策树归纳算法(ID3)

选择属性判断结点
信息获取量/信息增益(Information Gain):
Gain(A) = Info(D) - Infor_A(D)
通过A来作为结点分类获取了多少信息,下图是根据年龄、收入、是否为学生、信用度来判断一个人是否要购买电脑
机器学习-决策树(decision tree)
机器学习-决策树(decision tree)
机器学习-决策树(decision tree)
机器学习-决策树(decision tree)
类似,Gain(income) = 0.029
Gain(student) = 0.151
Gain(credit_rating) = 0.048
所以,由于age属性的信息增益最大,选择age作为第一个根结点。
重复此过程。。。
机器学习-决策树(decision tree)
下面是直接调用sklearn包的代码:

from sklearn.feature_extraction import DictVectorizer#sklearn对数据输入格式有要求,不能是类型的数据,必是整形的数据,所以需要转换
import csv#原始数据存在于csv文件里
from sklearn import preprocessing
from sklearn import tree
from sklearn.externals.six import StringIO

#读取csv文件
allElectronicsData = open(r'D:\data\decisiontree.csv','rt')
reader = csv.reader(allElectronicsData)
#headers = reader.next()#headers指的是特征
headers = next(reader)#headers是csv文件的第一行数据
print(headers)

featureList = []#featureList是特征值,例如年龄、信用度等
labelList = []#labellist是标签值,也就是结果是否买电脑

for row in reader:
    labelList.append(row[len(row) - 1])
    rowDict = {}
    for i in range(1,len(row) - 1):
        rowDict[headers[i]] = row[i]
    featureList.append(rowDict)
print(featureList)

#利用python进行转化
vec = DictVectorizer()
dummyX = vec.fit_transform(featureList).toarray()#特征值的列表,是0,1的列表

print("dummyX:"+str(dummyX))
print(vec.get_feature_names())

print("labellist:"+str(labelList))

lb = preprocessing.LabelBinarizer()
dummyY = lb.fit_transform(labelList)
print("dummyY:"+str(dummyY))

clf = tree.DecisionTreeClassifier(criterion = 'entropy')#不带参数默认是基尼系数
#criterion = ‘entrropy’使用ID3方法
clf = clf.fit(dummyX,dummyY)
print("clf:"+str(clf))

#生成一个dot树,可用dot命令生成pdf文件
with open("allElectronicInformationGainOri.dot",'w') as f:
    f = tree.export_graphviz(clf,feature_names=vec.get_feature_names(),out_file = f)

#oneRowX是拷贝出一条数据,修改一些特征值,来进行测试
oneRowX = dummyX[0,:].reshape(1,-1)
print("oneRowX:"+str(oneRowX))
newRowX = oneRowX


newRowX[0][0] = 1
newRowX[0][2] = 0
print("newRowX:"+str(newRowX))

predictedY = clf.predict(newRowX)
print("predictedY:"+str(predictedY))

下面是decisiontree.csv的内容:
机器学习-决策树(decision tree)
运行结果为:
机器学习-决策树(decision tree)
机器学习-决策树(decision tree)
运行cmd,生成的allElectronicInformationGainOri.dot文件可以用dot生成pdf文件(实现需要安装Graphviz:(http://www.graphviz.org),然后需要配置环境变量,在path中添加)
命令:dot -Tpdf allElectronicInformationGainOri.dot -o test.pdf
结果为:
机器学习-决策树(decision tree)