复制
收藏
提问
简洁

from math import log import operator def createDataSet(): dataSet = [[0, 0, 0, 0, 'no'], [0, 0, 0, 1, 'no'], [0, 1, 0, 1, 'yes'], [0, 1, 1, 0, 'yes'], [0, 0, 0, 0, 'no'], [1, 0, 0, 0, 'no'], [1, 0, 0, 1, 'no'], [1, 1, 1, 1, 'yes'], [1, 0, 1, 2, 'yes'], [1, 0, 1, 2, 'yes'], [2, 0, 1, 2, 'yes'], [2, 0, 1, 1, 'yes'], [2, 1, 0, 1, 'yes'], [2, 1, 0, 2, 'yes'], [2, 0, 0, 0, 'no']] labels = ['年龄','有工作','有自己的房子','信贷情况'] return dataSet, labels def calcShannonEnt(dataSet): numEntires = 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]) / numEntires shannonEnt -= prob * log(prob, 2) return shannonEnt def splitDataSet(dataSet, axis, value): retDataSet = [] for featVec in dataSet: if featVec[axis] == value: reducedFeatVec = featVec[:axis] reducedFeatVec.extend(featVec[axis+1:]) retDataSet.append(reducedFeatVec) return retDataSet def chooseBestFeatureToSplit(dataSet): numFeatures = len(dataSet[0]) - 1 baseEntropy = calcShannonEnt(dataSet) bestInfoGain = 0.0 bestFeature = -1 for i in range(numFeatures): featList = [example[i] for example in dataSet] uniqueVals = set(featList) newEntropy = 0.0 for value in uniqueVals: subDataSet = splitDataSet(dataSet, i, value) prob = len(subDataSet) / float(len(dataSet)) newEntropy += prob * calcShannonEnt(subDataSet) infoGain = baseEntropy - newEntropy print("第%d个特征的增益为%.3f" % (i, infoGain)) if (infoGain > bestInfoGain): bestInfoGain = infoGain bestFeature = i return bestFeature 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, featLabels): 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] featLabels.append(bestFeatLabel) 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(splitDataSet(dataSet, bestFeat, value), subLabels, featLabels) return myTree def classify(inputTree, featLabels, testVec): firstStr = next(iter(inputTree)) secondDict = inputTree[firstStr] featIndex = featLabels.index(firstStr) for key in secondDict.keys(): if testVec[featIndex] == key: if type(secondDict[key]).__name__ == 'dict': classLabel = classify(secondDict[key], featLabels, testVec) else: classLabel = secondDict[key] return classLabel if __name__ == '__main__': dataSet, labels = createDataSet() featLabels = [] myTree = createTree(dataSet, labels, featLabels) print(myTree) testVec = [0, 1] result = classify(myTree, featLabels, testVec) if result == 'yes': print('放贷') if result == 'no': print('不放贷') 帮忙分析该代码

3月前
全网
文档
学术
百科
知识库
时间不限
自动
回答简洁模式
深入研究一些

这段代码是一个简单的决策树算法实现,用于分类问题,特别是像贷款批准这样的二分类问题。下面是对代码的逐段分析:

  1. 导入必要的库

    • from math import log 导入了数学库中的对数函数,用于计算香农熵。
    • import operator 导入了操作符模块,用于后续的排序操作。12
  2. 创建数据集

    • createDataSet() 函数定义了一个包含贷款申请者信息的数据集,以及每个特征的标签。数据集中的每个示例都是一个特征向量,最后一个元素是类别标签('yes' 或 'no')。1
  3. 计算香农熵

    • calcShannonEnt(dataSet) 函数计算给定数据集的香农熵,这是决策树算法中用于选择最佳分割特征的关键指标。香农熵越高,意味着数据集的不确定性越大。3
  4. 数据集分割

    • splitDataSet(dataSet, axis, value) 函数根据指定的轴(特征)和值,将数据集分割成两部分。这是构建决策树时,对特征空间进行划分的基础操作。3
  5. 选择最佳分割特征

    • chooseBestFeatureToSplit(dataSet) 函数遍历所有特征,计算每个特征的信息增益,并选择信息增益最大的特征作为最佳分割特征。信息增益是香农熵减少的量,表示通过分割数据集,不确定性减少的程度。3
  6. 多数投票分类

    • majorityCnt(classList) 函数统计类别列表中出现次数最多的类别,用于当数据集在某个节点上的所有示例都属于同一类别时,作为该节点的预测结果。5
  7. 构建决策树

    • createTree(dataSet, labels, featLabels) 函数递归地构建决策树。它首先检查停止条件,然后选择最佳特征进行分割,并递归地在子数据集上构建子树。10
  8. 分类函数

    • classify(inputTree, featLabels, testVec) 函数用于对新的测试向量进行分类。它根据决策树的规则,逐层向下,直到到达一个叶节点,返回该节点的类别标签。10
  9. 主程序

    • if __name__ == '__main__': 块中,程序首先创建数据集,然后构建决策树,并打印出来。接着,它使用决策树对一个测试向量进行分类,并根据分类结果打印是否放贷。7

整体来看,这段代码实现了一个基本的决策树学习算法,它可以用于分类任务,如贷款批准决策。代码的结构清晰,功能模块化,易于理解和扩展。68

你觉得结果怎么样?
决策树算法原理是什么?
决策树在机器学习中的应用
如何使用Python实现决策树分类?
决策树的优缺点有哪些?
信息增益在决策树中的作用
决策树的剪枝技术是什么?

以上内容由AI搜集生成,仅供参考

在线客服