使用SVM对心脏数据是否患病进行分类预测

作者简介

杜嘉宝,男,西安工程大学电子信息学院,2024级研究生
研究方向:变压器故障预警与检测
电子邮件:djb857497378@gmail.com
王子谦,男,西安工程大学电子信息学院,2024级研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:1523018430@qq.com

在这篇文章中,我将分享如何使用支持向量机(SVM)算法对心脏病数据进行分类。整个流程包括数据加载、预处理、SMOTE过采样、PCA降维、超参数调优、灰狼优化算法的使用等。通过这篇文章,希望你能够了解如何通过集成不同技术实现更好的分类效果。

1. 安装包的准备

首先,你需要安装必要的Python库。以下是一些主要的库:
pip install numpy pandas scikit-learn imbalanced-learn matplotlib
这些库提供了SVM、SMOTE过采样、PCA降维以及其他常用的数据处理工具。

2. 数据集介绍

本次我们使用的是UCI心脏病数据集,包含多种与心脏病相关的特征,如年龄、性别、血压、胆固醇水平等。数据集中的目标变量target有五个不同的类别,表示不同程度的心脏病。
通过加载数据,我们将其分为特征集(X)和目标值(y),并进行清洗(将?替换为0)。

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data"
columns = ["age", "sex", "cp", "trestbps", "chol", "fbs", "restecg", "thalach", "exang", "oldpeak", "slope", "ca", "thal", "target"]
features, target = load_data(url, columns)

3. SVM算法介绍

支持向量机(SVM)是一种强大的分类算法,尤其适合处理高维数据。它的目标是寻找一个超平面,将不同类别的样本分开,并且最大化类别之间的间隔。在这篇文章中,我们使用SVC(支持向量分类)来实现心脏病数据的分类。

from sklearn.svm import SVC
svm_clf = SVC(kernel='rbf', C=1.0, gamma=0.1)
svm_clf.fit(X_train, y_train)

4. SMOTE算法介绍

在心脏病数据集中,类别不平衡问题较为严重。为了解决这个问题,我们使用了SMOTE(Synthetic Minority Over-sampling Technique)算法,通过生成合成样本来平衡各个类别。

from imblearn.over_sampling import SMOTE
X_resampled, y_resampled = smote(X_train, y_train, sampling_strategy={2: 55, 3: 55, 4: 55})

5. GridSearch算法

为了寻找SVM模型的最佳超参数,我们使用了GridSearchCV进行超参数搜索。通过在不同的C和gamma值之间进行网格搜索,找出最优的组合。

from sklearn.model_selection import GridSearchCV
gridsearch(X_train, y_train, X_test, y_test)

6. PCA算法介绍

主成分分析(PCA)是降维的常用方法,可以在保留数据大部分信息的情况下,减少数据的维度。在本次任务中,我们使用PCA将数据维度降到95%的信息量。

from sklearn.decomposition import PCA
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)

7. 灰狼优化算法介绍

灰狼优化算法(Grey Wolf Optimizer, GWO)是一种模拟灰狼捕猎行为的优化算法。在这里,我们使用灰狼优化算法来寻找SVM模型的最佳超参数C和gamma。

def grey_wolf_optimizer(...):# 代码实现见下文return alpha_pos, alpha_score

灰狼优化算法通过模拟灰狼群体的领导行为,帮助我们在搜索空间中找到最优解。

8. 实现流程

8.1 数据加载与预处理

首先,加载数据集,并进行数据清洗。然后,使用SMOTE算法处理类别不平衡问题。

(X_train, X_test, y_train, y_test) = train_test_split(features, target, test_size=0.3, random_state=1, stratify=target)
X_train, y_train = smote(X_train, y_train, sampling_strategy={2: 38, 3: 38, 4: 38})

8.2 数据标准化与PCA降维

使用StandardScaler对数据进行标准化处理,并使用PCA降维。

X_train, X_test = scaler(X_train, X_test)
pca = PCA(n_components=0.95)
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)

8.3 模型训练与优化

使用SVM进行训练,并通过灰狼优化算法调整超参数。

print(grey_wolf_optimizer(0, 100, 10000, 100, 2, X_train, y_train, X_test, y_test))

8.4 可视化

使用Matplotlib进行数据可视化,展示PCA降维后的数据分布。

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X_train[:, 0], X_train[:, 1], X_train[:, 2], c=y_train, cmap='viridis', alpha=0.7)

9. 源代码

Utils.py
import numpy as np
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
from sklearn.decomposition import PCAdef scaler(x_train, x_test):standard_transform = StandardScaler()return standard_transform.fit_transform(x_train), standard_transform.fit_transform(x_test)def gridsearch(x_train, y_train, x_test, y_test):C = np.linspace(0,100,100)gamma = np.linspace(0,100,100)param_grid = {'C' : C,'gamma':gamma,'kernel':['rbf','poly']}svm_clf = SVC()grid_search = GridSearchCV(estimator=svm_clf,param_grid=param_grid,n_jobs=-1,cv=5,scoring='accuracy')grid_search.fit(x_train,y_train)print('网格中最优参数:',grid_search.best_params_)print('测试集的准确率:',grid_search.score(x_test,y_test))def apply_pca(data, n_components):# 标准化数据,使其均值为0,方差为1pca_scaler = StandardScaler()scaled_data = pca_scaler.fit_transform(data)# 进行 PCA 降维pca = PCA(n_components=n_components)reduced_data = pca.fit_transform(scaled_data)# 获取解释方差比例explained_variance = pca.explained_variance_ratio_return reduced_data, explained_variancedef grey_wolf_optimizer(lb, ub, n_wolves, max_iter, dim, x_train, y_train, x_test, y_test):# 定义目标函数def objective_function(C, gamma):clf = SVC(kernel='rbf', C=C, gamma=gamma, random_state=1)clf.fit(x_train, y_train)return 1 - clf.score(x_test, y_test)# 初始化狼群wolves = np.random.uniform(lb, ub, (n_wolves, dim))# 初始化 alpha、beta、delta 位置及适应度值alpha_pos = np.zeros(dim)alpha_score = float('inf')beta_pos = np.zeros(dim)beta_score = float('inf')delta_pos = np.zeros(dim)delta_score = float('inf')# 迭代优化for t in range(max_iter):# 计算当前狼群的适应度for i in range(n_wolves):wolves[i, :] = np.clip(wolves[i, :], lb, ub)  # 约束搜索范围C = max(float(wolves[i, 0]), 1e-3)gamma = max(float(wolves[i, 1]),1e-3)fitness = objective_function(C, gamma)# 更新 alpha、beta、deltaif fitness < alpha_score:delta_score, delta_pos = beta_score, beta_pos.copy()beta_score, beta_pos = alpha_score, alpha_pos.copy()alpha_score, alpha_pos = fitness, wolves[i, :].copy()elif fitness < beta_score:delta_score, delta_pos = beta_score, beta_pos.copy()beta_score, beta_pos = fitness, wolves[i, :].copy()elif fitness < delta_score:delta_score, delta_pos = fitness, wolves[i, :].copy()# 计算系数 aa = 2 - t * (2 / max_iter)# 更新狼群位置for i in range(n_wolves):r1, r2 = np.random.rand(dim), np.random.rand(dim)A1 = 2 * a * r1 - aC1 = 2 * r2D_alpha = abs(C1 * alpha_pos - wolves[i, :])X1 = alpha_pos - A1 * D_alphar1, r2 = np.random.rand(dim), np.random.rand(dim)A2 = 2 * a * r1 - aC2 = 2 * r2D_beta = abs(C2 * beta_pos - wolves[i, :])X2 = beta_pos - A2 * D_betar1, r2 = np.random.rand(dim), np.random.rand(dim)A3 = 2 * a * r1 - aC3 = 2 * r2D_delta = abs(C3 * delta_pos - wolves[i, :])X3 = delta_pos - A3 * D_delta# 计算新位置wolves[i, :] = (X1 + X2 + X3) / 3print(f"Iteration {t+1}: Best C={alpha_pos[0]}, Best gamma={alpha_pos[1]}, Best fitness={1-alpha_score}")return alpha_pos, alpha_score
load_data.pyimport pandas as pd
import numpy as  np
from imblearn.over_sampling import SMOTEdef load_data(url, columns):# 读取数据df = pd.read_csv(url, names=columns)df_cleaned = df.replace('?', 0)X = df_cleaned.iloc[:, :-1]  # 特征y = df_cleaned.iloc[:, -1]   # 目标值return X, ydef smote(x, y, sampling_strategy, random_state=1, k_neighbors=1):smote = SMOTE(random_state=random_state, sampling_strategy=sampling_strategy, k_neighbors=k_neighbors)x_resampled, y_resampled = smote.fit_resample(x, y)return x_resampled, y_resampledif __name__ == '__main__':url = "https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data"columns = ["age", "sex", "cp", "trestbps", "chol", "fbs", "restecg", "thalach","exang", "oldpeak", "slope", "ca", "thal", "target"]features, target = load_data(url, columns)labels, count = np.unique(target, return_counts=True)print('labels', labels, '  ', 'count:', count)sampling_strategy = {2: 55, 3: 55, 4: 55}smote = SMOTE(random_state=42, sampling_strategy=sampling_strategy, k_neighbors=1)features_resampled, target_resampled = smote.fit_resample(features, target)labels, count = np.unique(target_resampled, return_counts=True)
print('labels', labels, '  ', 'count:', count)train.py
from sklearn.model_selection import train_test_split
from load_data import load_data, smote
from utils import scaler, gridsearch,grey_wolf_optimizer
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCAurl = "https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data"
columns = ["age", "sex", "cp", "trestbps", "chol", "fbs", "restecg", "thalach", "exang", "oldpeak", "slope", "ca", "thal", "target"]
features, target = load_data(url, columns)
(X_train,X_test,y_train,y_test) = train_test_split(features, target,test_size=0.3,random_state=1,stratify=target)
labels, count = np.unique(y_train, return_counts=True)
print('labels', labels, '  ', 'count:', count)
sampling_strategy = {2: 38, 3: 38, 4: 38}
X_train, y_train = smote(X_train, y_train,sampling_strategy)
labels, count = np.unique(y_train, return_counts=True)
print('labels', labels, '  ', 'count:', count)
X_train, X_test = scaler(X_train,X_test)
pca = PCA(n_components=0.95)
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X_train[:, 0], X_train[:, 1], X_train[:, 2], c=y_train, cmap='viridis', alpha=0.7)ax.set_xlabel("Principal Component 1")
ax.set_ylabel("Principal Component 2")
ax.set_zlabel("Principal Component 3")
ax.set_title("PCA 3D Scatter Plot")
plt.show()
print(grey_wolf_optimizer(0,100,10000,100,2,X_train,y_train,X_test,y_test))

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

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

相关文章

Node做BFF中间层架构优化前端开发体验并提升系统整体性能。

文章目录 1. BFF 层的定位2. 技术选型3. 架构设计3.1 分层设计3.2 示例架构 4. 核心功能实现4.1 数据聚合4.2 权限校验4.3 缓存优化 5、实战示例1. 场景说明2. ECharts 数据格式要求3. BFF 层实现步骤3.1 接收前端参数3.2 调用后端服务获取数据 4. 前端使用 总结 在使用 Node.j…

文件系统 软硬连接

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 一、理解文件系统 &#x1f320;磁盘结构 二、软硬连接 &#x1f31f;软硬链接 &#x1f320;软链接&#xff1a; &#x1f320;硬链接&#xff1a; &#x1f31f;理解软硬链接的应…

单片机 | 基于51单片机的自动循迹小车设计

以下是一个基于51单片机的自动循迹小车设计详解,包含原理、公式和完整代码: 一、系统原理 核心模块: 传感器:红外对管(TCRT5000)x4主控芯片:STC89C52RC(51单片机)电机驱动:L298N驱动模块电源:7.4V锂电池(电机) + 5V稳压(单片机)工作原理: 红外对管发射红外线,…

2025.04.17【Stacked area】| 生信数据可视化:堆叠区域图深度解析

文章目录 生信数据可视化&#xff1a;堆叠区域图深度解析堆叠面积图简介为什么使用堆叠面积图如何使用R语言创建堆叠面积图安装和加载ggplot2包创建堆叠面积图的基本步骤示例代码 解读堆叠面积图堆叠面积图的局限性实际应用案例示例&#xff1a;基因表达量随时间变化 结论 生信…

基于单片机的智能养生油炸炉系统设计与实现

标题:基于单片机的智能养生油炸炉系统设计与实现 内容:1.摘要 本文针对传统油炸炉功能单一、无法满足现代养生需求的问题&#xff0c;设计并实现了基于单片机的智能养生油炸炉系统。通过采用STC89C52单片机作为控制核心&#xff0c;结合温度传感器、液位传感器、继电器等硬件&…

QML与C++:基于ListView调用外部模型进行增删改查(附自定义组件)

目录 引言相关阅读项目结构文件组织 核心技术实现1. 数据模型设计联系人项目类 (datamodel.h)数据模型类 (datamodel.h)数据模型实现 (datamodel.cpp) 2. 主程序入口点 (main.cpp)3. 主界面设计 (Main.qml)4. 联系人对话框 (ContactDialog.qml)5. 自定义组件CustomTextField.qm…

【MySQL】事务ACID理解记忆

事务的 ACID 特性详解 数据库中的 事务&#xff08;Transaction&#xff09; 是一组操作的集合&#xff0c;这些操作要么全部执行&#xff0c;要么全部不执行。为了保证事务可靠执行&#xff0c;必须满足 ACID 四大特性&#xff1a; 特性英文缩写简要说明原子性Atomicity事务…

MYSQL “Too Many Connections“ 错误解决

1.查询当前连接数 show status like "Threads_connected"; 2.查询数据库最大连接数 show variables like "max_connections" 3.查询所有活动连接 show processlist; 4.根据查询结果观察是否有长时间未被释放的连接 参数解释 : 字段说明id连接的唯一…

Python爬虫实战:基于 Scrapy 框架的微博数据爬取研究

一、引言 1.1 研究背景 在当今数字化时代,社交媒体已成为信息传播和公众交流的重要平台。微博作为国内极具影响力的社交媒体之一,每日产生海量的用户生成内容,涵盖新闻资讯、社交互动、娱乐八卦、热点话题讨论等多个领域。这些数据不仅反映了公众的兴趣偏好、情感态度和社…

猫咪如厕检测与分类识别系统系列【九】视频检测区域在线绘制+支持摄像头+网络摄像头+整体构建【上】

前情提要 家里养了三只猫咪&#xff0c;其中一只布偶猫经常出入厕所。但因为平时忙于学业&#xff0c;没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关&#xff0c;频繁如厕可能是泌尿问题&#xff0c;停留过久也可能是便秘或不适。为了更科学地了解牠的如…

【AI插件开发】Notepad++ AI插件开发实践:支持多平台多模型

引言 上篇文章我们的Notepad插件介绍到Dock窗口集成&#xff0c;本篇将继续完善插件功能&#xff0c;主要包括两个部分&#xff1a; 支持多平台、多模型支持多种授权验证、接口类型 一、多平台 原先的配置项很简单&#xff1a; // PluginConf.h class PlatformConf { publ…

【C#】Socket通信的使用

在C#中&#xff0c;Socket通信是一种用于实现网络通信的底层技术。通过Socket&#xff0c;程序可以在网络上与其他设备进行数据交换。以下是如何使用C#中的System.Net.Sockets命名空间来实现Socket通信的详细步骤。 1. Socket通信的基本概念 Socket: 一个Socket是网络通信的端…

2024年第九届团队程序设计天梯赛c++题解L1-L3-1(附PTA网址)

L1-1 编程解决一切 5分 L1-097 编程解决一切 - 团体程序设计天梯赛-练习集 (pintia.cn)https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId1781658570803388416 #include<bits/stdc.h> #define int long long using namesp…

ICMAN防水触摸芯片 - 复杂环境下精准交互,提升触控体验

▍核心优势 ◆ 超强抗干扰能力 ◆ 工业级设计&#xff0c;一致性和稳定性好 ▍提供场景化解决方案 【智能厨电矩阵】抽油烟机档位调节 | 电磁炉火力触控 | 洗碗机模式切换 【卫浴设备方案】淋浴房雾化玻璃控制 | 智能马桶触控面板 | 浴缸水位感应 【工业控制应用】仪器仪…

Golang|抽奖相关

文章目录 抽奖核心算法生成抽奖大转盘抽奖接口实现 抽奖核心算法 我们可以根据 单商品库存量/总商品库存量 得到每个商品被抽中的概率&#xff0c;可以想象这样一条 0-1 的数轴&#xff0c;数轴上的每一段相当于一种商品&#xff0c;概率之和为1。 抽奖时&#xff0c;我们会生…

OpenCV 图形API(43)颜色空间转换-----将 BGR 图像转换为 LUV 色彩空间函数BGR2LUV()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从BGR色彩空间转换为LUV色彩空间。 该函数将输入图像从BGR色彩空间转换为LUV。B、G和R通道值的传统范围是0到255。 输出图像必须是8位无符…

【Python】用Python写一个俄罗斯方块玩玩

【Python】用Python写一个俄罗斯方块玩玩 一、引言1.成品效果展示 二、思考准备1.思考设计2.代码设计2.1 游戏页面2.2 控件设计2.2.1 方块生成2.2.2 方块碰撞2.2.3 方块消融2.2.4 游戏主循环2.2.5 游戏窗口 三、游戏完整版 一、引言 今日看到侄子在玩游戏&#xff0c;凑近一看…

维港首秀!沃飞长空AE200亮相香港特别行政区

4月13日-16日&#xff0c;第三届香港国际创科展在香港会议展览中心盛大举办。 作为国内领先、国际一流的eVTOL主机厂&#xff0c;沃飞长空携旗下AE200批产构型登陆国际舞台&#xff0c;以前瞻性的创新技术与商业化应用潜力&#xff0c;吸引了来自全球17个国家及地区的行业领袖…

Openfein实现远程调用的方法(实操)

文章目录 环境准备一、URL中接收参数二、接收一个参数三、接收多个参数四、传递对象五、传递JSON格式数据 环境准备 下面的配置&#xff0c;服务调用方加入即可。 依赖导入&#xff1a; <!-- openfeign依赖--><dependency><groupId>org.springframe…

Bright+Data网页解锁器:旅游行业数据革命的“隐形引擎”

在数字经济浪潮中&#xff0c;旅游行业正经历前所未有的变革。当消费者指尖滑动间完成跨国酒店预订&#xff0c;当航空公司每秒调整万次舱位价格&#xff0c;背后是一场无声的数据战争。而在这场战争中&#xff0c;BrightData网页解锁器正成为旅游企业破局的关键武器——它像一…