摘要:决策树作为机器学习中基础且应用广泛的分类算法,以其直观的树形结构和强大的解释性备受青睐。本文将从理论基础出发,结合Python代码实现,深入剖析决策树的核心原理与实战应用。
决策树作为机器学习中基础且应用广泛的分类算法,以其直观的树形结构和强大的解释性备受青睐。本文将从理论基础出发,结合Python代码实现,深入剖析决策树的核心原理与实战应用。
决策树是一种树形结构的分类模型,由内部节点和叶节点组成:
内部节点表示特征判断叶节点表示分类结果其工作原理类似"二十个问题"游戏,通过层层特征筛选缩小分类范围,最终得到实例的类别归属。在邮件分类场景中,决策树会先判断发件域名,再根据内容关键词进一步分类,展现出清晰的层级决策逻辑。
决策树通过递归方式构建,核心逻辑如下:
def createBranch:''' 决策树递归构建逻辑 '''if 所有数据分类标签相同:return 类标签else:选择信息增益最大的特征划分数据集为每个划分子集递归创建分支return 分支节点def calcshannonEnt(dataSet):"""计算数据集的香农熵"""numEntries = len(dataSet)labelcounts = {}# 统计各类标签出现次数for featVec in dataSet:currentLabel = featVec[-1]if currentLabel not in labelCounts:labelCounts[currentLabel] = 0labelCounts[currentLabel] += 1# 计算香农熵shannonEnt = 0.0for key in labelCounts:prob = float(labelCounts[key]) / numEntriesshannonEnt -= prob * math.log(prob, 2)return shannonEntdef splitDataSet(dataSet, index, value):"""根据特征和值划分数据集"""retDataSet = for featVec in dataSet:if featVec[index] == value:# 提取划分后的数据(排除当前特征列)reducedFeatVec = featVec[:index]reducedFeatVec.extend(featVec[index+1:])retDataSet.append(reducedFeatVec)return retDataSetdef chooseBestFeatureToSplit(dataSet):"""选择信息增益最大的特征"""numFeatures = len(dataSet[0]) - 1 # 特征数量baseEntropy = calcShannonEnt(dataSet)bestInfoGain, bestFeature = 0.0, -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 - newEntropyif infoGain > bestInfoGain:bestInfoGain = infoGainbestFeature = ireturn bestFeaturedef createTree(dataSet, labels):"""递归构建决策树"""classList = [example[-1] for example in dataSet]# 停止条件1:所有标签相同if classList.count(classList[0]) == len(classList):return classList[0]# 停止条件2:所有特征使用完毕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(splitDataSet(dataSet, bestFeat, value), subLabels)return myTreedef classify(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 = classify(valueOfFeat, featLabels, testVec)else:classLabel = valueOfFeatreturn classLabeldef createDataSet:"""创建鱼类分类数据集"""dataSet = [[1, 1, 'yes'],[1, 1, 'yes'],[1, 0, 'no'],[0, 1, 'no'],[0, 1, 'no']]labels = ['no surfacing', 'flippers']return dataSet, labels构建与测试流程# 解析文本文件数据lenses = [inst.strip.split('\t') for inst in fr.readlines]lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate']决策树存储与加载def storeTree(inputTree, filename):"""存储决策树到文件"""import picklefw = open(filename, 'wb')pickle.dump(inputTree, fw)fw.closedef grabTree(filename):"""从文件加载决策树"""import picklefr = open(filename, 'rb')return pickle.load(fr)决策树算法特点优点通过以上代码实现和项目案例,我们可以清晰理解决策树从理论到实践的完整流程。作为基础分类算法,决策树不仅是机器学习入门的重要内容,也是理解集成学习算法(如随机森林)的基础,在数据挖掘领域具有不可替代的地位。
来源:码农世界