educoder机器学习-实验四-编程实现基于信息增益进行划分选择的决策树算法

这是educoder平台,机器学习-实验四-编程实现基于信息增益进行划分选择的决策树算法的代码详解与解决过程详解,创造不易,请大家点点赞,收藏藏!

目录

1.导包 加载数据

2. 计算信息熵

 3.对数据进行划分

 4.计算信息的熵,条件熵,信息增益来保存最好的属性

 5.对数据进行排序处理

6.进行划分,生成决策树 (核心代码)

7.编写预测函数

8.测试代码,进行测试代码的正确

9.运行结果参考 


1.导包 加载数据

from math import log
import operator


def loaddata():
    dataSet = [[0, 0, 0, 0, 0, 0, 'yes'],
               [1, 0, 1, 0, 0, 0, 'yes'],
               [1, 0, 0, 0, 0, 0, 'yes'],
               [0, 0, 1, 0, 0, 0, 'yes'],
               [2, 0, 0, 0, 0, 0, 'yes'],
               [0, 1, 0, 0, 1, 1, 'yes'],
               [1, 1, 0, 1, 1, 1, 'yes'],
               [1, 1, 0, 0, 1, 0, 'yes'],
               [1, 1, 1, 1, 1, 0, 'no'],
               [0, 2, 2, 0, 2, 1, 'no'],
               [2, 2, 2, 2, 2, 0, 'no'],
               [2, 0, 0, 2, 2, 1, 'no'],
               [0, 1, 0, 1, 0, 0, 'no'],
               [2, 1, 1, 1, 0, 0, 'no'],
               [1, 1, 0, 0, 1, 1, 'no'],
               [2, 0, 0, 2, 2, 0, 'no'],
               [0, 0, 1, 1, 1, 0, 'no']]
    feature_name = ['a1', 'a2', 'a3', 'a4', 'a5', 'a6']
    return dataSet, feature_name

2. 计算信息熵

def entropy(dataSet):
    # 数据集条数
    m = len(dataSet)
    # 保存所有的类别及属于该类别的样本数
    labelCounts = {}
    for featVec in dataSet:
        currentLabel = featVec[-1]
        if currentLabel not in labelCounts.keys():
            labelCounts[currentLabel] = 0
        labelCounts[currentLabel] += 1
    # 保存熵值
    e = 0.0
    # 补充计算信息熵的代码
    for key in labelCounts:
        prob = float(labelCounts[key]) / m
        e -= prob * log(prob, 2)
    return e

 3.对数据进行划分

def splitDataSet(dataSet, axis, value):
    # 补充按给定特征和特征值划分好的数据集的代码
    # axis对应的是特征的索引;
    retDataSet = []
    # 遍历数据集
    for featVec in dataSet:
        if featVec[axis] == value:
            reduceFeatVec = featVec[:axis]
            reduceFeatVec.extend(featVec[axis + 1:])
            retDataSet.append(reduceFeatVec)
    return retDataSet

 4.计算信息的熵,条件熵,信息增益来保存最好的属性

def chooseBestFeature(dataSet):
    n = len(dataSet[0]) - 1
    # 计数整个数据集的熵
    baseEntropy = entropy(dataSet)
    bestInfoGain = 0.0;
    bestFeature = -1
    # 遍历每个特征
    for i in range(n):
        # 获取当前特征i的所有可能取值
        featList = [example[i] for example in dataSet]
        uniqueVals = set(featList)
        newEntropy = 0.0
        # 遍历特征i的每一个可能的取值
        for value in uniqueVals:
            # 按特征i的value值进行数据集的划分
            subDataSet = splitDataSet(dataSet, i, value)
            # 补充计算条件熵的代码
            prob = len(subDataSet) / float(len(dataSet))
            newEntropy += prob * entropy(subDataSet)
        # 计算信息增益
        infoGain = baseEntropy - newEntropy
        # 保存当前最大的信息增益及对应的特征
        if (infoGain > bestInfoGain):
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature

 5.对数据进行排序处理

def classVote(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]

6.进行划分,生成决策树 (核心代码)

def trainTree(dataSet, feature_name):
    classList = [example[-1] for example in dataSet]
    # 所有类别都一致
    if classList.count(classList[0]) == len(classList):
        return classList[0]
    # 数据集中没有特征
    if len(dataSet[0]) == 1:
        return classVote(classList)
    # 选择最优划分特征
    bestFeat = chooseBestFeature(dataSet)
    bestFeatName = feature_name[bestFeat]
    myTree = {bestFeatName: {}}
    featValues = [example[bestFeat] for example in dataSet]
    uniqueVals = set(featValues)
    # 遍历uniqueVals中的每个值,生成相应的分支
    for value in uniqueVals:
        sub_feature_name = feature_name[:]
        # 生成在dataSet中bestFeat取值为value的子集;
        sub_dataset = splitDataSet(dataSet, bestFeat, value)
        # 根据得到的子集,生成决策树
        myTree[bestFeatName][value] = trainTree(sub_dataset, sub_feature_name)
    return myTree

7.编写预测函数

def predict(inputTree, featLabels, testVec):
    firstStr = list(inputTree.keys())[0]
    secondDict = inputTree[firstStr]
    featIndex = featLabels.index(firstStr)
    key = testVec[featIndex]
    valueOfFeat = secondDict[key]
    if isinstance(valueOfFeat, dict):
        classLabel = predict(valueOfFeat, featLabels, testVec)
    else:
        classLabel = valueOfFeat
    return classLabel

8.测试代码,进行测试代码的正确

myDat, feature_name = loaddata()
myTree = trainTree(myDat, feature_name)
print(myTree)

print(predict(myTree, feature_name, [1, 1, 0, 1, 0, 0]))

9.运行结果参考 

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于信息熵进行划分选择决策树算法,是一种常用的机器学习算法。其主要思想是通过计算每个特征的信息熵,来选择最优的特征进行划分,从而构建决策树模型。具体实现过程包括以下步骤: 1. 计算数据集的信息熵,作为初始的熵值。 2. 对于每个特征,计算信息增益,即数据集的熵减去该特征划分后的熵。 3. 选择信息增益最大的特征作为划分特征,将数据集划分为多个子集。 4. 对于每个子集,重复步骤1-3,直到所有子集都属于同一类别或者无法再进行划分。 5. 构建决策树模型,将每个特征作为节点,每个子集作为分支,最终得到一个完整的决策树。 该算法的优点是能够处理多分类问题,同时具有较好的可解释性和泛化能力。但是在处理大规模数据时,计算信息熵和信息增益的复杂度较高,需要进行优化。 ### 回答2: 决策树算法是一种基于树形结构的分类和回归分析方法。在分类问题中,决策树算法将训练数据集划分成多个子集,每个子集对应于一个节点。每个节点代表一个属性判断,根据该属性的取值将数据集划分为不同类别。通过递归地划分数据集并生成树形结构,最终形成一个决策树模型。在预测时,利用决策树模型对新数据进行分类。 基于信息熵进行划分选择决策树算法,其主要思想是选择能够最大地减少不确定性的属性作为划分属性。具体流程如下: 1. 计算数据集的信息熵,公式为:$H(T) = -\sum_{i=1}^{n}p_i\log_2p_i$,其中 $p_i$ 为类别 $i$ 在数据集中的比例。 2. 对每个属性 $A_i$,计算其对数据集的条件熵 $H(T|A_i)$,公式为:$H(T|A_i) = \sum_{j=1}^{m}\frac{\left| T_{ij} \right|}{\left| T \right|}\cdot H(T_{ij})$,其中 $m$ 为属性 $A_i$ 的取值个数,$T_{ij}$ 为属性 $A_i$ 取值为第 $j$ 种时的子集。 3. 计算信息增益 $Gain(A_i)$,公式为:$Gain(A_i) = H(T) - H(T|A_i)$。 4. 选择信息增益最大的属性作为划分属性。 5. 根据划分属性建立新的节点,并将数据集划分为多个子集。 6. 对每个子集递归地进行上述步骤,直到所有叶子节点的样本都属于同一类别或者达到预设条件。 编程实现时,需要先定义数据结构和算法步骤。数据结构包括节点类、树类和数据集类等。节点类中包含属性名、属性值、子节点、样本类别等属性;树类中包含根节点、叶子节点、决策过程等属性;数据集类中包含数据列表、属性列表、类别列表等属性。算法步骤则按照上述流程实现,需要注意递归调用和预设条件限制等问题,以避免出现过拟合或欠拟合等情况。 基于信息熵进行划分选择决策树算法具有较好的分类效果和解释性,且能够处理离散型和连续型属性,适用于各种规模的数据集。但是也存在一些问题,例如容易受随机性和异常值影响,可能会出现过拟合和欠拟合等情况,需要结合实际情况进行改进和优化。 ### 回答3: 决策树是一种典型的分类与回归分析方法。基于信息熵进行划分选择决策树算法是一种决策树算法,通过计算每个可能划分带来的信息增益选择信息增益最大的划分作为当前节点的划分算法主要步骤如下: 1. 基于初始的训练数据集,计算数据集的信息熵(Entropy)。 2. 针对数据集中的每个特征,基于该特征的取值,将数据集划分成若干个子集。 3. 针对每个子集,计算其信息熵,然后根据所有子集信息熵的加权平均数(加权平均数为各子集样本数与总样本数的比例),计算该特征的信息增益,最终获得该特征的信息增益值。 4. 针对所有特征,计算所有特征的信息增益值。 5. 选择信息增益最大的特征作为当前节点的划分。 6. 对每个子集递归执行步骤2至步骤5,直到数据集中的所有样本均属于同一种类别。 7. 最终得到一棵决策树,该树用于分类的过程中,将样本依据特征的取值逐步划分到各个叶子节点中,最终划分到的叶子节点对应的类别即为该样本的类别。 该算法实现基本的思路是,每次选择信息增益最大的特征作为划分的依据,从而尽可能的降低划分之后样本集合的信息熵,提高模型的分类精度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值