Xgboost分类模型的完整示例

在这里插入图片描述

往期精彩推荐

  • 数据科学知识库
  • 机器学习算法应用场景与评价指标
  • 机器学习算法—分类
  • 机器学习算法—回归
  • PySpark大数据处理详细教程

定义问题

UCI的蘑菇数据集的主要目的是为了分类任务,特别是区分蘑菇是可食用还是有毒。这个数据集包含了蘑菇的各种特征,如帽形、颜色、气味等,以及一个标签表示蘑菇是否有毒。通过对这些特征的分析,可以构建分类模型来预测任何一个蘑菇样本是否有毒。这种类型的任务对于练习数据科学和机器学习技能,尤其是分类算法的应用和理解,非常有帮助。

导入相关库

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.metrics import classification_report
from xgboost import XGBClassifier
from sklearn.model_selection import RandomizedSearchCV
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
import matplotlib.pyplot as plt
import shap

加载数据集

# 数据集的URL
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/mushroom/agaricus-lepiota.data"# 定义列名
column_names = ["class", "cap-shape", "cap-surface", "cap-color", "bruises", "odor","gill-attachment", "gill-spacing", "gill-size", "gill-color", "stalk-shape","stalk-root", "stalk-surface-above-ring", "stalk-surface-below-ring","stalk-color-above-ring", "stalk-color-below-ring", "veil-type", "veil-color","ring-number", "ring-type", "spore-print-color", "population", "habitat"]# 加载数据集
mushroom_data = pd.read_csv(url, names=column_names)# 查看数据集的前几行
mushroom_data.head(5)

在这里插入图片描述

数据探索

统计数据可以帮助您快速了解数据的分布情况、中心趋势和离散程度。在数据分析和机器学习的前期阶段,这是一个常用的探索性数据分析(EDA)步骤。

mushroom_data.describe()

在这里插入图片描述

数据预处理

去除异常值

# 可以根据均值标准差来定义异常值
均值 ± 3倍标准差  之外的定义为异常值

缺失值填充

mushroom_data = mushroom_data.fillna(0)

数值类型转换

# 将分类数据转换为数值
label_encoder = LabelEncoder()
for column in mushroom_data.columns:mushroom_data[column] = label_encoder.fit_transform(mushroom_data[column])

划分训练集与测试集

# 划分训练集和测试集
X = mushroom_data.drop('class', axis=1)
y = mushroom_data['class']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

均衡采样与模型定义

# 计算正负样本比例,在XGBoost模型中设置scale_pos_weight
scale_pos_weight = sum(y_train == 0) / sum(y_train == 1)# 定义模型
xgb_model = XGBClassifier(use_label_encoder=False, eval_metric='logloss', scale_pos_weight=scale_pos_weight)

随机搜索选参

定义XGBoost的参数搜索范围,并使用RandomizedSearchCV进行随机搜索,以找到最佳的超参数。

param_distributions = {'n_estimators': [100, 300, 500, 800, 1000],  # 表示树的个数。增加树的数量可以提高模型的复杂度,但也可能导致过拟合。'learning_rate': [0.01, 0.05, 0.1, 0.15, 0.2],  # 学习率,用于控制每棵树对最终结果的影响。较低的学习率意味着模型需要更多的树来进行训练。'max_depth': [3, 4, 5, 6, 7, 8],  # 树的最大深度。更深的树会增加模型的复杂度,但也可能导致过拟合。'min_child_weight': [1, 2, 3, 4],  # 决定最小叶子节点样本权重和。较大的值可以防止模型过于复杂,从而避免过拟合。'subsample': [0.6, 0.7, 0.8, 0.9, 1.0],  # 用于控制每棵树随机采样的比例,减少这个参数的值可以使模型更加保守,防止过拟合。'colsample_bytree': [0.6, 0.7, 0.8, 0.9, 1.0],  # 用于每棵树的训练时,随机采样的特征的比例。减少这个参数的值同样可以防止模型过于复杂。'gamma': [0, 0.1, 0.2, 0.3, 0.4]  # 后剪枝时,作为节点分裂所需的最小损失函数下降值。该参数值越大,算法越保守。
}random_search = RandomizedSearchCV(xgb_model, param_distributions, n_iter=50, cv=5, random_state=42
)
random_search.fit(X_train, y_train)best_params = random_search.best_params_
xgb_model.set_params(**best_params)

模型评估

使用找到的最佳参数训练XGBoost模型,然后在测试集上进行评估,计算性能指标如准确率、精确率、召回率和F1分数。

xgb_model.fit(X_train, y_train)
y_pred = xgb_model.predict(X_test)
# 混淆矩阵
cm = confusion_matrix(y_test, y_pred)
tn, fp, fn, tp = cm.ravel()
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)performance_df = pd.DataFrame({'TN': [tn], 'FP': [fp], 'FN': [fn], 'TP': [tp],'Accuracy': [accuracy_score(y_test, y_pred)],'Precision': [precision_score(y_test, y_pred)],'Recall': [recall_score(y_test, y_pred)],'F1 Score': [f1_score(y_test, y_pred)]})
# 展示模型评估结果
performance_df.head()

标准数据集,结果太完美了,实际数据集就差强人意了

在这里插入图片描述

模型特征重要性展示

# 获取特征重要性
feature_importances = xgb_model.feature_importances_# 可视化特征重要性
plt.style.use("ggplot")
plt.barh(range(len(feature_importances)), feature_importances)
plt.yticks(range(len(X.columns)), X.columns)
plt.xlabel('Feature Importance')
plt.title('Feature Importance in XGBoost Model')
plt.show()

在这里插入图片描述

SHAP负例分析

SHAP库提供了多种可视化工具,可以帮助您更深入地了解模型的行为。使用SHAP库计算XGBoost模型的SHAP值,分析被模型错误分类为负例的情况,并通过可视化来理解影响这些预测的关键特征在进行负例分析时,您可以专注于那些被模型错误分类的样本,并使用SHAP值来探究背后的原因。

# 计算SHAP值
explainer = shap.Explainer(xgb_model, X_train)
shap_values = explainer(X_test)# 可视化:展示单个预测的SHAP值
shap.initjs()
# shap.force_plot(explainer.expected_value, shap_values[0,:], X_test[0,:])# 可视化:展示所有测试数据的SHAP值
shap.summary_plot(shap_values, X_test)

在这里插入图片描述

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

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

相关文章

【读书笔记】网空态势感知理论与模型(四)

一个网空态势感知整合框架 1. 引言 网空态势感知过程可以看作包含态势观察、态势理解和态势预测3个阶段。 态势观察:提供环境中相关元素的状态、属性和动态信息。 态势理解:包括人们如何组合、解释、存储和留存信息。 态势预测:对环境&a…

系统学习Python——装饰器:函数装饰器-[装饰器状态保持方案:外层作用域和非局部变量]

分类目录:《系统学习Python》总目录 我们在某些情况下可能想要共享全局状态。如果我们真的想要每个函数都有自己的计数器,要么像前面的文章那样使用类,要么使用Python3.X中的闭包函数(工厂函数)和nonlocal语句。由于这…

浪潮软件开发校招面试一面凉经

本文介绍2024届秋招中,浪潮通信信息系统有限公司的软件开发工程师岗位一面的面试基本情况、提问问题等。 10月投递了浪潮通信信息系统有限公司的软件开发工程师岗位,并不清楚所在的部门。目前完成了一面,在这里记录一下一面经历。 首先&#…

听GPT 讲Rust源代码--library/alloc

File: rust/library/alloc/benches/slice.rs 在Rust源代码中,rust/library/alloc/benches/slice.rs文件的作用是对&[T]类型(切片类型)进行性能基准测试。该文件包含了对切片类型的一系列操作的基准测试,例如切片迭代、切片排序…

【Python百宝箱】音律编织:Python语音合成库的技术交响曲

未来声音的奇妙之旅:深度学习与云端语音服务的交汇 前言 在当今数字化时代,语音合成技术在各个领域的应用日益广泛,从辅助技术到娱乐媒体,都展现出巨大的潜力。本文将带您深入了解语音合成的世界,从简单易用的库如py…

0101包冲突导致安装docker失败-docker-云原生

文章目录 1 前言2 报错3 解决结语 1 前言 最近在学习k8s,前置条件就是要安装指定版本的docker,命令如下 yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.62 报错 file /usr/libexec/docker/cli-plugins/docker-buildx fr…

微信多商户商城小程序/公众号/h5/app/社区团购/外卖点餐/商家入驻/在线客服/知识付费/商品采集

多个源码二开合一!!包含:多商户商城/社区团购/外卖点餐/在线客服/知识付费/投票 。。。等等!!! 前台可自定义装修!!装修成为如下程序 1、小程序,公众号,h5,app多端合一 2、用户论坛 积分签到 3、知识付费、题库管理、课程设置 4、同城配送,配送员设置 5、餐饮…

用 print 太慢了!强烈推荐这款Python Debug工具~

作为程序员,我们都深知调试(Debug)在编程过程中的重要性。 然而,使用传统的"print"语句进行调试可能效率较低,今天,笔者将推荐一款独具一格的Python调试工具——Reloadium。 Reloadium为IDE添加…

sparkstreamnig实时处理入门

1.2 SparkStreaming实时处理入门 1.2.1 工程创建 导入maven依赖 <dependency><groupId>org.apache.spark</groupId><artifactId>spark-streaming_2.12</artifactId><version>3.1.2</version> </dependency> <dependency…

C++初阶——基础知识(内联函数)

目录 1.内联函数 内联函数的示例代码 1.内联函数 是一种 C 中的函数定义方式&#xff0c;它告诉编译器在每个调用点上插入函数体的副本&#xff0c;而不是像普通函数那样在调用时跳转到函数体所在的地址执行。这样可以减少函数调用的开销&#xff0c;提高程序的执行效率。 …

从入门到精通,30天带你学会C++【第十天:猜数游戏】

目录 Everyday English 前言 实战1——猜数游戏 综合指标 游玩方法 代码实现 最终代码 试玩时间 必胜策略 具体演示 结尾 Everyday English All good things come to those who wait. 时间不负有心人 前言 今天是2024年的第一天&#xff0c;新一年&#xff0c;新…

深入理解和运用C语言中的Break语句

各位少年 尊敬的读者们&#xff0c; 在C语言编程中&#xff0c;控制程序流程是我们编写高效代码的关键。今天&#xff0c;我们将一起探讨一种能够立即终止循环或开关语句的关键字——Break。 一、理解Break语句 Break关键字在C语言中用于立即退出当前的循环&#xff08;如f…

【网络】修改网口名字|网络设备|网口管理

目录 系统的网口(网络设备)命名规则 修改网口(网络设备)命名 永久修改 临时修改 使用传统eth0、eth1的命名方式 注意事项 系统的网口(网络设备)命名规则 ens35f0 这个名称是基于 Linux 的网络接口命名规则生成的。 在较新的 Linux 发行版中&#xff0c;网络接口的命名规…

LC106. 从中序与后序遍历序列构造二叉树

参考&#xff1a;代码随想录 class Solution {Map<Integer,Integer> map ;public TreeNode buildTree(int[] inorder, int[] postorder) {map new HashMap<>();for(int i 0 ; i < inorder.length; i ){map.put(inorder[i],i);}return findNode(inorder,0,inor…

计算机毕业设计——springboot养老院管理系统 养老院后台管理

1&#xff0c;绪论 1.1 背景调研 养老院是集医疗、护理、康复、膳食、社工等服务服务于一体的综合行养老院&#xff0c;经过我们前期的调查&#xff0c;院方大部分工作采用手工操作方式,会带来工作效率过低&#xff0c;运营成本过大的问题。 院方可用合理的较少投入取得更好…

声明式导航传参详情

1 动态路由传参 路由规则path ->/article/:aid 导航链接 <router-link to"/article/1">查看第一篇文章</router-link> 组件获取参数: this.$route.params.aid 如果想要所有的值&#xff0c;就用this. $route. params 注意&#xff1a;这两个必须匹配…

Spring Cloud Function SpEL注入漏洞(CVE-2022-22963)分析

一、概述 2022年3月24日&#xff0c;Pivotal修补了Spring Cloud Function中一个关键的服务器端代码注入漏洞&#xff08;Spring表达式语言注入&#xff09;&#xff0c;该漏洞有可能导致系统被攻击。Spring是一种流行的开源Java框架&#xff0c;该漏洞与另一个相关的远程代码执…

Dirichlet Process (徐亦达老师)狄利克雷过程

混合高斯模型的例子 混合高斯模型 混合高斯模型&#xff08;Mixture of Gaussians&#xff0c;简称GMM&#xff09;是一种概率模型&#xff0c;用于对复杂的数据分布进行建模。它是由多个高斯分布组合而成的混合模型&#xff0c;每个高斯分布&#xff08;称为组件&#xff09;…

86 滑动窗口判断是否有重复元素II

问题描述&#xff1a;给定一个整数数组和一个整数k&#xff0c;判断数组中是否存在两个不同的索引i和j&#xff0c;使得nums[i]nums[j],并且i和j的绝对值最多为k。 map求解&#xff1a;首先将第一个元素放入map中&#xff0c;因为它不可能与任何一个元素构成队列&#xff0c;然…

HJ108 求最小公倍数

题目&#xff1a; HJ108 求最小公倍数 题解&#xff1a; 辗转相除法求出最大公约数&#xff0c;然后求出最小公倍数。 public int gcd(int a, int b) {if (b 0) {return a;}return gcd(b, a%b);} 时间复杂度&#xff1a;O(N)