数学建模~~~预测方法--决策树模型

news2024/9/25 17:19:05

目录

0.直击重点

1.决策树概念

2.节点特征的选择算法

3.基尼系数的计算

4.决策树的分类

5.模型的搭建

6.模型的改进和评价

ROC曲线

参数调优

 GridSearch网格搜索

使用搜索结果重新建模


0.直击重点

这个文章,我们从三个维度进行说明介绍:

第一维度:介绍基本的概念,以及这个决策树的分类和相关的这个算法和基尼系数的计算方法,通过给定这个用户的数据预测这个用户是否会离职;

第二维度:增加数据量,通过语言评价(低,高,中)转换为真实的数据0,1,2,来评估这个用户离职的概率,通过分类准确率函数评估这个预测成功的样本数量和score函数预测这个准确率

第三维度:我们通过调优参数对于这个模型进行了改进,介绍了这个命中率和误判率的概念和基于这两者绘制的ROC曲线和AUC数值,有两个方法:

一个就是把这个参数全部传递进去,使用best_search属性去确定这个最优解;

另一个就是进行循环,格式化输出所有的AUC数值,进行比较得出来这个最优的解;

两个结果的方法可以进行验证,证明我们的模型的准确性~~~

1.决策树概念

决策树里面学习的这个根节点,内部节点和这个叶节点类似于我们的数据结构里面学习的这个二叉树的结构,两个都是树形结构,都有这个根节点,叶子结点以及这个内部节点的定义,从某种意义上面而言,这两个是可进行类比学习的;

2.节点特征的选择算法

节点特征的不同选择,这个节点的子节点的内容肯定就是不一样的,这个时候,如何进行这个节点的选择就很重要,针对于这个节点的额选择,有下面的几个算法,我们以第三个为例进行介绍;

ID3算法,C4.5算法,CART算法(利用基尼系数作为指标的算法);

3.基尼系数的计算

4.决策树的分类

我们下面的介绍以分类决策树为主:

  1. 导入对应的模块;
  2. 选择对应的数据,并以二维数组进行传入;
  3. max_depth就是这个决策树的深度,层数而已,具体的设置我们介绍优化的时候会进行说明;
  4. random_state就是保证这个过程的随机状态,没有其他的意义,这个1可以是其他的任何数字;
  5. fit函数的两个参数就是x,y变量进行模型的训练;
  6. predict函数的参数就是对应的自变量和因变量,并对于这个结果进行预测;
import pandas as pd
df = pd.read_csv("/Users/sample/员工离职数据样本.csv")

# 导入sklearn.tree模块中的分类决策树模型DecisionTreeClassifier
from sklearn.tree import DecisionTreeClassifier

# 以二维结构读取"工资(k)","满意度"这两列,作为自变量x
x = df[["工资(k)","满意度"]]
# 以二维结构读取"离职"列,作为因变量y
y = df[["离职"]]

# TODO 使用DecisionTreeClassifier()初始化模型
# 并设置参数max_depth=2,random_state=1,赋值给model
model = DecisionTreeClassifier(max_depth=2,random_state=1)
# TODO 使用fit()函数训练模型
model.fit(x, y)

# TODO 使用predict()函数,传入参数[[9,6]]进行预测,并赋值给y_pre
y_pre = model.predict([[9, 6]])
# TODO 输出y_pre
print(y_pre)

5.模型的搭建

  1. 和上面的这个相比较,我们的这个板块的这个信息量会更大,需要涉及到一些这个数值转换的函数的使用和这个分类准确率的函数的说明;
  2. 首先就是这个replace函数,进行这个数值转换;
  3. x,y分别代表这个模型里面的自变量和因变量;
  4. 接着就是划分测试集和训练集,构建模型初始化并且进行训练;
  5. 实际上这个输出的结果是一个10*2的矩阵,每一行的两个数据,一个表示不离职,一个表示离职,我们使用索引筛选出来第二列的离职的概率的数据;0表示的就是第一列数据,1表示的就是第二列数据
import pandas as pd 
df = pd.read_csv("/Users/e_information/员工信息表.csv")

# 使用replace()将"工资"列的低","中","高"替换为0,1,2
df["工资"] = df["工资"].replace({'低': 0, '中': 1, '高': 2})
# 使用drop()函数删除"离职"列,剩余的数据作为自变量x
x = df.drop(columns="离职")
# 将"离职"列,作为因变量y
y = df["离职"]

# 导入sklearn.model_selection模块中的train_test_split函数
from sklearn.model_selection import train_test_split
# 使用train_test_split()函数划分训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=123)

# 导入sklearn.tree模块中的分类决策树模型DecisionTreeClassifier
from sklearn.tree import DecisionTreeClassifier
# 使用DecisionTreeClassifier()初始化模型
# 并设置参数max_depth=3,random_state=123,赋值给model
model = DecisionTreeClassifier(max_depth=3,random_state=123)
# 使用fit()函数训练模型
model.fit(x_train, y_train)

# 将x_test传入使用predict_proba()函数预测,将结果赋值给y_pred_proba
y_pred_proba = model.predict_proba(x_test)
# TODO 输出y_pred_proba的第2列数据
print(y_pred_proba[:,1])

6.模型的改进和评价

我们的这个分类决策树进行预测的结果不一定完全吻合实际,这个时候就需要计算对应的命中率(我们成功预测)和误判率(我们的预测错误)的大小

ROC曲线

这个曲线是是命中率为y坐标,误判率为x坐标进行这个绘制的图像;

这个就是在原来的基础上面,进行这个命中率和误判率和阈值(阈值的作用:预测离职概率大于等于阈值,才能被判定为离职)的计算;

最后几行进行这个函数图像的绘制,使用plot函数作图;

import pandas as pd 
df = pd.read_csv("/Users/e_information/员工信息表.csv")

# 使用replace()将"工资"列的低","中","高"替换为0,1,2
df["工资"] = df["工资"].replace({'低': 0, '中': 1, '高': 2})
# 使用drop()函数删除"离职"列,剩余的数据作为自变量x
x = df.drop(columns="离职")

# 以二维结构读取"离职"列,作为因变量y
y = df[["离职"]]

# 导入sklearn.model_selection模块中的train_test_split函数
from sklearn.model_selection import train_test_split
# 使用train_test_split()函数划分训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=123)

# 导入sklearn.tree模块中的分类决策树模型DecisionTreeClassifier
from sklearn.tree import DecisionTreeClassifier
# 使用DecisionTreeClassifier()初始化模型
# 并设置参数max_depth=3,random_state=123,赋值给model
model = DecisionTreeClassifier(max_depth=3,random_state=123)
# 使用fit()函数训练模型
model.fit(x_train, y_train)

# 将x_test传入使用predict_proba()函数预测,将结果赋值给y_pred_proba
y_pred_proba = model.predict_proba(x_test)

# 导入sklearn.metrics模块中的roc_curve函数
from sklearn.metrics import roc_curve

# 将y_test和预测的离职概率传入roc_curve(),将结果依次赋值给fpr, tpr, thres
fpr, tpr, thres = roc_curve(y_test, y_pred_proba[:,1])

# 输出fpr, tpr, thres
print(fpr)
print(tpr)
print(thres)


# 导入matplotlib.pyplot,并使用"plt"作为该模块的简写
import matplotlib.pyplot as plt

# 使用plt.plot()函数,传入fpr为x轴的值,tpr为y轴的值,绘制折线图
plt.plot(fpr, tpr)

# 设置标题为ROC
plt.title('ROC')

# 设置x轴名称FPR
plt.xlabel('FPR')

# 设置y轴名称TPR
plt.ylabel('TPR')

# 使用plt.show()函数显示图像
plt.show()

下面这个就是去调用库里面的函数计算AUC数值衡量模型的优劣;

# 导入sklearn.metrics模块中的roc_auc_score函数
from sklearn.metrics import roc_auc_score

# 将y_test和预测的离职概率传入roc_auc_score(),将结果赋值给auc_score
auc_score = roc_auc_score(y_test, y_pred_proba[:,1])

# 输出auc_score
print(auc_score)

参数调优

就是我们使用这个默认的参数值,都可以获得想上面的这个一样比较好的预测效果(上面的这个预测结果的AUC值是0。9左右,是很好的模型),但是我们可以改变这个默认的参数,进一步去验证我们的模型的优劣性在,这个就是参数调优;

下面我们使用的是K折交叉验证进行调优;

代码的说明:

  1. cv=5表示进行五次交叉验证,model就是我们建立的模型,第二个和第三个参数就是我们的训练集,这个顺序不重要(第二个参数和第三个参数的顺序可以换)
  2. 我们打印的是每一次交叉验证的结果;
  3. 最后使用mean函数求得这几个验证结果的平均值;
import pandas as pd 
df = pd.read_csv("/Users/e_information/员工信息表.csv")

# 使用replace()将"工资"列的低","中","高"替换为0,1,2
df["工资"] = df["工资"].replace({'低': 0, '中': 1, '高': 2})
# 使用drop()函数删除"离职"列,剩余的数据作为自变量x
x = df.drop(columns="离职")

# 以二维结构读取"离职"列,作为因变量y
y = df[["离职"]]

# 导入sklearn.model_selection模块中的train_test_split函数
from sklearn.model_selection import train_test_split
# 使用train_test_split()函数划分训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=123)

# 导入sklearn.tree模块中的分类决策树模型DecisionTreeClassifier
from sklearn.tree import DecisionTreeClassifier
# 使用DecisionTreeClassifier()初始化模型
# 并设置参数max_depth=3,random_state=123,赋值给model
model = DecisionTreeClassifier(max_depth=3,random_state=123)

# 导入sklearn.model_selection模块中的交叉验证的函数cross_val_score
from sklearn.model_selection import cross_val_score

# 使用cross_val_score()函数进行交叉验证,将结果赋值给auc_score
auc_score = cross_val_score(model, x_train, y_train, scoring = 'roc_auc',cv=5)

# 输出auc_score及其平均值
print(auc_score)
print(auc_score.mean())

 GridSearch网格搜索

K折交叉验证,一方面能帮助我们更精确的评估模型;

另一方面,它经常和GridSearch网格搜索配合使用,来对模型进行参数调优。

接下来,我们一起来学习GridSearch网格搜索。

代码说明:

  1. 1,3,5,7,9就是我们选定的,可以进行这个选择的数值,从这几个里面去选最优值(深度);
  2. fit就是进行这个数据集合的训练;
  3. best_params_属性就是获得这个训练结果的最优值;
import pandas as pd 
df = pd.read_csv("/Users/e_information/员工信息表.csv")

# 使用replace()将"工资"列的低","中","高"替换为0,1,2
df["工资"] = df["工资"].replace({'低': 0, '中': 1, '高': 2})
# 使用drop()函数删除"离职"列,剩余的数据作为自变量x
x = df.drop(columns="离职")

# 以二维结构读取"离职"列,作为因变量y
y = df[["离职"]]

# 导入sklearn.model_selection模块中的train_test_split函数
from sklearn.model_selection import train_test_split
# 使用train_test_split()函数划分训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=123)

# 导入sklearn.tree模块中的分类决策树模型DecisionTreeClassifier
from sklearn.tree import DecisionTreeClassifier
# 使用DecisionTreeClassifier()初始化模型
model = DecisionTreeClassifier()

# 导入sklearn.model_selection模块中的GridSearchCV
from sklearn.model_selection import GridSearchCV

# 指定待调优参数max_depth的候选值范围,赋值给parameters
parameters = {'max_depth': [1 ,3, 5, 7, 9]}

# 使用GridSearchCV()函数进行参数调优,将结果赋值给grid_search
grid_search = GridSearchCV(model, parameters, scoring='roc_auc', cv=5)

# 传入训练集进行训练
grid_search.fit(x_train, y_train)

# 获取参数的最优值,并赋值给best_params
best_params = grid_search.best_params_

# 输出参数的最优值
print(best_params)

使用搜索结果重新建模

我们上面的遍历已经搜索出来这个最好的深度depth就是7,但是我们之前使用的是3,因此我们调整这个参数重新建模,我们只需要把上面这个过程的depth进行修改即可;

另外,我们可以使用循环依次计算不同深度的AUC数值,选择出来最好的也是可以的;下面这个代码就是分别带入这个树的深度1,3,5,7,9得到这个最优的AUC对应的这个depth=7,和我们上面搜索的结果是一样的,验证了模型的准确性;

import pandas as pd 
df = pd.read_csv("/Users/e_information/员工信息表.csv")

# 使用replace()将"工资"列的低","中","高"替换为0,1,2
df["工资"] = df["工资"].replace({'低': 0, '中': 1, '高': 2})
# 使用drop()函数删除"离职"列,剩余的数据作为自变量x
x = df.drop(columns="离职")

# 以二维结构读取"离职"列,作为因变量y
y = df[["离职"]]

# 导入sklearn.model_selection模块中的train_test_split函数
from sklearn.model_selection import train_test_split
# 使用train_test_split()函数划分训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=123)

# 导入sklearn.tree模块中的分类决策树模型DecisionTreeClassifier
from sklearn.tree import DecisionTreeClassifier
# for循环遍历列表[1,3,5,7,9]
for i in [1,3,5,7,9]:
    
    # 使用DecisionTreeClassifier()初始化模型
    # 并设置参数max_depth=i,random_state=123,赋值给model
    model = DecisionTreeClassifier(max_depth=i,random_state=123)
    
    # 使用fit()函数训练模型
    model.fit(x_train, y_train)

    # 将x_test传入使用predict_proba()函数预测,将结果赋值给y_pred_proba
    y_pred_proba = model.predict_proba(x_test)

    # 导入sklearn.metrics模块中的roc_auc_score函数
    from sklearn.metrics import roc_auc_score
    # 将y_test和预测的离职概率传入roc_curve(),将结果赋值给auc_score
    auc_score = roc_auc_score(y_test, y_pred_proba[:,1])
    # 格式化输出"max_depth={i}时,AUC值为{auc_score.round(4)}"
    print(f"max_depth={i}时,AUC值为{auc_score.round(4)}") 

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

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

相关文章

如何使用Python快速修改文件的标签(如何将歌词嵌入到音乐文件中,含歌词嵌入接口源码)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Python与Music 📒📝 1. 初探音乐文件的标签📝 使用Python修改标签📝 将歌词嵌入音乐文件⚓️ 相关链接 ⚓️📖 介绍 📖 你是否曾经听过一首好听的歌曲,却发现它的标签信息(元数据信息)杂乱无章?甚至找不到歌词?…

【Remi Pi开发板镜像烧录】使用sd卡进行瑞米派镜像的烧录

烧录大典 按照《软件开发指南》4.2.1和4.2.2的顺序进行,具体烧录哪个镜像结合你自己的需求,每个镜像的区别参考以下链接 https://mbb.eet-china.com/forum/topic/143906_1_1.html Tera term界面全屏如下设置看着比较舒服 设置完之后setup->save-&g…

智能优化特征选择|基于鹦鹉优化(2024年新出优化算法)的特征选择(分类器选用的是KNN)研究Matlab程序 【优化算法可以替换成其他优化方法】

智能优化特征选择|基于鹦鹉优化(2024年新出优化算法)的特征选择(分类器选用的是KNN)研究Matlab程序 【优化算法可以替换成其他优化方法】 文章目录 一、PO基本原理PO基本原理基本流程示例应用 二、实验结果三、核心代码四、代码获…

npm pack使用

npm pack 的作用主要是从包中创建一个压缩文件(tarball),通常具有.tgz扩展名,包含了打包的模块及其依赖,可用于分发或部署。其应用场景包括私有库或组件的分发、离线环境的依赖安装、CI/CD 自动化构建等。 在使用npm管…

UE管理内容 —— FBX Material Pipeline

目录 Material Support Multiple Materials Material Naming Material Ordering Texture Import FBX管道将应用于网格体(静态网格体和骨架网格体)的材质和纹理,从3D应用程序传输到虚幻; 要转换简单材质,可以导入源…

Gameplay Ability System(通过GameplayEffect里的Execution修改角色属性)

一、关于GameplayEffectExecutionCalculation类 1、查看GameplayEffectExecutionCalculation类的Execute函数 这个函数将编辑器里设置的参数传进来,然后通过计算再返回出去,这个函数被标记为BlueprintNativeEvent,所以我们可以在自己的类Pla…

python怎么去除换行符

在Python的编写过程中,获取到的字符串进场存在不明原因的换行和空格,如何整合成一个单句,成为问题。 方法: 一、去除空格 “ ”代表的为空格 "xyz".strip() # returns "xyz" "xyz".ls…

ES6 class小挑战

// 编码挑战 #2 /* 重新创建挑战 1,但这次使用 ES6 类; a. 添加一个名为 “speedUS ”的获取器,返回当前速度(单位:mi/h)(除以 1.6); 3. a. 添加一个名为 “speedUS ”…

RM遥控键鼠控制总结

硬件&通信介绍 RM比赛中各个参赛队伍使用的都是大疆官方提供的遥控器套装,包括遥控器和接收机,接收机上共三个引脚:VCC,GND,DBUS(数据通道),首次使用需要进行遥控器和接收机配对…

Bootstrap 滚动监听(Scrollspy)插件

滚动监听(Scrollspy)插件,即自动更新导航插件,会根据滚动条的位置自动更新对应的导航目标。其基本的实现是随着您的滚动,基于滚动条的位置向导航栏添加 .active class。 如果您想要单独引用该插件的功能,那…

快团团团长如何高质量选品?如何做最懂顾客的团长!

精准的用户画像,能够帮助团长个性化推荐,精细化营销,提升消费粘性,秒提下单率。 数据中心 用户画像 用户画像的核心,是为用户打标签。 将用户的每个具体信息抽象成标签,利用这些标签将用户具体化&#…

Docker数据卷使用手册

目录 目标 前言 概念 官方文档 匿名卷(Anonymous Volumes) 简介 案例 命名卷(Named Volumes) 简介 案例 目标 掌握Volume命令通过演示案例,理解数据卷种类与各自的用途。 前言 我们在很多网上教程上可以看到…

位数问题c++

题目描述 在所有的N位数中,有多少个数中有偶数个数字3,由于结果可能很大,你只需要输出这个答案对12345取余的值。 输入 读入一个数N(N≤1000) 输出 输出有多少个数中有偶数个数字3。 样例输入 2 样例输出 73样例解释: 1…

【SpringCloud Alibaba】(八)学习 Sentinel 核心技术与配置规则(下)

目录 1. 热点规则1.1 演示热点规则1.2 演示热点高级选项规则 2. 授权规则2.1 演示授权规则 3. 系统规则3.1 演示系统规则 4. SentinelResource 注解4.1 SentinelResource 注解概述4.2 演示 SentinelResource 注解4.2.1 定义限流和降级后的处理方法4.2.2 在外部类中指定限流和异…

Python酷库之旅-第三方库Pandas(098)

目录 一、用法精讲 421、pandas.DataFrame.infer_objects方法 421-1、语法 421-2、参数 421-3、功能 421-4、返回值 421-5、说明 421-6、用法 421-6-1、数据准备 421-6-2、代码示例 421-6-3、结果输出 422、pandas.DataFrame.copy方法 422-1、语法 422-2、参数 …

sheng的学习笔记-AI-半监督学习

AI目录:sheng的学习笔记-AI目录-CSDN博客 基础知识 什么是半监督学习 我们在丰收季节来到瓜田,满地都是西瓜,瓜农抱来三四个瓜说这都是好瓜,然后再指着地里的五六个瓜说这些还不好,还需再生长若干天。基于这些信息&a…

前端面试题-场景设计题

1. 如何使用 css 画一个三角形 借助 border 实现,在 width 和 height 都为 0 时,设置 border,便会呈现三角形。想要哪个方向的三角形,设置其他三边为 透明即可。 同时,可以通过调整不同边的宽度,来调整三角…

巨省成本的电子版招生简章越来越流行,你知道是怎么制作的吗?

随着科技的不断发展,传统的纸质招生简章逐渐被电子版招生简章所取代。电子版招生简章不仅能够节省大量成本,还能够提高宣传效果,因此在市场上越来越流行。你知道它是怎么制作的吗? 1.要制作电子杂志,首先需要选择一款适合自己的软…

Milvus在数派数据大模型业务中的实践

01. 写在前面 云南数派数据科技有限公司是一家总部位于美丽春城昆明的大模型创新企业,在深圳和昆明双城并立,设立了两个研发中心。我们的旗舰产品——SUPIEDT大模型开发平台,作为一款全生命周期的异构算力大模型开发平台,集一站式…

推荐3款好用的电脑动态壁纸软件,资源丰富,图片精美

WinDynamicDesktop WinDynamicDesktop是一款将macOS Mojave的动态桌面功能移植到Windows平台上的开源软件。它允许用户根据时间、地点和天气等条件自动更换壁纸,从而实现类似macOS系统中的动态壁纸效果。 该软件的主要特点包括: 动态壁纸:W…