决策树初识

信息熵:描述信息的混乱度,度量样本集合纯度的指标。
信息熵越小,混乱度越低,纯度越高。
信息熵  :  Ent(D)=  - ∑Pk (log2  Pk)
信息增益: Gain(D,a) = Ent(D) - ∑ Dv/D * Ent(Dv)  信息增益对   多值属性有偏好
设     节点信息熵   K  =  -∑ Dv/D * Ent(Dv)    
设    根节点信息熵   为    A //因此先取大于平均的信息增益,再运用信息增益率
信息增益率:  Gain_ratio(D,a)=  (A-K)/K            信息增益率对  少值属性有偏好 
基尼指数:   Gini(D)= 1- ∑ Pk^2      //从数据集D中随机抽取两个样本,其类别标记不一致的概率。  此Gini越小,纯度越高。
Gini_index(D,a)=∑ Dv/D Gini(Dv)   按Gini最小者划分
剪枝处理:  对付过拟合,比如一片叶子有锯齿,训练集过度拟合:  将有锯齿这一特性划分是否为叶子,那么没有锯齿的叶子就被视为 非叶子。
预剪枝:每个节点在划分前先进行估计,若当前节点划分不能提升泛化性能,则不再划分,直接归为叶子结点

后剪枝:先生成完整决策树,后自下而上的进行考察,若该子树替换为叶子结点后泛化能力提升,则替换。

代码编写准备工作:

anaconda集成科学环境

Graphviz   pdf生成器

数据集





from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import preprocessing
from sklearn import tree
from sklearn.externals.six import StringIO
#read the data and save in right place
allElectronicInformationGainOri =open(r"E:\AI\video\AllElectronics.csv")
reader=csv.reader(allElectronicInformationGainOri)
headers=reader.__next__()
print(headers)


featureList=[]
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)
    
#vectorize feature
vec = DictVectorizer()
dummyX=vec.fit_transform(featureList).toarray()
print("dummyX:"+str(dummyX))
print(vec.get_feature_names())
print("labelList:"+str(labelList))          
#vectorize class label
lb=preprocessing.LabelBinarizer()
dummyY=lb.fit_transform(labelList)
print("dummyY:"+str(dummyY))
    
#using decision tree for classification
clf=tree.DecisionTreeClassifier(criterion="entropy")
clf=clf.fit(dummyX, dummyY)
print("clf:"+str(clf))
#visualize model
#with open(
with open("AllElectronicsInformationgain.dot","w") as f:
    f=tree.export_graphviz(clf,feature_names=vec.get_feature_names(),out_file=f)
oneRowX=dummyX[0,:]
print("oneRowX:"+str(oneRowX))
oneRowX[0]=1
oneRowX[2]=0
predictedY=clf.predict(oneRowX)
print("predictedY:"+str(predictedY))

你可能感兴趣的:(Python)