本篇内容是xxxx深度学习基础课程视频上的,如有侵权,请与我联系,谢谢!
一,理论知识
1)熵(entropy)的概念:
变量的不确定性越大,熵越大。
2)决策树归纳算法(ID3)-用于选择属性判断结点。
信息获取量(Information Gain):=Gain(A)=Info(D)-Info_A(D)
(就是没有A时的信息增益,减去有A时的信息增益)。得到的数据表示通过A来作为结点分类获取了多少信息。
- 示例数据
4)计算过程
(1)没有根据任何属性来分类,目标类的信息增益:买电脑的概率是9/14,不买电脑的概率是5/14。
(2)以age来分类的信息熵计算:
第一个5/14,是youth(共有5个),(2/5表示这5个youth有2个买电脑,3/5表示有3个没有买电脑);
第二个4/14,是middle_aged(共有4个),(4/4表示这4个middle_aged有4个买电脑,0/4表示有0个没有买电脑);
第二个5/14,是senior(共有5个),(3/5表示这5个senior有3个买电脑,2/5表示有2个没有买电脑.
(3)拿总的Infor(D)减去age的Infor(D),就得到age的信息增益。
(4)同样的方法可以计算出其他属性的信息增益:
,
因为age的信息增益最大,所以选择age作为第一个根节点
(5)选age作为第一个节点后,可以得到如下图:
middle_aged的数据全是yes,所以不用再分了
(6)针对youth,需要再分。方法如(1)-(4)步
5)其他算法
C4.5,CART…
共同点:都是贪心算法,自上而下
区别:属性选择度量方法不同
6)避免overfitting方法
(1)先剪枝
(2)后剪枝
7)决策树优缺点
有点:直观,便于理解,小规模数据有效
缺点:处理连续变量不好,类别较多时,错误增加的比较快,可规模性一般。
二,Python编程实现
1)先将数据存在csv文件中
2)源代码
from sklearn.feature_extraction import DictVectorizer #转换数据用
import csv #存储原始数据
from sklearn import preprocessing #处理
from sklearn import tree
from sklearn.externals.six import StringIO
allElectronicsData=open(r'E:\sxl_Programs\DecisionTree.csv','rt') #
reader=csv.reader(allElectronicsData)
headers=next(reader) #读取文件头
print (headers)
featureList=[] #特征值
labelList=[] #分类结果标签,是否买电脑,yes no
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)
vec=DictVectorizer()
dumpyX=vec.fit_transform(featureList).toarray() #将特征值转化成需要的格式
print("dumpyX:"+str(dumpyX))
print(vec.get_feature_names())
print("LabelList:"+str(labelList))
#Vectorize class labels
lb=preprocessing.LabelBinarizer()
dumpyY=lb.fit_transform(labelList) #分类结果标签转换成需要的格式
print("dumpY:"+str(dumpyY))
#using decison tree for classification
# clf =tree.DecisionTreeClassifier()
clf=tree.DecisionTreeClassifier(criterion='entropy') #产生决策树
clf=clf.fit(dumpyX,dumpyY)
print("clf:"+str(clf))
with open("allElectronicInformationGainOri.dot","w") as f:
f=tree.export_graphviz(clf,feature_names=vec.get_feature_names(),out_file=f)
oneRowX=dumpyX[0,:]
print("oneRowX:"+str(oneRowX))
newRowX=oneRowX #测试决策树
newRowX[0]=1
newRowX[2]=0
print("newRowX:"+str(newRowX))
3)生成的dot文件
4)dot转换成可视化的pdf(怎么转百度搜,有一个专门的工具)