决策树挑出好西瓜

article/2025/10/14 22:28:17

一、决策树

1、基本介绍

决策树(decision tree)是一种基本的分类与回归方法。其主要算法有:ID3、C4.5、CART。以及进化后的C4.5算法C5.0、分类有极大提升的Tsallis等算法。这些算法的区别就在于选择最优特征的方式。但C5.0的核心原理与C4.5是相同的,它对于C4.5的改进在于计算速率,尤其是对于大数据,C4.5的速度非常慢,而C5.0对大数据运算效率极高。但C5.0一直是商用算法,之前一直未开源,但官方提供了可将C5.0构建的分类器嵌入到自己组织中的C源码。

2、决策树事件处理流程

  • 构建策略:
      随着树的深度增加,节点的熵迅速降低。熵降低的速度越快越好,可以得到高度最矮的决策树
  • 决策树
    决策树的基本流程遵循“分而治之”策略。
  • 伪代码
    在这里插入图片描述
  • 结束递归的三个条件
    ①样本全部属于同一类别;
    ②此属性集合为孔或者此时所有样本的哥哥属性值相同;
    ③数据集在某一个属性上没有样本;

3、理论基础

  • 纯度(purity)
    对于一个分支结点,如果该结点所包含的样本都属于同一类,那么它的纯度为1;纯度越高越好,尽可能多的样本属于同一类
  • 信息熵(information entropy)
    假定当前样本集合D中第k类样本所占的比例为pk(k=1,2,…,|y|),则D的信息熵定义为:
    在这里插入图片描述
    显然,Ent(D)值越小,D的纯度越高。因为0<=pk<= 1,故log2 pk<=0,Ent(D)>=0. 极限情况下,考虑D中样本同属于同一类,则此时的Ent(D)值为0(取到最小值)。当D中样本都分别属于不同类别时,Ent(D)取到最大值log2 |y|.
  • 信息增益(information gain)
    假定离散属性a有V个可能的取值{a1,a2,…,aV}. 若使用a对样本集D进行分类,则会产生V个分支结点,记Dv为第v个分支结点包含的D中所有在属性a上取值为av的样本。不同分支结点样本数不同,我们给予分支结点不同的权重:|Dv|/|D|, 该权重赋予样本数较多的分支结点更大的影响、由此,用属性a对样本集D进行划分所获得的信息增益定义为:
    在这里插入图片描述
    其中,Ent(D)是数据集D划分前的信息熵,∑v=1 |Dv|/|D|·Ent(Dv)可以表示为划分后的信息熵。“前-后”的结果表明了本次划分所获得的信息熵减少量,也就是纯度的提升度。显然,Gain(D,a) 越大,获得的纯度提升越大,此次划分的效果越好。
  • 增益率(gain ratio)
    基于信息增益的最优属性划分原则——信息增益准则,对可取值数据较多的属性有所偏好。C4.5算法使用增益率替代信息增益来选择最优划分属性,增益率定义为:
    在这里插入图片描述
    其中
    在这里插入图片描述
    称为属性a的固有值。属性a的可能取值数目越多(即V越大),则IV(a)的值通常会越大。这在一定程度上消除了对可取值数据较多的属性的偏好。
    事实上,增益率准则对可取值数目较少的属性有所偏好,C4.5算法并不是直接使用增益率准则,而是先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
  • 基尼指数(Gini index)
    CART决策树算法使用基尼指数来选择划分属性,基尼指数定义为:
    在这里插入图片描述
    可以这样理解基尼指数:从数据集D中随机抽取两个样本,其类别标记不一致的概率。Gini(D)越小,纯度越高。
    属性a的基尼指数定义:
    在这里插入图片描述
    使用基尼指数选择最优划分属性,即选择使得划分后基尼指数最小的属性作为最优划分属性。

二、ID3决策树及Python实现

1、数据

在这里插入图片描述

2、步骤

  • 计算初始信息熵
  • 计算信息增益
  • 按照信息增益的大小排序
  • 选取最大的信息增益的特征,以此特征作为划分节点
  • 该特征从特征列表删除,继续返回到上一步筛选,重复操作,知道特征列表 = 0

3、决策树实现

  • 导入包
#导入模块
import pandas as pd
import numpy as np
from collections import Counter
from math import log2
  • 数据的获取处理操作
#数据获取与处理
def getData(filePath):data = pd.read_excel(filePath)return datadef dataDeal(data):dataList = np.array(data).tolist()dataSet = [element[1:] for element in dataList]return dataSet
  • 获取属性名称
#获取属性名称
def getLabels(data):labels = list(data.columns)[1:-1]return labels
  • 获取类别标记
#获取属性名称
def getLabels(data):labels = list(data.columns)[1:-1]return labels
#获取类别标记
def targetClass(dataSet):classification = set([element[-1] for element in dataSet])return classification
  • 叶节点标记
#将分支结点标记为叶结点,选择样本数最多的类作为类标记
def majorityRule(dataSet):mostKind = Counter([element[-1] for element in dataSet]).most_common(1)majorityKind = mostKind[0][0]return majorityKind
  • 计算信息熵
#计算信息熵
def infoEntropy(dataSet):classColumnCnt = Counter([element[-1] for element in dataSet])Ent = 0for symbol in classColumnCnt:p_k = classColumnCnt[symbol]/len(dataSet)Ent = Ent-p_k*log2(p_k)return Ent
  • 子数据集构建
#子数据集构建
def makeAttributeData(dataSet,value,iColumn):attributeData = []for element in dataSet:if element[iColumn]==value:row = element[:iColumn]row.extend(element[iColumn+1:])attributeData.append(row)return attributeData
  • 计算信息增益
#计算信息增益
def infoGain(dataSet,iColumn):Ent = infoEntropy(dataSet)tempGain = 0.0attribute = set([element[iColumn] for element in dataSet])for value in attribute:attributeData = makeAttributeData(dataSet,value,iColumn)tempGain = tempGain+len(attributeData)/len(dataSet)*infoEntropy(attributeData)Gain = Ent-tempGainreturn Gain
  • 选择最优属性
#选择最优属性                
def selectOptimalAttribute(dataSet,labels):bestGain = 0sequence = 0for iColumn in range(0,len(labels)):#不计最后的类别列Gain = infoGain(dataSet,iColumn)if Gain>bestGain:bestGain = Gainsequence = iColumnprint(labels[iColumn],Gain)return sequence
  • 建立决策树
#建立决策树
def createTree(dataSet,labels):classification = targetClass(dataSet) #获取类别种类(集合去重)if len(classification) == 1:return list(classification)[0]if len(labels) == 1:return majorityRule(dataSet)#返回样本种类较多的类别sequence = selectOptimalAttribute(dataSet,labels)print(labels)optimalAttribute = labels[sequence]del(labels[sequence])myTree = {optimalAttribute:{}}attribute = set([element[sequence] for element in dataSet])for value in attribute:print(myTree)print(value)subLabels = labels[:]myTree[optimalAttribute][value] =  \createTree(makeAttributeData(dataSet,value,sequence),subLabels)return myTree
def main():filePath = 'E:\Ai\watermelon\watermalon.xls'data = getData(filePath)dataSet = dataDeal(data)labels = getLabels(data)myTree = createTree(dataSet,labels)return myTree

在这里插入图片描述
运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、Sklearn实现决策树

1、基于信息增益准则方法建立决策树

  • 导入相关库
#导入相关库
import pandas as pd
import graphviz 
from sklearn.model_selection import train_test_split
from sklearn import tree
  • 导入数据
f = open('watermalon.csv','r')
data = pd.read_csv(f)x = data[["色泽","根蒂","敲声","纹理","脐部","触感"]].copy()
y = data['好瓜'].copy()
print(data)

在这里插入图片描述

  • 进行数据转换
#将特征值数值化
x = x.copy()
for i in ["色泽","根蒂","敲声","纹理","脐部","触感"]:for j in range(len(x)):if(x[i][j] == "青绿" or x[i][j] == "蜷缩" or data[i][j] == "浊响" \or x[i][j] == "清晰" or x[i][j] == "凹陷" or x[i][j] == "硬滑"):x[i][j] = 1elif(x[i][j] == "乌黑" or x[i][j] == "稍蜷" or data[i][j] == "沉闷" \or x[i][j] == "稍糊" or x[i][j] == "稍凹" or x[i][j] == "软粘"):x[i][j] = 2else:x[i][j] = 3y = y.copy()
for i in range(len(y)):if(y[i] == "是"):y[i] = int(1)else:y[i] = int(-1) 
#需要将数据x,y转化好格式,数据框dataframe,否则格式报错
x = pd.DataFrame(x).astype(int)
y = pd.DataFrame(y).astype(int)
print(x)
print(y)

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

  • 建立模型并进行训练
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.2)
print(x_train)

在这里插入图片描述

#决策树学习
clf = tree.DecisionTreeClassifier(criterion="entropy")                    #实例化 
clf = clf.fit(x_train, y_train) 
score = clf.score(x_test, y_test)
print(score)

在这里插入图片描述

  • 绘制决策树
# 加上Graphviz2.38绝对路径
import os
os.environ["PATH"] += os.pathsep + 'D:/Some_App_Use/Anaconda/Anaconda3/Library/bin/graphviz'feature_name = ["色泽","根蒂","敲声","纹理","脐部","触感"]
dot_data = tree.export_graphviz(clf ,feature_names= feature_name,class_names=["好瓜","坏瓜"],filled=True,rounded=True,out_file =None) 
graph = graphviz.Source(dot_data) 
graph

在这里插入图片描述

2、CART算法实现

clf = tree.DecisionTreeClassifier(criterion="gini")  #实例化 
clf = clf.fit(x_train, y_train) 
score = clf.score(x_test, y_test)
print(score)

在这里插入图片描述

# 加上Graphviz2.38绝对路径
import os
os.environ["PATH"] += os.pathsep + 'D:/Some_App_Use/Anaconda/Anaconda3/Library/bin/graphviz'feature_name = ["色泽","根蒂","敲声","纹理","脐部","触感"]
dot_data = tree.export_graphviz(clf ,feature_names= feature_name,class_names=["好瓜","坏瓜"],filled=True,rounded=True,out_file =None) 
graph = graphviz.Source(dot_data) 
graph

在这里插入图片描述

四、总结

对决策树算法有了一定了解,熟悉了Sklearn库使用

参考文章

决策树挑出好西瓜(基于ID3、CART)


http://chatgpt.dhexx.cn/article/jlvT4uET.shtml

相关文章

1.决策树C4.5算法

文章目录 一、概述二、改进表现三、优缺点四、决策树1.特征选择2.决策树的生成3.决策树的剪枝 一、概述 C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法。它的目标是监督学习&#xff1a;给定一个数据集&#xff0c;其中的每一个元组都能用一组属性值来描述&#xff0c…

python实现三种经典决策树算法

决策树实现ID3、C4.5、CART算法 Author: 浅若清风cyfDate: 2020/12/15 一、创建数据集 手动 def createDataSet():"""创建测试的数据集:return:"""dataSet [# 1[青绿, 蜷缩, 浊响, 清晰, 凹陷, 硬滑, 好瓜],# 2[乌黑, 蜷缩, 沉闷, 清晰, 凹…

数据挖掘--决策树C4.5算法(例题)

C4.5算法与ID3算法的不同点&#xff1a; &#xff08;1&#xff09;分支指标采用增益比例 &#xff08;2&#xff09;数值属性的处理 &#xff08;3&#xff09;处理缺少属性值的训练样本 &#xff08;4&#xff09;使用K次迭代交叉验证&#xff0c;评估模型的优劣程度&#xf…

决策树算法总结(上:ID3,C4.5决策树)

文章目录 一、决策树原理1.1 决策树简介1.2 基本概念 二、数学知识2.1 信息熵2.2 条件熵:2.3 信息增益 三、ID3决策树3.1 特征选择3.2 算法思路3.3 算法不足 四、C4.5决策树算法4.1 处理连续特征4.2 C4.5决策树特征选取4.3 处理缺失值4.4 过拟合问题 五、决策树C4.5算法的不足 …

决策树分类算法的案例(代码实现及运行测试)

1 案例需求 我们的任务就是训练一个决策树分类器&#xff0c;输入身高和体重&#xff0c;分类器能给出这个人是胖子还是瘦子。 所用的训练数据如下&#xff0c;这个数据一共有10个样本&#xff0c;每个样本有2个属性&#xff0c;分别为身高和体重&#xff0c;第三列为类别标签…

决策树cart算法实战

1、使用决策树预测隐形眼镜类型&#xff0c;隐形眼镜数据集(lenses.csv)是非常著名的数据集&#xff0c;它包含很多患者眼部状况的观察 条件以及医生推荐的隐形眼镜类型。隐形眼镜类型包括硬材质、软材质以及不适合佩戴隐形眼镜。 要求&#xff1a;读取lenses.csv中的隐形眼镜数…

人工智能决策树大作业

人工智能技术: 机器学习之决策树大作业 以西瓜集 2.0 为建模数据&#xff0c;采用交叉验证方法进行数据训练集和验证集的划分&#xff0c;实现决策树 “预剪枝”算法&#xff0c;要求:尽可能充分利用有限的西瓜集 2.0 数据所提供信息&#xff0c;建立泛化能力强的 决策树模型。…

决策树算法:原理与python实现案例

文章目录 决策树算法浅析决策树的介绍决策树最佳划分的度量问题决策树python案例 决策树算法浅析 决策树的介绍 决策树的定义&#xff1a; 决策树是一种逼近离散值目标函数的方法&#xff0c;学习到的函数使用树结构进行表示&#xff0c;完成决策任务。这里决策树可以是分类树…

决策树实例-ID3

决策树-ID3实例 参考书籍&#xff1a; 《机器学习》周志华&#xff0c;第1版 《统计学习方法》李航&#xff0c;第2版 用来记录自己对书中知识的理解&#xff0c;加强自己的理解和记忆&#xff0c;同时提出自己迷惑不解的地方&#xff0c;提高自己编辑的表达能力。 代码参考博…

决策树算法及Python 代码示例

决策树是一种基于树形结构的算法&#xff0c;用于在一系列决策和结果之间建立模型。它通过对特征和目标变量之间的关系进行划分&#xff0c;来预测目标变量的值。 决策树算法示例: 假设我们有一组数据&#xff0c;其中包含天气&#xff0c;温度&#xff0c;湿度和是否出门的特…

决策树一CART算法(第四部分)

决策树一CART算法(第四部分) CART树的剪枝&#xff1a;算法步骤 输入&#xff1a;CART算法生成的决策树。 输出&#xff1a;最优决策树T 设 K 0 &#xff0c; T T 0 K0&#xff0c;TT_0 K0&#xff0c;TT0​ &#xff0c;从完整的决策树出发 ​ k代表迭代次数&#xff0c;先…

决策树算法

决策树 决策树(Decision Tree)首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析,本质上是通过一系列规则对数据进行分类的过程 决策树是一种典型的分类方法。其中: 每个内部结点表示一个属性上的判断每个分支代表一个判断结果的输出每…

决策树ID3、C4.5和CART算法例子详解

决策树 决策树是附加概率结果的一个树状的决策图&#xff0c;是直观的运用统计概率分析的图法。机器学习中决策树是一个预测模型&#xff0c;它表示对象属性和对象值之间的一种映射&#xff0c;树中的每一个节点表示对象属性的判断条件&#xff0c;其分支表示符合节点条件的对…

决策树算法原理及案例

机器学习在各个领域都有广泛的应用&#xff0c;特别在数据分析领域有着深远的影响。决策树是机器学习中最基础且应用最广泛的算法模型。本文介绍了机器学习的相关概念、常见的算法分类和决策树模型及应用。通过一个决策树案例&#xff0c;着重从特征选择、剪枝等方面描述决策树…

通过实例理解决策树算法(ID3,C4.5,Cart算法)

&#xff08;一&#xff09;实例&#xff1a;使用ID3算法给出“好苹果”的决策树 &#xff08;二&#xff09;决策树的工作原理 我们在做决策树的时候&#xff0c;会经历两个阶段&#xff1a;构造和剪枝。 构造原理——构造的过程就是选择什么属性作为节点的过程&#xff0c;…

数据挖掘之C4.5决策树算法

1.决策树算法实现的三个过程&#xff1a; 特征选择&#xff1a;选择哪些特征作为分类的标准是决策树算法的关键&#xff0c;因此需要一种衡量标准来进行特征的确定&#xff0c;不同的决策树衡量标准不同。例如C4.5决策树就是以信息增益率来作为衡量标准。决策树的生成&#xf…

决策树ID3例题

表格里统计了14天的气象数据&#xff0c;特征属性包括outlook,temperature,humidity,windy&#xff0c;类别属性为是否打球(play),用ID3算法生成决策树。 解答过程&#xff1a;

决策树算法与案例

决策树算法介绍 树模型 决策树&#xff1a;从根节点开始一步步走到叶子节点&#xff08;决策&#xff09;。所有的数据最终都会落到叶子节点&#xff0c;既可以做分类也可以做回归 树的组成 根节点&#xff1a;第一个选择点&#xff1b;非叶子节点与分支&#xff1a;中间过程…

数据挖掘--决策树ID3算法(例题)

决策树分类算法 决策树分类算法通常分为两个步骤&#xff1a;决策树生成和决策树修剪。 决策树生成算法的输入参数是一组带有类别标记的样本&#xff0c;输出是构造一颗决策树&#xff0c;该树可以是一棵二叉树或多叉树。二叉树的内部结点&#xff08;非叶子结点&#xff09;…

决策树算法原理+例题练习

一、决策树的优缺点 优点&#xff1a;计算复杂度不高&#xff0c;输出结果易于理解&#xff0c;对中间值的缺失值不敏感&#xff0c;可以处理不相关特征数据。缺点&#xff1a;可能会产生过度匹配的问题。使用数据类型&#xff1a;数值型和标称型。 二、一个实例 一天&#…