决策树实例-ID3

article/2025/10/15 2:15:36

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

代码参考博客:https://blog.csdn.net/weixin_43084928/article/details/82455326?
https://blog.csdn.net/laojie4124/article/details/92018932?

数据集:

ID3是通过计算信息增益来选择分类特征
后面会在此基础上通过graphviz模块打印输出决策树,并增加C4.5算法,预剪枝和后剪枝
结合数据集,具体的算法流程:
1)计算分类的信息熵:buy

# 计算分类特征的信息熵,数据集是最后一列,买或者不买,并返回信息熵
def calEnt(dataset):# 获取数据集的维度,有多少行数据n = dataset.shape[0]# 每一列有哪些数据,数量是多少columns_set = dataset.iloc[:,-1].value_counts()# 每种数据占总数量的比重p = columns_set / n # print('p:',p)# 信息熵ent = (-p*np.log2(p)).sum()return ent

2)计算4个特征的信息熵:income,credit_rating,age,student,这个完全根据数学计算步骤来来处理的。
计算信息增益最高的特征,并返回,以便选择节点:

def best_split(dataset):base_ent = calEnt(dataset)best_Gain = 0                                         #计算分类信息熵axis = 0                                             #初始化标签列,最优列gain = []for i in range(1,dataset.shape[1]-1):levels = dataset.iloc[:,i].value_counts()        #获取每一行的数据dict_levels = dict(levels)# print('levels:\n',dict_levels)ents = 0                                           #初始化信息熵for j in dict_levels.keys():# print('j:',j)child_set = dataset[dataset.iloc[:,i] == j]child_ent = calEnt(child_set)ents += (child_set.shape[0]/dataset.shape[0])*child_ent# print('ents:',ents)infogain = base_ent - entsgain.append(infogain)# print('infogain:',infogain)if infogain > best_Gain:best_Gain = infogainaxis = ireturn axis

3)创建决策树,用的是字典结构

def get_feature_2(dataset):# 返回特征值列表feature_list = list(dataset.columns)return feature_list
def sub_Split(dataset,axis,value):# 根据信息增益最高坐标返回特征值col = dataset.columns[axis]# drop()删除某一行或列,axis = 0 表示行,axis = 1表示列# 获取value值所在行,然后将col列删除redataset = dataset.loc[dataset[col]==value,:].drop(col,axis=1)return redataset
def create_tree(dataset):# 获得特征列表feature_list = get_feature_2(dataset)# print(feature_list)# 获得分类值,例如yes和noclass_list = dataset.iloc[:,-1].value_counts()# 判断目前这个数据集是否都是一类,或者数据集只有一个特征if class_list[0]==dataset.shape[0] or dataset.shape[1] == 1:# print('class_list的索引:',class_list.index[0])#如果是,返回类标签return class_list.index[0]# 第一次寻找所有特征中信息增益最高的那个特征的坐标,1-4中任意一个,第一个是RID,最后一个分类标签best_ent_axis = best_split(dataset)best_ent_feature = feature_list[best_ent_axis]# print(best_ent_feature)# 采用字典嵌套来存储树信息class_tree = {best_ent_feature:{}}# print(class_tree)# 从特征列表中删除信息增益最高的特征del feature_list[best_ent_axis]# print(feature_list)# 提取信息增益最高特征的数据value_list = set(dataset.iloc[:,best_ent_axis])# print(value_list)# 对每一个特征值递归建树,例如age:youth,middle_age,seniorfor value in value_list:class_tree[best_ent_feature][value] = create_tree(sub_Split(dataset,best_ent_axis,value))# print("生成的树:",class_tree)return class_tree

5)分类,递归调用,对训练集进行判断

# 分类判断
def classify(input_tree,labels,test_vec):# 获取决策树的根节点first_str = next(iter(input_tree))seconde_dict = input_tree[first_str]# 第一个节点所在的索引feature_index = labels.index(first_str)for key in seconde_dict.keys():# print('key:',key)# 如果测试数据的索引键值和根结点的键值一样if test_vec[feature_index] == key:# 如果子结点是一个字典,就继续分类,否则就是一个叶子结点if type(seconde_dict[key]) == dict :# 递归分类class_label = classify(seconde_dict[key], labels, test_vec)else:class_label = seconde_dict[key]return class_label

6)计算测试数据集在训练好的决策树的精度

# 测试精度
def acc_classify(train_dataset,test_dataset):# 根据训练数据得到决策树input_tree = create_tree(train_dataset)labels = list(train_dataset.columns)results = []for i in range(test_dataset.shape[0]):test_vec = train_dataset.iloc[i,:-1]class_label = classify(input_tree,labels,test_vec)results.append(class_label)# 在数据集增加一列predict,将预测出来的分类保存在这一列test_dataset['predict'] = resultsacc = (test_dataset.iloc[:,-1] == test_dataset.iloc[:,-2]).mean()print('测试的精度:')print(acc)

前面需要导入用的模块:

import csv
from sklearn.feature_extraction import DictVectorizer   #用来转换数据
from sklearn import preprocessing
import pandas as pd
import numpy as np

调用写好的函数,得到结果,由于用的训练数据和测试数据是一个,所以这个精度不准,但是整个流程是没问题的:

file_path = 'E:\\arithmetic_practice\\tree.csv'
dataset = pd.read_csv(file_path)
dataset = pd.DataFrame(dataset)
train_dataset = dataset
test_dataset = dataset
acc_classify(train_dataset, test_dataset)

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

相关文章

决策树算法及Python 代码示例

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

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

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

决策树算法

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

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

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

决策树算法原理及案例

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

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

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

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

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

决策树ID3例题

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

决策树算法与案例

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

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

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

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

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

高级管理学:计算题

题1:决策树和期望值 某企业拟开发新产品,现在有两个可行性方案需要决策。 方案一:开发新产品 A,需要追加投资 180 万元,经营期限为 5 年。此间,产品销路好每年可获利 170 万元;销路一般每年可获…

Nikto漏洞扫描工具简介

nikto漏洞扫描工具在我的靶场上测试报告如下: 测试时间会很长,我是在虚拟环境下做的,给的配置不高,吃尽CPU,最后不得不强制关闭虚拟机,通过-o参数将结果输出到文档中。 结果显示: 一些黑客比较感…

wed渗透:记录kali系统下扫描工具nikto的使用

目录 前言1 工具介绍2 使用场景3 使用方法3.1 查看帮助信息3.2 Nikto插件3.3 扫描3.3.1 常规扫描3.3.2 指定端口扫描3.3.3 指定协议扫描3.3.4 指定目录扫描3.3.5 多目标扫描3.3.6 配合namp利用管道输入扫描3.3.7 利用代理扫描 3.4 Nikto扫描过程中的交互参数3.5 修改nikto配置文…

Nikto安装及使用

系统要求如下(我自己使用的是linux,其它两个没有研究): 一、安装软件 第一步准备两个软件,如下: 1、nikto-master.zip(官网下载地址:https://cirt.net/nikto2) 2、libw…

Nikto详细使用教程

Nikto简介 基于perl语言开发的web页面扫描器。其特点扫描全面,速度快。 nikto常用命令 -upodate 升级,更新插件 -host 扫描目标URl -id username:password http认证接口 -list-plugins …

使用Nikto扫描网站漏洞

Nikto简介 Nikto是一个简单的开源Web服务器扫描程序,可以检查网站并报告它发现的可能用于利用或破解网站的漏洞。此外,它是业界使用最广泛的网站漏洞工具之一,并且在许多圈子中被认为是行业标准。 虽然这个工具非常有效,但它根本…

Kali工具库之Nikto

工具简介 Nikto是一个开源的WEB扫描评估软件,可以对Web服务器进行多项安全测试,能在230多种服务器上扫描出 2600多种有潜在危险的文件、CGI及其他问题。Nikto可以扫描指定主机的WEB类型、主机名、指定目录、特定CGI漏洞、返回主机允许的 http模式等。 链…

Nikto 网页服务器扫描器

一、Nikto介绍 Nikto是一款开源的(GPL)网页服务器扫描器,它可以对网页服务器进行全面的多种扫描,包含超过3300种有潜在危险的文件CGIs;超过625种服务器版本;超过230种特定服务器问题。扫描项和插件可以自动…

nmap和nikto扫描

先通过本机的VMware启动Kali攻击机和Metasploitable2靶机 端口扫描 使用 ip addr 或者 ifconfig 先看一下靶机的ip地址 在Kali里面使用 nmap IP 先用默认的方式对靶机进行扫描 事实上nmap的默认扫描方式就是 -sS 也就是SYN扫描,这种扫描方式基于TCP三次握手的前两…