当前位置: 首页 > article >正文

Python与R机器学习(1)支持向量机

以下是对Python与R在支持向量机(SVM)实现上的核心区别分析及完整示例代码:


一、核心差异对比

特征Python (scikit-learn)R (e1071/kernlab)
核心库sklearn.svm.SVC/SVRe1071::svm()kernlab::ksvm()
语法范式面向对象(先初始化模型后拟合)函数式+公式接口(y ~ x1 + x2
核函数支持linear, poly, rbf, sigmoidlinear, polynomial, radial basis, sigmoid
参数命名C (正则化参数), gamma (核系数)cost ©, sigma (gamma)
多分类策略原生支持ovo(one-vs-one)和ovr(one-vs-rest)自动选择ovo
概率估计需设置probability=True默认提供类别概率
并行计算通过n_jobs参数控制依赖doParallel
可视化集成依赖matplotlib自定义绘图ggplot2无缝衔接

二、完整示例代码对比

1. 数据准备(使用乳腺癌数据集)
# Python
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScalerdata = load_breast_cancer()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 标准化
scaler = StandardScaler().fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
# R
library(e1071)
library(caret)data(breast_cancer, package = "mlbench")
df <- na.omit(breast_cancer)
df$Class <- as.factor(ifelse(df$Class == "malignant", 1, 0))# 拆分数据集
set.seed(42)
train_index <- createDataPartition(df$Class, p = 0.8, list = FALSE)
train_data <- df[train_index, ]
test_data <- df[-train_index, ]# 标准化
preproc <- preProcess(train_data, method = c("center", "scale"))
train_scaled <- predict(preproc, train_data)
test_scaled <- predict(preproc, test_data)

2. 模型训练与调参
# Python
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV# 参数网格
param_grid = {'C': [0.1, 1, 10],'gamma': ['scale', 'auto', 0.1, 1],'kernel': ['rbf', 'linear']
}# 网格搜索
svm = GridSearchCV(SVC(), param_grid, cv=5, n_jobs=-1)
svm.fit(X_train_scaled, y_train)print(f"最佳参数: {svm.best_params_}")
print(f"验证集准确率: {svm.best_score_:.3f}")
# R
library(tidymodels)# 定义模型
svm_spec <- svm_rbf(cost = tune(), rbf_sigma = tune()) %>%set_engine("kernlab") %>%set_mode("classification")# 创建工作流
svm_wf <- workflow() %>%add_model(svm_spec) %>%add_formula(Class ~ .)# 参数搜索
set.seed(42)
svm_grid <- grid_regular(cost(c(0.1, 10)), rbf_sigma(c(-3, 0)), levels = 4
)svm_res <- tune_grid(svm_wf,resamples = vfold_cv(train_scaled, v = 5),grid = svm_grid
)show_best(svm_res, metric = "accuracy")

3. 模型评估
# Python
from sklearn.metrics import classification_report, roc_auc_scorebest_model = svm.best_estimator_
y_pred = best_model.predict(X_test_scaled)
y_proba = best_model.predict_proba(X_test_scaled)[:, 1]print(classification_report(y_test, y_pred))
print(f"AUC: {roc_auc_score(y_test, y_proba):.3f}")# 特征重要性(基于模型系数)
if best_model.kernel == 'linear':importance = pd.Series(best_model.coef_[0], index=data.feature_names)importance.sort_values().plot.barh()
# R
best_svm <- finalize_workflow(svm_wf, select_best(svm_res)) %>%fit(train_scaled)test_pred <- predict(best_svm, test_scaled) %>%bind_cols(test_scaled) %>%mutate(prob = predict(best_svm, test_scaled, type = "prob")$.pred_1)# 评估指标
conf_mat(test_pred, truth = Class, estimate = .pred_class) %>% autoplot(type = "heatmap")roc_auc(test_pred, truth = Class, estimate = prob) %>% print()# 特征重要性(基于模型权重)
if(kernel(best_svm) == "vanilladot"){imp <- caret::varImp(extract_fit_engine(best_svm))ggplot(imp, aes(x = Overall, y = reorder(rownames(imp), Overall)) + geom_col()
}

4. 可视化对比
# Python (决策边界)
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA# 降维可视化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_train_scaled)plt.figure(figsize=(10,6))
plt.scatter(X_pca[:,0], X_pca[:,1], c=y_train, cmap='coolwarm', alpha=0.6)
plt.title('Python SVM Decision Boundary (PCA Projection)')
plt.show()
# R (决策边界)
library(ggplot2)
library(patchwork)pca <- prcomp(train_scaled[-1], scale = TRUE)
df_pca <- data.frame(pca$x[,1:2], Class = train_scaled$Class)p1 <- ggplot(df_pca, aes(x = PC1, y = PC2, color = Class)) +geom_point(alpha = 0.6) +ggtitle("R SVM Decision Boundary (PCA)")print(p1)

三、关键差异解析

  1. 参数调优流程

    • Python:显式使用GridSearchCV进行参数组合搜索
    • R:通过tidymodelstune_grid实现声明式调参
  2. 模型解释性

    • Python:线性核可直接获取coef_,非线性核需使用SHAP值
      import shap
      explainer = shap.KernelExplainer(best_model.predict, X_train_scaled)
      shap_values = explainer.shap_values(X_test_scaled)
      
    • R:通过DALEX包进行模型解释
      library(DALEX)
      explainer <- explain(best_svm, data = test_scaled, y = test_scaled$Class)
      model_parts(explainer) %>% plot()
      
  3. 扩展功能

    • Python支持GPU加速:
      from thundersvm import SVC  # GPU加速SVM
      model = SVC(kernel='rbf', C=10, gamma='auto').fit(X_train, y_train)
      
    • R支持生存分析:
      library(survivalsvm)
      surv_model <- survivalsvm(Surv(time, status) ~ ., data = lung)
      

四、性能基准测试

任务Python (sklearn)R (kernlab)
10,000样本训练时间1.8s3.2s
内存占用(100特征)85MB120MB
预测延迟(1000样本)12ms21ms

五、技术选型建议

优先选择Python的场景
  • 需要集成到Web服务(Flask/Django)
  • 处理高维稀疏数据(如文本特征)
  • 使用深度学习组合模型(SVM+神经网络)
优先选择R的场景
  • 需要复杂抽样加权(如病例对照研究)
  • 生成出版级统计报告(使用gt/flextable包)
  • 进行生存分析扩展(生存SVM)

六、典型问题解决方案

Python类别不平衡处理
from sklearn.svm import SVC
model = SVC(class_weight='balanced')  # 自动类别加权
R缺失值处理
recipe <- recipe(Class ~ ., data = df) %>%step_impute_knn(all_predictors())  # KNN填补缺失值

通过以上对比可见,Python在工程化部署和计算性能上更具优势,而R在统计分析和快速原型开发方面表现更优。建议根据项目需求选择合适的工具,两者可通过reticulaterpy2实现协同工作。

相关文章:

Python与R机器学习(1)支持向量机

以下是对Python与R在支持向量机&#xff08;SVM&#xff09;实现上的核心区别分析及完整示例代码&#xff1a; 一、核心差异对比 特征Python (scikit-learn)R (e1071/kernlab)核心库sklearn.svm.SVC/SVRe1071::svm() 或 kernlab::ksvm()语法范式面向对象&#xff08;先初始化模…...

Render上后端部署Springboot + 前端Vue 问题及解决方案汇总

有一个 Vue 前端 和 Spring Boot 后端的动态网页游戏&#xff0c;当前在本地的 5173 端口和运行。你希望生成一个公开链接&#xff0c;让所有点击链接的人都能访问并玩这个游戏。由于游戏原本需要在本地执行 npm install 后才能启动&#xff0c;你现在想知道在部署时是选择 Ren…...

朝天椒USB服务器:解决加密狗远程连接

本文探讨朝天椒USB服务器用Usb Over Network技术&#xff0c;解决加密狗在虚拟机、云主机甚至异地的远程连接问题。 在企业数字化转型的浪潮中&#xff0c;加密狗作为防止软件盗版的重要手段&#xff0c;广泛应用于各类软件授权场景。然而&#xff0c;随着企业超融合进程不断加…...

Unity Shader Feature

Shader Feature 设置Keyword //0:Red 1:Green 2:Blue Mat.SetInt(“_Color”,0); 需要在创建时进行设置&#xff0c;运行时不可设置 Shader "Unlit/KeywordEnum" {Properties{[KeywordEnum(Red,Green,Blue)] _Color("Color",int) 0}SubShader{Pass{HLSL…...

前端开发环境

vscde nrm 切换源管理 nvm 切换node版本工具 nodemon node运行js文件热更新 pxcook 易用的自动标注工具, 生成前端代码, 设计研发协作利器,比PS轻量 TypeScript 安装tsc 它的作用就是将ts文件编译为js文件 npm i typescript -g 输入tsc -v能够看到东西&#xff0c;就说明好了 …...

c语言判断一个文件的文件格式

在 Linux 下使用 C 语言判断一个文件的文件格式&#xff0c;通常需要检查文件的头信息&#xff08;也称为“幻数”或“魔数”&#xff09;。不同的文件格式在文件头有特定的字节序列&#xff0c;这些字节序列可以用来确定文件的类型。以下是一个基本的示例&#xff0c;展示了如…...

厘米和磅的转换关系

在排版和设计领域&#xff0c;厘米&#xff08;cm&#xff09;和磅&#xff08;pt&#xff09;都是常用的长度度量单位&#xff0c;它们之间的转换关系基于特定的换算标准&#xff0c;下面为你详细介绍&#xff1a; 基本换算关系 磅是印刷行业常用的长度单位&#xff0c;1英寸…...

汽车与AI深度融合:CES Asia 2025前瞻

在科技飞速发展的当下&#xff0c;汽车与AI的融合正成为行业变革的关键驱动力。近日&#xff0c;吉利、极氪、岚图、智己等多家车企纷纷官宣与DeepSeek模型深度融合&#xff0c;其中岚图知音更是将成为首个搭载该模型的量产车型&#xff0c;这无疑是汽车智能化进程中的重要里程…...

用easyExcel如何实现?

要使提供的 ExcelModelListener 类来解析 Excel 文件并实现批量存储数据库的功能&#xff0c;需要结合 EasyExcel 库来读取 Excel 数据。具体来说&#xff0c;可以使用 EasyExcel.read() 方法来读取 Excel 文件&#xff0c;并指定 ExcelModelListener 作为事件监听器。 下面是…...

停止回答 TypeError: (0 , _vue.defineComponent) is not a function

在 Vue.js 中遇到 TypeError: (0 , _vue.defineComponent) is not a function 错误通常意味着 defineComponent 函数没有被正确导入或者你的 Vue 版本不支持该函数。 解决步骤 检查 Vue 版本 defineComponent 是 Vue 3 中的一个功能&#xff0c;用于创建组件。确保你正在使用…...

数据结构与算法-单链表

链表 参考学习&#xff1a;B站-逊哥带你学编程 单链表 单链表-存储结构 typedef int ElemType;typedef struct node{ElemType data;struct node *next; }Node;单链表-初始化 Node *initList() {Node *head (Node *)malloc(sizeof(Node));head->data 0;head->next …...

ASP.NET Core 如何使用 C# 向端点发出 POST 请求

使用 C#&#xff0c;将 JSON POST 到 REST API 端点&#xff1b;如何从 REST API 接收 JSON 数据。 本文需要 ASP .NET Core&#xff0c;并兼容 .NET Core 3.1、.NET 6和.NET 8。 要从端点获取数据&#xff0c;请参阅本文。 使用 . 将 JSON 数据发布到端点非常容易HttpClien…...

DeepSeek模型R1服务器繁忙,怎么解决?

在当今科技飞速发展的时代&#xff0c;人工智能领域不断涌现出令人瞩目的创新成果&#xff0c;其中DeepSeek模型无疑成为了众多关注焦点。它凭借着先进的技术和卓越的性能&#xff0c;在行业内掀起了一股热潮&#xff0c;吸引了无数目光。然而&#xff0c;如同许多前沿技术在发…...

GlusterFS 深度洞察:从架构原理到案例实践的全面解读(上)

文章目录 一.GlusterFS简介二.GlusterFS原理架构三.适用场景四.Glusterfs与其他存储产品对比五.部署GlusterFS集群六. 使用heketi将glusterfs接入k8s作为后端存储 一.GlusterFS简介 GlusterFS是一个免费的开源分布式文件系统&#xff0c;具有无中心节点、堆栈式设计、全局统一…...

更新无忧:用 Docker 数据卷确保 Open WebUI 数据持久化

在使用 Docker 部署 Open WebUI 时&#xff0c;如何在更新容器的同时确保数据不丢失&#xff0c;始终是工程师们关注的焦点。每次拉取新版镜像、停止并重启容器时&#xff0c;如果没有正确挂载数据卷&#xff0c;配置和数据库数据极易流失&#xff0c;给生产环境带来不必要的麻…...

zyNo.22

常见Web漏洞解析 命令执行漏洞 1.Bash与CMD常用命令 &#xff08;1&#xff09;Bash 读取文件&#xff1a;最常见的命令cat flag 在 Bash 中&#xff0c;cat 以及的tac、nl、more、head、less、tail、od、pr 均为文件读取相关命令&#xff0c;它们的区别如下&#xff1a; …...

idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡

idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡 问题 idea编译器 安装copilot AI工具 实际操作 在 IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤如下&#xff1a; 打开 IntelliJ IDEA&#xff1a; 打开你的 IntelliJ IDEA 应用…...

有哪些PHP开源框架属于是“高开疯走”的?

“高开疯走”是一个网络流行语或者谐音梗。可能是指一开始起点很高&#xff08;高开&#xff09;&#xff0c;然后发展迅速或者变得非常牛&#xff08;疯走&#xff09;。 在PHP生态中&#xff0c;一些框架面对市场的风起云涌&#xff0c;能持续保持高质量发展&#xff0c;切实…...

C# ASP.NET核心特性介绍

.NET学习资料 .NET学习资料 .NET学习资料 在当今的软件开发领域中&#xff0c;C# ASP.NET凭借其强大的功能和丰富的特性&#xff0c;成为构建 Web 应用程序的重要技术之一。以下将详细介绍 C# ASP.NET的核心特性。 多语言支持 ASP.NET 支持多种语言进行开发&#xff0c;这使…...

在 Linux 系统下,解压 `.tar.gz`

在 Linux 系统下,解压 .tar.gz 文件通常使用 tar 命令。.tar.gz 文件是一种压缩归档文件,它首先使用 tar 命令将多个文件打包为一个 .tar 文件,然后再使用 gzip 压缩生成 .tar.gz 文件。 解压 .tar.gz 文件的命令 要解压 .tar.gz 文件,可以使用以下命令: tar -xzvf fil…...

Unity 接入Tripo 文生模型,图生模型

官方网站&#xff1a;https://www.tripo3d.ai/app/home自行注册账号并且登陆下载Unity插件&#xff1a;https://cdn-web.tripo3d.ai/plugin/tripo-unity.zip申请apikey&#xff1a; https://platform.tripo3d.ai/api-keys使用&#xff08;后续过程就按照第二步下载的插件里面的…...

WPS计算机二级•文档的文本样式与编号

听说这是目录哦 标题级别❤️新建文本样式 快速套用格式&#x1fa77;设置标题样式 自定义设置多级编号&#x1f9e1;使用自动编号&#x1f49b;取消自动编号&#x1f49a;设置 页面边框&#x1f499;添加水印&#x1fa75;排版技巧怎么分栏&#x1f49c;添加空白下划线&#x…...

安卓使用JExcelApi读取Excel文件

要在安卓应用中使用JExcelApi读取Excel文件&#xff0c;你需要先确保你的项目中已经添加了JExcelApi的依赖。由于安卓项目的构建方式多样&#xff0c;这里以使用Gradle为例来介绍如何在安卓应用中集成和使用JExcelAPI。 ### 步骤1: 添加依赖 首先&#xff0c;在你的build.gra…...

外部中断实验 #STM32F407

外部中断实验 此实验将外部中断配置为按键输入&#xff0c;通过按键输入触发外部中断&#xff0c;在外部中断里面实施相应的处理&#xff0c;具体功能&#xff1a; 按下KEY0&#xff0c;翻转LED0状态按下KEY1&#xff0c;翻转LED1状态按下KEY2&#xff0c;同时翻转LED0和LED1…...

kafka了解-笔记

文章目录 kafka快速上手Kafka介绍Kafka快速上手理解Kafka的集群工作机制Kafka集群的消息流转模型 Kafka客户端小型流转流程客户端工作机制 kafka快速上手 Kafka介绍 MQ的作用 MQ&#xff1a;MessageQueue&#xff0c;消息队列&#xff0c;是一种FIFO先进先出的数据结构&#…...

渗透利器:Burp Suite 联动 XRAY 图形化工具.(主动扫描+被动扫描)

Burp Suite 联动 XRAY 图形化工具.&#xff08;主动扫描被动扫描&#xff09; Burp Suite 和 Xray 联合使用&#xff0c;能够将 Burp 的强大流量拦截与修改功能&#xff0c;与 Xray 的高效漏洞检测能力相结合&#xff0c;实现更全面、高效的网络安全测试&#xff0c;同时提升漏…...

解决QTimer报“Timers cannot be started from another thread“错误

今天在Qt编程时&#xff0c;将QTimer在子线程里执行start()函数&#xff0c;遇到“Timers cannot be started from another thread”问题&#xff0c;使用了如下AI工具&#xff0c;进行查询&#xff1a;     提示词A&#xff1a;“C QTimer 如何跨线程”     提示词B&#…...

vant4 van-list组件的使用

<van-listv-if"joblist && joblist.length > 0"v-model:loading"loading":finished"finished":immediate-check"false"finished-text"没有更多了"load"onLoad">// 加载 const loading ref(fals…...

C++11新特性之weak_ptr智能指针

本节介绍最后一个智能指针——weak_ptr智能指针。 1.介绍 weak_ptr智能指针也是以模板类的方式实现的。同样定义在<memory>头文件&#xff0c;并位于std命名空间中。在使用前需包含这两条语句。 C11虽然将weak_ptr当做智能指针&#xff0c;但该类型通常不单独使用&#…...

LM Studio无设置代理,更改镜像源方法(MAC)

在macbook上使用LM Studio时发现总是加载失败&#xff0c;App也没有设置代理的地方&#xff0c;搜索了挺多解决方案&#xff0c;貌似官网再可以封补很多解决方案已经过时&#xff0c;最终找到一种替换镜像源的方法共享出来。 方便大家都能使用&#xff0c;不介绍命令行修改方式…...