机器学习基础之决策树算法

本文深入讲解决策树算法的基本原理,包括其在机器学习中的应用,如何根据信息增益选择最佳属性进行分类,以及如何递归地构建决策树。通过Python源代码示例,展示如何使用sklearn库实现决策树,并生成可视化的决策树模型。
摘要由CSDN通过智能技术生成

决策树基本原理

  1. 什么是决策树/判定树(decision tree)?

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

  2. 详情文档: http://scikit-learn.org/stable/modules/tree.html

  3. 机器学习中分类方法中的一个重要算法

问题描述

根据问题数据,研究人们是否买电脑

问题数据

在这里插入图片描述
选择属性判断结点

      信息获取量(Information Gain):Gain(A) = Info(D) - Infor_A(D)
      通过A来作为节点分类获取了多少信息,

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
并重复下去…

算法:

  1. 树以代表训练样本的单个结点开始(步骤1)。

  2. 如果样本都在同一个类,则该结点成为树叶,并用该类标号(步骤2 和3)。否则,算法使用称为信息增益的基于熵的度量作为启发信息,选择能够最好地将样本分类的属性(步骤6)。该属性成为该结点的“测试”或“判定”属性(步骤7)。

  3. 在算法的该版本中,所有的属性都是分类的,即离散值。连续属性必须离散化。对测试属性的每个已知的值,创建一个分枝,并据此划分样本(步骤8-10)。

  4. 算法使用同样的过程,递归地形成每个划分上的样本判定树。一旦一个属性出现在一个结点上,就不必该结点的任何后代上考虑它(步骤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))

运行结果

运行结果

生成树

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值