什么是决策树(判定树)
判定树是一个类似于流程图的树结构:其中,每个内部结点表示在一个属性上的测试,每个分支代表一个属性输出,而每个树叶结点代表类或类分布。树的最顶层是根结点。
简单的说,就是每一个节点进行判断。
熵
一条信息的信息量大小和它的不确定性有直接的关系,要搞清楚一件非常非常不确定的事情,或者是我们一无所知的事情,需要了解大量信息==>信息量的度量就等于不确定性的多少
如何 选择属性判断结点
有很多标准,这里以决策树归纳算法(ID3)为例,他的标准为
信息获取量(Information Gain):Gain(A) = Info(D) - Info_A(D)
举例如何计算(是否购买电脑):
决策树的优点:
直观,便于理解,小规模数据集有效
决策树的缺点:
处理连续变量不好
类别较多时,错误增加的比较快
# -×- encoding=utf-8 -*-
from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import preprocessing
from sklearn import tree
from sklearn.externals.six import StringIO
#read the csv file
allElectronicsData = open('play.csv','rb')
reader = csv.reader(allElectronicsData)
header=reader.next()
print(header)
featureList=[]
labelList=[]
for row in reader:
labelList.append(row[len(row)-1])
rowDict={}
for i in range(1,len(row)-1):
rowDict[header[i]]=row[i]
featureList.append(rowDict)
print(featureList)
#vectorize feature
vec = DictVectorizer()
dumpyX = vec.fit_transform(featureList).toarray()
print("dunmpyX "+ str(dumpyX) )
print("feature_name"+str(vec.get_feature_names()))
print("labelList "+ str(labelList))
#vectorize class lables
lb = preprocessing.LabelBinarizer()
dummyY = lb.fit_transform(labelList)
print("dummyY:" +str(dummyY))
#use the decision tree for classfication
clf = tree.DecisionTreeClassifier(criterion='entropy')
clf = clf.fit(dumpyX,dummyY) #构造决策树
#打印构造决策树采用的参数
print("clf : "+str(clf))
#visilize the model
#with open('play.dot','w') as f:
# f=tree.export_graphviz(clf,feature_names=vec.get_feature_names,out_file=f)
# dot -Tpdf in.dot -o out.pdf输出pdf文件
#验证数据,取一行数据,修改几个属性预测结果
oneRowX=dumpyX[0,:]
print("oneRowX: "+str(oneRowX))
newRowX = oneRowX
newRowX[0]=1
newRowX[2]=0
print("newRowX:"+str(newRowX))
predictedY = clf.predict(newRowX)
print("predictedY:"+str(predictedY))
可规模性一般