数据挖掘实战-基于Catboost算法的艾滋病数据可视化与建模分析

 

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


目录

1.项目背景

2.数据集介绍

3.技术工具

4.实验过程

4.1导入数据

4.2数据预处理

4.3数据可视化

4.4特征工程

4.5模型构建

源代码


1.项目背景

        艾滋病(Acquired Immunodeficiency Syndrome,AIDS)是一种由人类免疫缺陷病毒(Human Immunodeficiency Virus,HIV)引起的免疫系统功能受损的严重疾病。艾滋病的流行给全球卫生健康带来了严重挑战,特别是在一些发展中国家和弱势群体中。

        艾滋病的研究和管理需要综合多方面的信息,包括患者的个人特征、病毒的特性、医疗历史等。利用机器学习算法对艾滋病数据进行分析和建模,有助于更好地理解该疾病的传播规律、风险因素以及预测患者的病情发展。Catboost算法作为一种擅长处理类别型特征的梯度提升树算法,在艾滋病数据的分析与建模中具有一定的优势。

        本研究旨在利用Catboost算法对艾滋病数据进行分析与建模,并结合可视化技术,探索艾滋病患者的特征与疾病发展之间的关系。通过这一研究,可以为艾滋病的预防、诊断和治疗提供更加科学有效的支持和指导。

2.数据集介绍

本数据集来源于Kaggle,数据集包含有关被诊断患有艾滋病的患者的医疗保健统计数据和分类信息。该数据集最初于 1996 年发布。

属性信息:

time:失败或审查的时间

trt:治疗指标(0 = 仅 ZDV;1 = ZDV + ddI,2 = ZDV + Zal,3 = 仅 ddI)

age:基线年龄(岁)

wtkg:基线时的体重(公斤)

hemo:血友病(0=否,1=是)

homo:同性恋活动(0=否,1=是)

drugs:静脉注射药物使用史(0=否,1=是)

karnof:卡诺夫斯基分数(范围为 0-100)

oprior:175 年前非 ZDV 抗逆转录病毒治疗(0=否,1=是)

z30:175之前30天的ZDV(0=否,1=是)

preanti:抗逆转录病毒治疗前 175 天

race:种族(0=白人,1=非白人)

gender:性别(0=女,1=男)

str2:抗逆转录病毒史(0=未接触过,1=有经验)

strat:抗逆转录病毒病史分层(1='未接受过抗逆转录病毒治疗',2='> 1 但<= 52周既往抗逆转录病毒治疗',3='> 52周)

symptom:症状指标(0=无症状,1=症状)

treat:治疗指标(0=仅ZDV,1=其他)

offrtrt:96+/-5周之前off-trt的指标(0=否,1=是)

cd40:基线处的 CD4

cd420:20+/-5 周时的 CD4

cd80:基线处的 CD8

cd820:20+/-5 周时的 CD8

infected:感染艾滋病(0=否,1=是)

3.技术工具

Python版本:3.9

代码编辑器:jupyter notebook

4.实验过程

4.1导入数据

首先导入本次实验用到的第三方库并加载数据集

查看数据大小

查看数据基本信息

查看数据描述性统计 

4.2数据预处理

统计数据缺失值情况

可以发现原始数据集并不存在缺失值,故不需要处理

统计重复值情况

可以发现原始数据集并存在重复值,故不需要处理

4.3数据可视化

为了方便后面作图,这里我们自定义一个画图函数

def mPlotter(r, c, size, _targets, text):bg = '#010108'palette = ['#df5337', '#d24644', '#f7d340', '#3339FF', '#440a68', '#84206b', '#f1ef75', '#fbbe23', '#400a67']font = 'ubuntu'fig = plt.figure(figsize=size)fig.patch.set_facecolor(bg)grid = fig.add_gridspec(r, c)grid.update(wspace=0.5, hspace=0.25)__empty_diff = ((r * c) - 1) - len(_targets)axes = []for i in range(r):for j in range(c):axes.append(fig.add_subplot(grid[i, j]))for idx, ax in enumerate(axes):ax.set_facecolor(bg) if idx == 0:ax.spines["bottom"].set_visible(False)ax.tick_params(left=False, bottom=False)ax.set_xticklabels([])ax.set_yticklabels([])ax.text(0.5, 0.5,f'{text}',horizontalalignment='center',verticalalignment='center',fontsize=18, fontweight='bold',fontfamily=font,color="#fff")else:if (idx - 1) < len(_targets):ax.set_title(_targets[idx - 1].capitalize(), fontsize=14, fontweight='bold', fontfamily=font, color="#fff")ax.grid(color='#fff', linestyle=':', axis='y', zorder=0,  dashes=(1,5))ax.set_xlabel("")ax.set_ylabel("")else:ax.spines["bottom"].set_visible(False)ax.tick_params(left=False, bottom=False)ax.set_xticklabels([])ax.set_yticklabels([])ax.spines["left"].set_visible(False)ax.spines["top"].set_visible(False)ax.spines["right"].set_visible(False)def cb(ax):ax.set_xlabel("")ax.set_ylabel("")if __empty_diff > 0:axes = axes[:-1*__empty_diff]return axes, palette, cb

开始作图 

4.4特征工程

拆分数据集为训练集和测试集

平衡数据集

数据标准化处理

4.5模型构建

首先找到catboost的最佳超参数!

使用超参数构建并训练模型,打印模型的准确率和分类报告 

将混淆矩阵可视化

最后再作出ROC曲线

源代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings,random,optuna
import plotly.express as px
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score,auc,roc_curve
from sklearn.preprocessing import MinMaxScaler
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split
from catboost import CatBoostClassifierplt.style.use('dark_background')
warnings.simplefilter('ignore', category=FutureWarning)
ds = pd.read_csv('AIDS_Classification.csv')
ds.head()
ds.shape
ds.info()
ds.describe(percentiles=[0, .25, .30, .50, .75, .80, 1]).T.style.background_gradient(cmap = 'inferno')
ds.isnull().sum()
ds.duplicated().sum()
def mPlotter(r, c, size, _targets, text):bg = '#010108'palette = ['#df5337', '#d24644', '#f7d340', '#3339FF', '#440a68', '#84206b', '#f1ef75', '#fbbe23', '#400a67']font = 'ubuntu'fig = plt.figure(figsize=size)fig.patch.set_facecolor(bg)grid = fig.add_gridspec(r, c)grid.update(wspace=0.5, hspace=0.25)__empty_diff = ((r * c) - 1) - len(_targets)axes = []for i in range(r):for j in range(c):axes.append(fig.add_subplot(grid[i, j]))for idx, ax in enumerate(axes):ax.set_facecolor(bg) if idx == 0:ax.spines["bottom"].set_visible(False)ax.tick_params(left=False, bottom=False)ax.set_xticklabels([])ax.set_yticklabels([])ax.text(0.5, 0.5,f'{text}',horizontalalignment='center',verticalalignment='center',fontsize=18, fontweight='bold',fontfamily=font,color="#fff")else:if (idx - 1) < len(_targets):ax.set_title(_targets[idx - 1].capitalize(), fontsize=14, fontweight='bold', fontfamily=font, color="#fff")ax.grid(color='#fff', linestyle=':', axis='y', zorder=0,  dashes=(1,5))ax.set_xlabel("")ax.set_ylabel("")else:ax.spines["bottom"].set_visible(False)ax.tick_params(left=False, bottom=False)ax.set_xticklabels([])ax.set_yticklabels([])ax.spines["left"].set_visible(False)ax.spines["top"].set_visible(False)ax.spines["right"].set_visible(False)def cb(ax):ax.set_xlabel("")ax.set_ylabel("")if __empty_diff > 0:axes = axes[:-1*__empty_diff]return axes, palette, cb
target = 'infected'
cont_cols = ['time', 'age', 'wtkg', 'preanti', 'cd40', 'cd420', 'cd80', 'cd820']
dis_cols = list(set(ds.columns) - set([*cont_cols, target]))
len(cont_cols), len(dis_cols)
axes, palette, cb = mPlotter(1, 2, (20, 5), [target], 'Count Of\nInfected Variable\n______________')
sns.countplot(x=ds[target], ax = axes[1], color=palette[0])
cb(axes[1])
axes, palette, cb = mPlotter(3, 3, (20, 20), cont_cols, 'KDE Plot of\nContinuous Variables\n________________')
for col, ax in zip(cont_cols, axes[1:]):sns.kdeplot(data=ds, x=col, ax=ax, hue=target, palette=palette[1:3], alpha=.5, linewidth=0, fill=True)cb(ax)
axes, palette, cb = mPlotter(3, 3, (20, 20), cont_cols, 'Boxen Plot of\nContinuous Variables\n________________')
for col, ax in zip(cont_cols, axes[1:]):sns.boxenplot(data=ds, y=col, ax=ax, palette=[palette[random.randint(0, len(palette)-1)]])cb(ax)
axes, palette, cb = mPlotter(5, 3, (20, 20), dis_cols, 'Countplot of\nDiscrete Variables\n________________')
for col, ax in zip(dis_cols, axes[1:]):sns.countplot(x=ds[col], ax = ax, hue=ds[target], palette=palette[6:8])cb(ax)
ax = px.scatter_3d(ds, x="age", y="wtkg", z="time", template= "plotly_dark", color="infected")
ax.show()
ax = px.scatter_3d(ds, x="preanti", y="cd40", z="cd420", template= "plotly_dark", color="infected")
ax.show()
ax = px.scatter_3d(ds, x="preanti", y="cd80", z="cd820", template= "plotly_dark", color="infected")
ax.show()
fig = plt.figure(figsize=(25, 8))
gs = fig.add_gridspec(1, 1)
gs.update(wspace=0.3, hspace=0.15)
ax = fig.add_subplot(gs[0, 0])
ax.set_title("Correlation Matrix", fontsize=28, fontweight='bold', fontfamily='serif', color="#fff")
sns.heatmap(ds[cont_cols].corr().transpose(), mask=np.triu(np.ones_like(ds[cont_cols].corr().transpose())), fmt=".1f", annot=True, cmap='Blues')
plt.show()
# 拆分数据集为训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(ds.iloc[:,:-1], ds.iloc[:, -1], random_state=3, train_size=.7)
x_train.shape, y_train.shape, x_test.shape, y_test.shape
# 平衡数据集
smote = SMOTE(random_state = 14)
x_train, y_train = smote.fit_resample(x_train, y_train)
x_train.shape, y_train.shape, x_test.shape, y_test.shape
# 数据标准化处理
x_train = MinMaxScaler().fit_transform(x_train)
x_test = MinMaxScaler().fit_transform(x_test)
# 找到catboost的最佳超参数!
def objective(trial):params = {'iterations': trial.suggest_int('iterations', 100, 1000),'learning_rate': trial.suggest_loguniform('learning_rate', 0.01, 0.5),'depth': trial.suggest_int('depth', 1, 12),'l2_leaf_reg': trial.suggest_loguniform('l2_leaf_reg', 1e-3, 10.0),'border_count': trial.suggest_int('border_count', 1, 255),'thread_count': -1,'loss_function': 'MultiClass','eval_metric': 'Accuracy','verbose': False}model = CatBoostClassifier(**params)model.fit(x_train, y_train, eval_set=(x_test, y_test), verbose=False, early_stopping_rounds=20)y_pred = model.predict(x_test)accuracy = accuracy_score(y_test, y_pred)return accuracystudy = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=50, show_progress_bar=True)
# 初始化模型并使用前面的最佳超参数
model = CatBoostClassifier(verbose=0, random_state=3,**study.best_params
)
# 训练模型
model.fit(x_train, y_train)
# 预测
y_pred = model.predict(x_test)
# 打印模型评估指标
print('模型准确率:',accuracy_score(y_test,y_pred))
print (classification_report(y_pred, y_test))
plt.subplots(figsize=(20, 6))
sns.heatmap(confusion_matrix(y_pred, y_test), annot = True, fmt="d", cmap="Blues", linewidths=.5)
plt.show()
# 画出ROC曲线
y_prob = model.predict_proba(x_test)[:,1]
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob) 
roc = auc(false_positive_rate, true_positive_rate)
plt.title('ROC')
plt.plot(false_positive_rate,true_positive_rate, color='red',label = 'AUC = %0.2f' % roc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],linestyle='--')
plt.axis('tight')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()
# 模型预测
res = pd.DataFrame()
res['真实值'] = y_test
res['预测值'] = y_pred
res.sample(10)

资料获取,更多粉丝福利,关注下方公众号获取

在这里插入图片描述

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

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

相关文章

Llama模型家族之RLAIF 基于 AI 反馈的强化学习(三) RLAIF 的工作原理

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

Leetcode学习

回文数 反转一半数字 第一个想法是将数字转换为字符串&#xff0c;并检查字符串是否为回文。 但是&#xff0c;这需要额外的非常量空间来创建问题描述中所不允许的字符串。 第二个想法是将数字本身反转&#xff0c;然后将反转的数字与原始数字比较&#xff0c;如果它们是相同…

Excel 交叉表的格转成列,行转成格

Excel里交叉表的左表头是卡车号&#xff0c;上表头是工作&#xff0c;交叉格是工作编号。 ABCD1Truck NumberJob1Job2Job3271592859285928372395859282971473297159282971 要求&#xff1a;将交叉格转为列&#xff0c;左表头转为格。 ABC1297139585928272727137371473715726…

Android Webview 详解

一 简介 一个基于webkit引擎、展现web页面的控件 Android 4.4前&#xff1a;Android Webview在低版本 & 高版本采用了不同的webkit版本的内核Android 4.4后&#xff1a;直接使用了Chrome内核 1.1 作用 在 Android 客户端上加载h5页面在本地 与 h5页面实现交互 & …

CorelDRAW2024最新版本有哪些功能?揭秘设计界最新神器!

“设计”一词最早来源于拉丁语“designare”&#xff0c;意为计划&#xff0c;构思。随着时代的发展&#xff0c;人们将“设计”理解为一种创造性活动&#xff0c;通过这种活动&#xff0c;人们可以创造出新的产品、新的场景以及新的体验。 「CorelDRAW汉化版下载」&#xff0c…

【猫狗识别系统】图像识别Python+TensorFlow+卷积神经网络算法+人工智能深度学习

猫狗识别系统。通过TensorFlow搭建MobileNetV2轻量级卷积神经算法网络模型&#xff0c;通过对猫狗的图片数据集进行训练&#xff0c;得到一个进度较高的H5格式的模型文件。然后使用Django框架搭建了一个Web网页端可视化操作界面。实现用户上传一张图片识别其名称。 一、前言 …

外部mysql导入

利用这个命令&#xff1a; mysql -u username -p database_name < file.sql 然后就这样。成功导入。

【全开源】废品回收垃圾回收小程序APP公众号源码PHP版本

&#x1f31f;废品回收小程序&#xff1a;绿色生活的新助手&#x1f331; 一、引言 随着环保意识的逐渐提高&#xff0c;废品回收成为了我们日常生活中的重要一环。但是&#xff0c;如何更方便、高效地进行废品回收呢&#xff1f;今天&#xff0c;我要向大家推荐一款超级实用…

22 - 游戏玩法分析 IV(高频 SQL 50 题基础版)

22 - 游戏玩法分析 IV 考点&#xff1a; 聚合函数 # 日期相加 date_add(min(event_date),INTERVAL 1 DAY) select round(count(distinct player_id)/(select count(distinct player_id) from Activity),2) fraction fromActivity where-- 如果日期加一天的数据能在表中…

ffmpeg视频编码原理和实战-(2)视频帧的创建和编码packet压缩

源文件&#xff1a; #include <iostream> using namespace std; extern "C" { //指定函数是c语言函数&#xff0c;函数名不包含重载标注 //引用ffmpeg头文件 #include <libavcodec/avcodec.h> } //预处理指令导入库 #pragma comment(lib,"avcodec.…

覆盖路径规划经典算法 The Boustrophedon Cellular Decomposition 详解

2000年一篇论文 Coverage of Known Spaces: The Boustrophedon Cellular Decomposition 横空出世&#xff0c;解决了很多计算机和机器人领域的覆盖路径问题&#xff0c;今天我来详细解读这个算法。 The Boustrophedon Cellular Decomposition 算法详解 这篇论文标题为"C…

Ubuntu系统本地搭建WordPress网站并发布公网实现远程访问

文章目录 前言1. 搭建网站&#xff1a;安装WordPress2. 搭建网站&#xff1a;创建WordPress数据库3. 搭建网站&#xff1a;安装相对URL插件4. 搭建网站&#xff1a;内网穿透发布网站4.1 命令行方式&#xff1a;4.2. 配置wordpress公网地址 5. 固定WordPress公网地址5.1. 固定地…

UE5 Mod Support 思路——纯蓝图

原创作者&#xff1a;Chatouille 核心功能 “Get Blueprint Assets”节点&#xff0c;用于加载未来的mod。用基础类BP_Base扩展即可。打包成补丁&#xff0c;放到Content\Paks目录下&#xff0c;即可让游戏访问到内容。 与文中所写不同的地方 5.1或者5.2开始&#xff0c;打…

【YOLOv10】使用 TensorRT C++ API 调用GPU加速部署 YOLOv10 实现 500FPS 推理速度——快到飞起!

NVIDIA TensorRT ™ 是一款用于高性能深度学习推理的 SDK&#xff0c;包含深度学习推理优化器和运行时&#xff0c;可为推理应用程序提供低延迟和高吞吐量。YOLOv10是清华大学研究人员近期提出的一种实时目标检测方法&#xff0c;通过消除NMS、优化模型架构和引入创新模块等策…

WWDC24即将到来,ios18放大招

苹果公司即将在下周开全球开发者大会(WWDC)&#xff0c;大会上将展示其人工智能技术整合到设备和软件中的重大进展,包括与OpenAI的历史性合作。随着大会的临近,有关iOS 18及其据称采用AI技术支持的应用程序和功能的各种泄露信息已经浮出水面。 据报道,苹果将利用其自主研发的大…

Java 8 中的 Stream API,用于处理集合数据

Java 8 引入了 Stream API&#xff0c;使得处理集合数据变得更加简洁和高效。Stream API 允许开发者以声明式编程风格操作数据集合&#xff0c;而不是使用传统的迭代和条件语句。 一、基本概念 1.1 什么是 Stream Stream 是 Java 8 中的一个新抽象&#xff0c;它允许对集合数…

创新实训2024.06.03日志:完善Baseline Test框架、加入对Qwen-14B的测试

1. Baseline Test框架重构与完善 在之前的一篇博客中&#xff08;创新实训2024.05.29日志&#xff1a;评测数据集与baseline测试-CSDN博客&#xff09;&#xff0c;我介绍了我们对于大模型进行基线测试的一些基本想法和实现&#xff0c;包括一些基线测试的初步结果。 后来的一…

PS初级|写在纸上的字怎么抠成透明背景?

前言 上一次咱们讲了很多很多很多的抠图教程&#xff0c;这次继续。。。最近有小伙伴问我&#xff1a;如果是写在纸上的字&#xff0c;要怎么把它抠成透明背景。 这个其实很简单&#xff0c;直接来说就是选择通道来抠。但有一点要注意的是&#xff0c;写在纸上的字&#xff0…

算法-分治策略

概念 分治算法&#xff08;Divide and Conquer&#xff09;是一种解决问题的策略&#xff0c;它将一个问题分解成若干个规模较小的相同问题&#xff0c;然后递归地解决这些子问题&#xff0c;最后合并子问题的解得到原问题的解。分治算法的基本思想是将复杂问题分解成若干个较…

Java使用GDAL来解析KMZ及KML实战

目录 前言 一、在GQIS中浏览数据 1、关于空间参考 2、属性表格 二、GDAL的相关驱动及解析实战 1、GDAL中的KMZ驱动 2、GDAL实际解析 三、数据解析成果 1、KML解析结果 2、KMZ文件入库 四、总结 前言 在前面的博客中讲过纯Java实现Google地图的KMZ和KML文件的解析&…