机器学习-决策树算法代码详注

决策树基本知识:

个人理解:通过数据的各类特征,进行有限次的划分(树型结构),使数据达到快速分类的效果。

优点:计算复杂度不高,结果易于理解

缺点:容易产生过拟合现象,所以需要对决策树进行剪枝

前提知识:熵、信息增益(信息在数据划分之前和之后发生的变化大小,与熵的减小程度成正比,即数据有序程度成正比):https://blog.csdn.net/hi_sir_destroy/article/details/108812865

构造决策树 “特征” 选取算法、剪枝算法见下博客链接https://www.jianshu.com/p/b7d71478370d

代码例子来源:《机器学习实践》第三章

数据包含5个海洋动物,特征包括:不浮出水面是否可以生存,以及是否有脚蹼,将这些动物分成两类:鱼类和非鱼类。

目标:确定依据第一个特征还是第二个特征划分数据。也就是逐渐构造决策树的过程

 当看完前提知识,请再理解下图公式

# -*- coding: UTF-8 -*-
from math import log

# 计算香农熵
def calsShannonEnt(dataSet):
    dataCount = len(dataSet)
    labelCounts = {}
    for featVec in dataSet:
        currentLabel = featVec[-1]  # 数据表中最后一列表示 “结果”
        if currentLabel not in labelCounts.keys():
            labelCounts[currentLabel]=0
        labelCounts[currentLabel] += 1  # 统计相应类别结果出现的概率
    shannonEnt = 0.0  # 香浓熵
    for key in labelCounts:
        prob = float(labelCounts[key])/dataCount  # 每个结果出现的概率
        shannonEnt -= prob * log(prob,2)  # 计算香农熵 -pi*log(pi),
    return shannonEnt  # 熵越大,数据越无序

# 创建数据集
def createDataSet():
     dataSet=[[1,1,'yes'],
              [1,1,'yes'],
              [1,0,'no'],
              [0,1,'no'],
              [0,0,'no']]
     labels = ['no surfacing','flipper']
     return dataSet,labels

# 划分数据集 参数:数据集、带分类的特征号、相应特征的值,
# 函数返回数据剩下的特征极其值列表,
# 比如(data,0,0)表示找出0号特征值为0的数据,并返回这些数据的其他特征及其值
def splitData(data,axis,value):
    retdata = []
    for featvec in data:
        if featvec[axis]==value:
            reduceFeatVec = featvec[:axis]
            reduceFeatVec.extend(featvec[axis+1:])
            retdata.append(reduceFeatVec)
    return retdata

# 选择最好的数据集划分方式
def chooseBestFeatureToSplit(dataSet):
    numFeature = len(dataSet[0])-1  # 获得每个数据的特征数量
    baseEntropy = calsShannonEnt(dataSet)  # 计算数据集的香农熵
    bestInfoGain = 0.0  # 最大信息增益先设为0,接下来是计算出能产生最大信息增益的特征
    bestFeature = -1  # 用于分类最合适的数据特征,先默认为-1
    for i in range(numFeature):  # 该循环用于遍历数据的所有特征
        featList = [example[i] for example in dataSet]  # 找出每一行数据特征标号为i的特征值
        uniqueVals = set(featList)  # 对找到的特征值数据做集合处理。去掉重复值
        newEntropy = 0  # 定义一个新的熵值
        for value in uniqueVals:  # 对集合中“i号特征”的每一个特征值进行处理,是对该“i号特征”所有取值期望的计算
            subDataSet = splitData(dataSet,i,value)  # 得到“i号特征”的特征值为value的数据行,的其他特征的数据列表
            prob = len(subDataSet)/float(len(dataSet))  # 计算出现“该类数据”的概率
            newEntropy += prob*calsShannonEnt(subDataSet)  # 计算“该类数据”的香农熵
        infoGain = baseEntropy - newEntropy  # 计算熵的变化值,infoGain越大,表示新的熵越小,表示通过该特征分类之后,信息增益更大,即无序的减少
        if (infoGain > bestInfoGain): # 找出信息增量最大的“标号特征”
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature



data,labels=createDataSet()
print(splitData(data,0,1))  # 以0号特征,特征值为1的数据进行分类,
print(splitData(data,0,0))  # 以0号特征,特征值为0的数据进行分类,
#print(calsShannonEnt(data))
print(chooseBestFeatureToSplit(data)) # 确定第一个数据划分的依据特征

由于该例子特征只有2个,所以确定一个,就只剩下最后一个特征进行分类了。

 

# 确定最后的分类特征标签
def majorityCnt(classList):
    classCount = {}
    for vote in classList:
        if vote not in classCount.keys():
            classCount[vote] = 0
        classCount[vote] += 1
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]

# 创建树代码
def createTree(dataSet,labels):
    classList = [example[-1] for example in dataSet]  # 数据集结果列表
    if classList.count(classList[0]) == len(classList):  # 类别完全相同,则停止划分
        return classList[0]
    if len(dataSet[0]) == 1:  # 只剩下结果集,表示分类完成,返回分类列表
        return majorityCnt(classList)
    bestFeat = chooseBestFeatureToSplit(dataSet)  # 特征选择函数
    bestFeatLabel = labels[bestFeat]  # 相应特征的语言描述
    myTree = {bestFeatLabel:{}}  # 创建树
    del(labels[bestFeat])  # 删除已经用过的特征描述
    featValues = [example[bestFeat] for example in dataSet]  # 获取该特征的取值情况
    uniqueVals = set(featValues)  # 对取值进行去重
    for value in uniqueVals:
        sublabels = labels[:]  # 构造剩下的特征数据
        myTree[bestFeatLabel][value] = createTree(splitData(dataSet,bestFeat,value),sublabels)  # 递归造树
    return myTree

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
决策树算法机器学习中常用的一种算法,它通过构建一棵树形结构来进行分类或回归任务。决策树算法有多种不同的变体,其中包括ID3算法、C4.5算法和基本决策树算法。 ID3算法是最早提出的一种决策树算法,它的核心思想是通过计算信息增益来选择最佳的特征进行节点的划分。具体步骤是:从根节点开始,计算每个特征的信息增益,选择信息增益最大的特征作为当前节点的划分特征,然后根据该特征的不同取值建立子节点,再对子节点递归地应用以上步骤,直到所有的特征信息增益很小或没有特征可选为止。 C4.5算法是对ID3算法的改进,它引入了信息增益率(比)来选择特征,解决了ID3算法对于取值较多的特征有偏好的问题。与ID3算法相似,C4.5算法也使用递归的方式构建决策树,但在选择划分特征时,使用信息增益率作为选择的依据。 基本决策树算法决策树算法的一种简化版,它没有引入信息增益或信息增益率,而是通过计算基尼指数来选择最佳的划分特征。基尼指数衡量了一个特征的不纯度,选择基尼指数最小的特征进行划分。基本决策树算法相对于ID3算法和C4.5算法更简单直观,但在某些情况下可能会有一定的性能损失。 总的来说,决策树算法通过构建一棵树形结构来进行分类或回归任务,其中ID3算法、C4.5算法和基本决策树算法是其中的三种常见变体。每种算法都有其特点和优缺点,选择适合具体问题的算法可以提高算法的性能和准确性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [机器学习算法(3)之决策树算法](https://blog.csdn.net/qq_20412595/article/details/82048795)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值