决策树基本原理
-
什么是决策树/判定树(decision tree)?
判定树是一个类似于流程图的树结构:其中,每个内部结点表示在一个属性上的测试,每个分支代表一个属性输出,而每个树叶结点代表类或类分布。树的最顶层是根结点。
-
机器学习中分类方法中的一个重要算法
问题描述
根据问题数据,研究人们是否买电脑
问题数据
选择属性判断结点
信息获取量(Information Gain):Gain(A) = Info(D) - Infor_A(D)
通过A来作为节点分类获取了多少信息,
并重复下去…
算法:
-
树以代表训练样本的单个结点开始(步骤1)。
-
如果样本都在同一个类,则该结点成为树叶,并用该类标号(步骤2 和3)。否则,算法使用称为信息增益的基于熵的度量作为启发信息,选择能够最好地将样本分类的属性(步骤6)。该属性成为该结点的“测试”或“判定”属性(步骤7)。
-
在算法的该版本中,所有的属性都是分类的,即离散值。连续属性必须离散化。对测试属性的每个已知的值,创建一个分枝,并据此划分样本(步骤8-10)。
-
算法使用同样的过程,递归地形成每个划分上的样本判定树。一旦一个属性出现在一个结点上,就不必该结点的任何后代上考虑它(步骤13)。
递归划分步骤仅当下列条件之一成立停止:
(a) 给定结点的所有样本属于同一类(步骤2 和3)。
(b) 没有剩余属性可以用来进一步划分样本(步骤4)。在此情况下,使用多数表决(步骤5)。这涉及将给定的结点转换成树叶,并用样本中的多数所在的类标记它。替换地,可以存放结点样本的类分布。
© 分枝 test_attribute = a i 没有样本(步骤11)。在这种情况下,以 samples 中的多数类
创建一个树叶(步骤12)
python源代码
```bash
from sklearn.feature_extraction import DictVectorizer
import csv
#预处理数据库
from sklearn import preprocessing,tree
#读取csv文件
allElectronicsData=open(r'C:\Users\LENOVO\Desktop\代码与素材\代码与素材(1)\01DTree\AllElectronics.csv', 'rt')
reader=csv.reader(allElectronicsData)
# reader = csv.reader(file) #返回的可迭代类型,此时reader返回的值是csv文件中每行的列表,将每行读取的值作为列表返回
# reader.next()作用:打印csv文件中的第一行标题header
headers=next(reader)
#建立训练集,区分特征向量、标记
featureList = []
labelList = []
#建立一个字典,为下面DictVectorizer()映射做准备
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)
#vec.fit_transform(列表).toarray()把一个列表中元素为字典的各个值量化成数字
#vec.get_feature_names()把列表中的字典转化为以'字典的键=字典的值'为元素的列表
vec =DictVectorizer()
dummyX = vec.fit_transform(featureList).toarray()
print('dummyX:'+str(dummyX))
print(vec.get_feature_names())
print('labelList:'+str(labelList))
#转换函数将字符串label进行数字化,数字范围从0开始,并且将label转换为了一个列向量。
# 最后在ML任务完成之后,输出的时候需要还原之前的label,因此使用函数inverse_transform()
lb = preprocessing.LabelBinarizer()
dummyY = lb.fit_transform(labelList)
print('dummyY:'+str(dummyY))
#决策树分类,使用id3建立决策树
clf = tree.DecisionTreeClassifier(criterion='entropy')
clf = clf.fit(dummyX,dummyY)
print("clf:"+str(clf))
#把建立好的决策树写入文件
with open('tree.dot','w')as f:
f = tree.export_graphviz(clf,feature_names=vec.get_feature_names(),out_file=f)
##dot 转化成pdf 树:dot -Tpdf " 文件地址.dot" -o output.pdf
oneRowx = dummyX[0,:].reshape(1,-1)
print('oneRowx'+str(oneRowx))
#建立测试集
newRowX = oneRowx
#注意numpy的维度
newRowX[0][0] = 1
newRowX[0][2] = 1
#将newRowX.reshape(1,-1)将newRowX中的多组数据转化成1行
newRowX.reshape(1,-1)
print('newRowx:'+str(newRowX))
predictedY = clf.predict(oneRowx)
print('predictedY'+str(predictedY))