如何构建决策树--原理分析

什么是决策树(判定树)

        判定树是一个类似于流程图的树结构:其中,每个内部结点表示在一个属性上的测试,每个分支代表一个属性输出,而每个树叶结点代表类或类分布。树的最顶层是根结点。

简单的说,就是每一个节点进行判断。

一条信息的信息量大小和它的不确定性有直接的关系,要搞清楚一件非常非常不确定的事情,或者是我们一无所知的事情,需要了解大量信息==>信息量的度量就等于不确定性的多少

如何 选择属性判断结点

有很多标准,这里以决策树归纳算法(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))



       可规模性一般

猜你喜欢

转载自blog.csdn.net/red_ear/article/details/81710650