如何用代码实现决策树来决策要不要相亲?

news2024/11/19 15:28:19

前言

上一篇我们了解了什么是决策树,知道了决策树构建的过程,同时聊了构建决策树的两种算法,那么我们今天来看下如何使用代码实现决策树的构建。

数据分析整体流程

数据分析一般是以下的分析流程
在这里插入图片描述

1、加载数据集

首先我们构建数据,提供训练数据集

序号,经济,身高,长相,其他优点,是否见面
1,有钱,低,不帅,有,否
2,有钱,低,不帅,无,否
3,一般,低,帅,有,是
4,没钱,低,帅,有,是
5,没钱,高,帅,有,否
6,有钱,一般,不帅,无,是

将数据进行加载,主要用来读取数据集,将其加载到内存

train_data = pd.read_csv('../source/data/survival_prediction/train_1.csv')

2、数据探索

# 数据探索
print(train_data.info())
print('-'*30)
print(train_data.describe())
print('-'*30)
print(train_data.describe(include=['O']))
print('-'*30)
print(train_data.head())
print('-'*30)
print(train_data.tail())

了解数据的特性,更好的帮助我们做数据清洗、特征选择。了解下以下几个方法

info()查看数据行数、列数、每列的数据类型、数据完整度
describe()了解数据表的统计情况:总数、平均值、标准差、最小值、最大值等
describe(include=[‘O’])查看字符串类型(非数字)的整体情况
head查看前几行数据(默认是前 5 行)
tail查看后几行数据(默认是最后 5 行)

打印数据信息
在这里插入图片描述
在这里插入图片描述

如果存在数据确实或者数据异常,那么我们其实可以通过其他策略进行数据的修正。当前数据集比较完整。

3、特征选择

分析数据字段,通过数据集分析,除了序号不影响相亲结果,‘经济’, ‘身高’, ‘长相’, '其他优点‘都会影响到结果。因此定义如下:

features = ['经济', '身高', '长相', '其他优点']  #特征集字段
train_features = train_data[features]  #训练数据
train_labels = train_data['是否见面']  #训练结果

在归类特征值时我们发现,存在一些特征字段是字符串的,这个不利于我们后期的运算,需要转成数值类型。

特征向量化

比如经济字段,有 有钱 和 没钱,一般三种取值。我们可以把它变成 经济=有钱、经济=一般和经济=没钱三个字段,并且每个值用0和1来表示。

其他枚举字段也同样处理。这种字段的变换我们称之为特征向量化

Python中使用DictVectorizer来对字段进行向量化

dvec=DictVectorizer(sparse=False)
train_features=dvec.fit_transform(train_features.to_dict(orient='record'))
print(dvec.feature_names_)

字段释义如下:

dtype:callable, 可选参数, 默认为float。特征值的类型,传递给Numpy.array或者Scipy.sparse矩阵构造器作为dtype参数。

separator: string, 可选参数, 默认为"="。当构造One-hot编码的特征值时要使用的分割字符串。分割传入字典数据的键与值的字符串,生成的字符串会作为特征矩阵的列名。

PS:One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。

sparse: boolearn, 可选参数,默认为True。transform是否要使用scipy产生一个sparse矩阵。DictVectorizer的内部实现是将数据直接转换成sparse矩阵,如果sparse为False, 再把sparse矩阵转换成numpy.ndarray型数组。
sort:boolearn,可选参数,默认为True。在拟合时是否要多feature_names和vocabulary_进行排序。

打印后的特征列如下:
在这里插入图片描述

4、决策树模型训练

当数据清洗完成并且特征值也确定之后,那么就需要开始构建决策树了。Python中,可以使用sklearn 这个库进行构建决策树模型。

sklearn 是python中支持决策树模型的一个机器学习库,支持ID3 与 CART 决策树。使用方法如下:

# 构造 ID3 决策树
clf = DecisionTreeClassifier(criterion='entropy')

在构造 DecisionTreeClassifier 类时,其中有一个参数是 criterion,它决定了构造的分类树是采用 ID3 分类树,还是 CART 分类树,对应的取值分别是 entropy 或者 gini;

entropy: 基于信息熵,也就是 ID3 算法,实际结果与 C4.5 相差不大;

gini:默认参数,基于基尼系数。CART 算法是基于基尼系数做属性划分的,所以 criterion=gini 时,实际上执行的是 CART 算法。

DecisionTreeClassifier构造器其他参数说明

def __init__(self, *,
             criterion="gini",
             splitter="random",
             max_depth=None,
             min_samples_split=2,
             min_samples_leaf=1,
             min_weight_fraction_leaf=0.,
             max_features="auto",
             random_state=None,
             max_leaf_nodes=None,
             min_impurity_decrease=0.,
             min_impurity_split=None,
             class_weight=None,
             ccp_alpha=0.0):

在这里插入图片描述
我们使用ID3算法,进行构建决策树

# 构造 ID3 决策树
clf = DecisionTreeClassifier(criterion='entropy')

决策树模型选择完毕后,传入需要训练的数据,以及输出的结果集

# 决策树训练
clf.fit(train_features, train_labels)

从而得到我们数据训练出的决策树模型。

5、决策树模型评估

决策树提供了 score 函数可以直接得到准确率,但是我们并不知道真实的预测结果,所以无法用预测值和真实的预测结果做比较。我们只能使用训练集中的数据进行模型评估,可以使用决策树自带的 score 函数计算下得到的结果

# 得到决策树准确率
acc_decision_tree = round(clf.score(train_features, train_labels),6)
print(u'score 准确率为 %.4lf' % acc_decision_tree)

得到输出结果: score 准确率为 1.0000

因为是通过训练模型的数据和训练模型的结果做的对比,所以分值比较高,但这个并不能代表决策树分类器的真实准确性。那么我们该如何对测试数据进行准确性校验呢?

模型预测和评估-K-Fold交叉验证

在机器学习建模过程中,通行的做法通常是将数据分为训练集和测试集。测试集是与训练独立的数据,完全不参与训练,用于最终模型的评估。在训练过程中,经常会出现过拟合的问题,就是模型可以很好的匹配训练数据,却不能很好在预测训练集外的数据。如果此时就使用测试数据来调整模型参数,就相当于在训练时已知部分测试数据的信息,会影响最终评估结果的准确性。通常的做法是在训练数据再中分出一部分做为验证(Validation)数据,用来评估模型的训练效果。

它将原始数据分成K组(K-Fold),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型。这K个模型分别在验证集中评估结果,最后的误差MSE(Mean Squared Error)加和平均就得到交叉验证误差。交叉验证有效利用了有限的数据,并且评估结果能够尽可能接近模型在测试集上的表现,可以做为模型优化的指标使用。
在这里插入图片描述

**交叉验证主要用于防止模型过于复杂而引起的过拟合,是一种评价训练数据的数据集泛化能力的统计方法。其基本思想是将原始数据进行划分,分成训练集和测试集,训练集用来对模型进行训练,测试集用来测试训练得到的模型,以此来作为模型的评价指标。

下面举一个具体的例子来说明K-Fold的过程,比如如下的数据

[0.1, 0.2, 0.3, 0.4, 0.5, 0.6]

分为K=3组后

Fold1: [0.5, 0.2] Fold2: [0.1, 0.3] Fold3: [0.4, 0.6]

交叉验证的时会使用如下三个模型,分别进行训练和测试,每个测试集误差MSE加和平均就得到了交叉验证的总评分

Model1: Trained on Fold1 + Fold2, Tested on Fold3

Model2: Trained on Fold2 + Fold3, Tested on Fold1

Model3: Trained on Fold1 + Fold3, Tested on Fold2

K折交叉验证原理

1、将数据集平均分割成 K 个等份;

2、使用 1 份数据作为测试数据,其余作为训练数据;

3、计算测试准确率;使用不同的测试集,

4、重复 2、3 步骤。

在 sklearn 的 model_selection 模型选择中提供了 cross_val_score 函数。用于我们进行交叉验证。

test_decision_tree = np.mean(cross_val_score(clf, train_features, train_labels, cv=3))
print(u'cross_val_score准确率为 %.4lf' % test_decision_tree)

下图可以看到,测试数据被分为3份进行验证,得到了3个结果,然后求平均值
在这里插入图片描述

得到结果为cross_val_score准确率为 0.3333。因为我们数据集比较少,因此差距还是比较大的。

6、决策树模型可视化

整个决策树模型虽然已经创建了,但对于我们来讲还是比较抽象的,那么我们如果想看到具体训练出来的决策树是什么样子的该怎么做呢?

可以通过安装Graphviz 插件进行决策树的可视化。

1、官网下载Graphviz :http😕/www.graphviz.org/download/

2、添加环境变量

Graphviz安装目录\bin

Graphviz安装目录\bin\dot.exe

3、python 编译环境添加graphviz库

4、重启电脑,这样就可以在程序中使用Graphviz了。

Python中,执行以下方法,即可将训练的决策树模型clf进行可视化

dot_data = tree.export_graphviz(clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.view()

在这里插入图片描述

你可以看下输出的决策树的图形,主要含义如下:
比如类似 X[2]<=0.5 这种就是告诉你这个节点,选择的属性是X[2],阈值是0.5。当属性<=0.5的时候,决策进入到左子树,当>0.5的时候,决策进入到右子树。
entropy实际上代表了信息不纯度,这个数值越大,代表纯度越低。 samples代表的是这个节点的样本数,比如samples=6,就代表这个节点一般有6个样本。

value这个数组会告诉你这个样本集是如何分布的,比如value=[3,3],即6个样本,有3个为True,也就是X[7]<=0.5,还有3个样本为False,即这些样本的X[7]>0.5

然后继续上面的分裂过程,直到叶子节点,纯度越来越高,最终归为同一个类别时,纯度最高,entropy=0,此时样本都为同一个类别,也就是按照这条线路可以得到的最终分类结果。

所以你能看到:决策树的使用,就是从根节点开始,然后属性划分,当<=阈值时走左子树,>阈值时走右子树,最终在叶子节点可以得到分类的结果。你指的每个方框里的entropy, samples, vale都是中间的计算结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69801.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows10配置openvino

一、前言 gpu的常用部署我们是选择trt,那么cpu的部署呢?当然是英特尔的ov 这里要注意:我们一般是现在一台机器上利用exe(后续会说)安装完ov,那么以后在配好第一台软件配置后,以后部署到其他机器上只需要直接把dll和lib直接复制到另一台就可以运行了! 也就是说,只有…

Matplotlib学习笔记(第二章 2.11使用指南 一些简单的例子)

第二章 学习指南 本页包含更多使用Matplotlib的深入指南。它分为初级、中级和高级部分&#xff0c;以及涵盖特定主题的部分。 有关较短的示例&#xff0c;请参阅我们的示例页面。您还可以在我们的用户指南中找到外部资源和FAQ。 2.1介绍 这些教程涵盖了使用Matplotlib创建可…

P4设计实现链路监控

实验要求 在本次实验中&#xff0c;目的是编写一个P4程序&#xff0c;使主机能够监控网络中所有链路的使用情况本练习基于基本的IPv4转发练习&#xff0c;因此请确保在尝试此练习之前完成此练习&#xff08;basic.p4&#xff09;具体来说&#xff0c;我们将修改基本P4程序以处…

使用ChatGPT完成分类、检测、分割等计算机视觉任务(Pytorch)

前言 ChatGPT是一个由OpenAI训练的大型语言模型&#xff0c;其知识涵盖了很多领域。 虽然ChatGPT表示它不能用于写代码&#xff0c;但是万一是它太谦虚了呢&#xff1f; 下面的文字均为ChatGPT给出的回答。 使用ChatGPT解决图像分类任务 我们需要一个PyTorch模型&#xff0…

11-18-kafka-生产者理论

11-kafka-理论&#xff1a; Kafka 工作流程及文件存储机制 Kafka 工作流程 Kafka 中消息是以 topic 进行分类的&#xff0c;生产者生产消息&#xff0c;消费者消费消息&#xff0c;都是面向 topic的。 topic 是逻辑上的概念&#xff0c;而 partition 是物理上的概念&#xf…

【MySQL】MySQL数据库结构与操作

✨个人主页&#xff1a;bit me ✨当前专栏&#xff1a;MySQL数据库 ✨每日一语&#xff1a;自从厌倦于追寻&#xff0c;我已学会一觅即中&#xff0c;自从一股逆风袭来&#xff0c;我已能抗御八面来风&#xff0c;驾舟而行。 目 录 &#x1f334;一. 数据库介绍&#x1f33f;1.…

工业物联网解决方案:地下水实时监测系统

地下水是水资源的重要组成部分&#xff0c;它具备水量稳定、水质好等特点&#xff0c;是农业灌溉、工矿和城市的重要水源之一&#xff0c;但同时也会出现沼泽化、地面沉降、滑坡等问题&#xff0c;影响当地自然环境和生活用水。 随着物联网通信技术的发展以及国家水资源管理的…

JavaScript (WebAPI)

目录 一、DOM 1. DOM树结构&#xff1a; 2. 重要概念 3. DOM 的工作流程 二、获取/操作元素 1. 获取 ① 获取单个元素 ② 获取所有元素 2. 操作 1. 获取/修改元素内容 3. 案例 三、新增元素 1. 创建元素节点 2. 插入节点到 DOM树 四、删除元素 一、DOM DOM 全…

Photoshop简单案例(8)——利用文字工具修改图片上文字

目录一、项目介绍二、原图上有要替换的文字2.1 方法1——利用修补工具修改2.2 方法2——利用移动工具&#xff08;推荐&#xff09;2.3 效果演示三、原图上没有要替换的文字一、项目介绍 本文介绍利用PhotoShop修改图片上的文字。修改下图图片中的学号。 二、原图上有要替换…

【HBU】2022秋线上作业-第五次-有关树的判断选择

判断题&#xff1a; 1. 一棵有124个结点的完全二叉树&#xff0c;其叶结点个数是确定的。 √ 高度为n的完全二叉树的结点数为2ⁿ-1 124位于64-1~128-1之间&#xff0c;所以这棵树的高度是7&#xff0c;前六层是满的有63个&#xff0c;第7层有124-6361个 64-613 第6层有…

使用Electron打包React项目

1、下载Electron Electron中文官网地址&#xff1a;https://www.electronjs.org/zh/docs/latest/ Electron下载如果单纯使用npm的话&#xff0c;会出现n多问题 所以建议使用国内的淘宝镜像 npm config set registry https://registry.npmmirror.com/然后下载 cnpm install -…

LeetCode 81. 搜索旋转排序数组 II

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 81. 搜索旋转排序数组 II&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名称 LeetC…

年后准备换工作的软件测试工程师们,你准备好了吗?

需要严肃说明的是&#xff1a;面试题库作为帮助大家准备面试的辅助资料&#xff0c;但是绝对不能作为备考唯一途径&#xff0c;因为面试是一个考察真实水平的&#xff0c;不是背会了答案就可以的&#xff0c;需要你透彻理解的&#xff0c;否则追问问题答不出来反而减分&#xf…

什么是dapp?如何在web中开发dapp?

web3 “Web3.0”是对“Web2.0”的改进&#xff0c;在此环境下&#xff0c;用户不必在不同中心化的平台创建多种身份&#xff0c;而是能打造一个去中心化的通用数字身份体系&#xff0c;通行各个平台。更像是一种概念吧。 区块链 区块链&#xff08;Blockchain&#xff09;是由…

54-64-k8s-集群监控-高可以用集群-交付部署

54-k8s-集群监控-高可以用集群-交付部署 k8s集群监控 1、概述 一个好的系统&#xff0c;主要监控以下内容 集群监控 节点资源利用率节点数运行Pods Pod监控 容器指标应用程序【程序占用多少CPU、内存】 2、监控平台 使用普罗米修斯【prometheus】 Grafana 搭建监控平台…

JS实现鼠标悬停变色

JS实现鼠标悬停变色 案例池子&#xff1a; JS实现鼠标悬停变色 JavaScript中的排他算法实现按钮单选 JavaScript中的localStorage JavaScript中的sessionStorage JavaScript实现网页关灯效果 JavaScript实现一段时间之后关闭广告 JavaScript实现按键快速获取输入框光标 …

第二证券|紧盯“有诺不行”隐疾 补齐上市公司高质量发展“短板”

有诺不可”的典型事例 “言而有信”是上市公司高质量开展的重要环节。近日&#xff0c;证监会印发的《推动提高上市公司质量三年举动计划&#xff08;2022-2025&#xff09;》&#xff08;下称《举动计划》&#xff09;提出&#xff0c;将着力处理管理领域杰出问题&#xff0c…

(Java)Thymeleaf学习笔记——动力节点

前言 学SpringMVC找课程时就了解到要学习thymeleaf这种Java模板引擎&#xff0c;但本着不用不学的原则就直接跳过&#xff0c;当实践第一个SpringMVC程序helloworld&#xff0c;遇见了thymeleaf&#xff0c;那么就先解决 &#x1f4a1;thymeleaf 知识点&#xff0c;再来学习Sp…

CSS新增样式----圆角边框、盒子阴影、文字阴影

在CSS中新增了三个样式&#xff0c;分别是圆角边框&#xff0c;盒子阴影&#xff0c;文字阴影。 初识圆角边框&#xff1a; border-radius属性用于设置元素的外边框圆角 语法如下&#xff1a; border-radius:length;原理如下&#xff1a; [椭]圆与边框的交集形成圆角效果。…

档案知识:声像档案的数字化处理与保存

声像档案是档案家族中较晚出现的成员&#xff0c;主要包括音像资料、图像资料、图片等&#xff0c;伴随着当今科技的发展进步&#xff0c;声像档案的数字化管理正逐步替代传统声像档案的管理方式&#xff0c;成为当前的发展主流。 虽然声像档案相较于传统文字档案&#xff0c;…