第100+18步 ChatGPT学习:R实现SVM分类

news2025/1/12 15:51:14

基于R 4.2.2版本演示

一、写在前面

有不少大佬问做机器学习分类能不能用R语言,不想学Python咯。

答曰:可!用GPT或者Kimi转一下就得了呗。

加上最近也没啥内容写了,就帮各位搬运一下吧。

二、R代码实现SVM分类

(1)导入数据

我习惯用RStudio自带的导入功能:

(2)建立SVM模型(默认参数)

# Load necessary libraries
library(caret)
library(kernlab) 
library(pROC)
library(ggplot2)

# Assume 'data' is your dataframe containing the data
# Set seed to ensure reproducibility
set.seed(123)

# Split data into training and validation sets (80% training, 20% validation)
trainIndex <- createDataPartition(data$X, p = 0.8, list = FALSE)
trainData <- data[trainIndex, ]
validData <- data[-trainIndex, ]

# Train the SVM model
svmModel <- ksvm(X ~ ., data = trainData, type = "C-svc", kernel = "rbfdot", prob.model = TRUE)

# Predict on the training and validation sets
trainPredict <- predict(svmModel, trainData, type = "probabilities")[,1] 
validPredict <- predict(svmModel, validData, type = "probabilities")[,1]

# Convert predictions to binary using 0.5 as threshold
trainPredictBinary <- ifelse(trainPredict > 0.5, 1, 0)
validPredictBinary <- ifelse(validPredict > 0.5, 1, 0)

# Compute ROC objects
trainRoc <- roc(response = as.numeric(trainData$X) - 1, predictor = trainPredict)
validRoc <- roc(response = as.numeric(validData$X) - 1, predictor = validPredict)

# Plot ROC curves using ggplot2
trainRocPlot <- ggplot(data = data.frame(fpr = 1 - trainRoc$specificities, tpr = trainRoc$sensitivities), aes(x = fpr, y = tpr)) +
  geom_line(color = "blue") +
  geom_area(aes(ifelse(fpr <= 1, fpr, NA)), fill = "blue", alpha = 0.2) +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "black") +
  ggtitle("Training ROC Curve") +
  xlab("False Positive Rate") +
  ylab("True Positive Rate") +
  annotate("text", x = 0.5, y = 0.1, label = paste("Training AUC =", round(auc(trainRoc), 2)), hjust = 0.5, color = "blue")

validRocPlot <- ggplot(data = data.frame(fpr = 1 - validRoc$specificities, tpr = validRoc$sensitivities), aes(x = fpr, y = tpr)) +
  geom_line(color = "red") +
  geom_area(aes(ifelse(fpr <= 1, fpr, NA)), fill = "red", alpha = 0.2) +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "black") +
  ggtitle("Validation ROC Curve") +
  xlab("False Positive Rate") +
  ylab("True Positive Rate") +
  annotate("text", x = 0.5, y = 0.2, label = paste("Validation AUC =", round(auc(validRoc), 2)), hjust = 0.5, color = "red")

# Display plots
print(trainRocPlot)
print(validRocPlot)

# Calculate confusion matrices based on 0.5 cutoff for probability
confMatTrain <- table(trainData$X, trainPredict >= 0.5)
confMatValid <- table(validData$X, validPredict >= 0.5)

# Function to plot confusion matrix using ggplot2
plot_confusion_matrix <- function(conf_mat, dataset_name) {
  conf_mat_df <- as.data.frame(as.table(conf_mat))
  colnames(conf_mat_df) <- c("Actual", "Predicted", "Freq")
  
  p <- ggplot(data = conf_mat_df, aes(x = Predicted, y = Actual, fill = Freq)) +
    geom_tile(color = "white") +
    geom_text(aes(label = Freq), vjust = 1.5, color = "black", size = 5) +
    scale_fill_gradient(low = "white", high = "steelblue") +
    labs(title = paste("Confusion Matrix -", dataset_name, "Set"), x = "Predicted Class", y = "Actual Class") +
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1), plot.title = element_text(hjust = 0.5))
  
  print(p)
}

# Now call the function to plot and display the confusion matrices
plot_confusion_matrix(confMatTrain, "Training")
plot_confusion_matrix(confMatValid, "Validation")

# 提取混淆矩阵的值,确保它们的命名与你的混淆矩阵布局一致
fp_train <- confMatTrain[1, 1]
tn_train <- confMatTrain[1, 2]
tp_train <- confMatTrain[2, 1]
fn_train <- confMatTrain[2, 2]

fp_valid <- confMatValid[1, 1]
tn_valid <- confMatValid[1, 2]
tp_valid <- confMatValid[2, 1]
fn_valid <- confMatValid[2, 2]

# 训练集指标
acc_train <- (tp_train + tn_train) / sum(confMatTrain)
error_rate_train <- 1 - acc_train
sen_train <- tp_train / (tp_train + fn_train)  # 灵敏度
sep_train <- tn_train / (tn_train + fp_train)  # 特异度
precision_train <- tp_train / (tp_train + fp_train)  # 精确度
F1_train <- 2 * (precision_train * sen_train) / (precision_train + sen_train)
MCC_train <- (tp_train * tn_train - fp_train * fn_train) / sqrt((tp_train + fp_train) * (tp_train + fn_train) * (tn_train + fp_train) * (tn_train + fn_train))
auc_train <- roc(response = trainData$X, predictor = trainPredict)$auc

# 验证集指标
acc_valid <- (tp_valid + tn_valid) / sum(confMatValid)
error_rate_valid <- 1 - acc_valid
sen_valid <- tp_valid / (tp_valid + fn_valid)  # 灵敏度
sep_valid <- tn_valid / (tn_valid + fp_valid)  # 特异度
precision_valid <- tp_valid / (tp_valid + fp_valid)  # 精确度
F1_valid <- 2 * (precision_valid * sen_valid) / (precision_valid + sen_valid)
MCC_valid <- (tp_valid * tn_valid - fp_valid * fn_valid) / sqrt((tp_valid + fp_valid) * (tp_valid + fn_valid) * (tn_valid + fp_valid) * (tn_valid + fn_valid))
auc_valid <- roc(response = validData$X, predictor = validPredict)$auc

# Print Metrics
cat("Training Metrics\n")
cat("Accuracy:", acc_train, "\n")
cat("Error Rate:", error_rate_train, "\n")
cat("Sensitivity:", sen_train, "\n")
cat("Specificity:", sep_train, "\n")
cat("Precision:", precision_train, "\n")
cat("F1 Score:", F1_train, "\n")
cat("MCC:", MCC_train, "\n")
cat("AUC:", auc_train, "\n\n")

cat("Validation Metrics\n")
cat("Accuracy:", acc_valid, "\n")
cat("Error Rate:", error_rate_valid, "\n")
cat("Sensitivity:", sen_valid, "\n")
cat("Specificity:", sep_valid, "\n")
cat("Precision:", precision_valid, "\n")
cat("F1 Score:", F1_valid, "\n")
cat("MCC:", MCC_valid, "\n")
cat("AUC:", auc_valid, "\n")

结果输出(随便挑的):

效果一般般。

三、SVM调参

ksvm 函数是 kernlab 包中的一个函数,用于在 R 语言中构建和训练支持向量机(SVM)模型。以下是 ksvm 的一些主要参数和选项,这些参数允许你定制和优化SVM的训练过程:

formula:一种符号描述的模型公式,指示如何将变量应用到分析中。

data:包含数据的数据框(data frame)。

type:模型类型,包括:

"C-svc":C-支持向量分类。

"nu-svc":Nu-支持向量分类。

"C-bsvc":不平衡分类。

"spoc-svc":结构化输出和输出校正。

"kbb-svc":基于核的二进制分类。

"C-svr":C-支持向量回归。

"nu-svr":Nu-支持向量回归。

"eps-svr":ε-支持向量回归。

"C-bsvr":不平衡回归。

"lp":线性规划。

kernel:核函数类型,包括:

"rbfdot":径向基函数核。

"polydot":多项式核。

"vanilladot":线性核。

"tanhdot":双曲正切核。

"laplacedot":拉普拉斯核。

"besseldot":贝塞尔核。

"anovadot":ANOVA核。

"splinedot":样条核。

C:错误的成本,用于C-支持向量分类和回归,较大的值表示对错误的惩罚增加。一般从 0.1 到 1000,具体取值可以通过交叉验证来确定。常用的实验值包括 1, 10, 100 等。

sigma(用于 RBF 核):高斯核的宽度参数。sigma 的理想取值高度依赖于数据的分布和特征的尺度(即特征的范围或方差)。因此,没有固定的“最佳”取值范围,而是需要根据具体情况来确定。常见的做法包括:

基于数据的启发式方法:一个常见的启发式方法是将 sigma 设置为特征空间中点到点距离的中值或平均值的函数。另一种方法是将 sigma 设置为特征标准差的倒数。

试错法(Trial and Error):在实际应用中,可以通过试验一系列的 sigma 值来观察模型性能的变化。例如,可以在对数尺度上均匀尝试,如 0.01, 0.1, 1, 10 等。

degree:多项式核函数的度数。

scale:核函数的缩放参数。

offset:核函数的偏移量。

prob.model:是否计算概率估计,适用于分类任务。

cross:进行交叉验证的次数,用于模型选择和参数优化。

na.action:缺失数据的处理策略。

shrinking:是否使用启发式方法来加速计算。

tol:收敛容忍度,用于优化算法。

epsilon(用于 SVR):ε-支持向量回归中的损失函数边缘宽度。

fitted:是否返回拟合值。

scaled:是否对数据进行标准化处理。

feature.out:是否输出模型中使用的特征。

大家自个调吧,我不调了。

五、最后

至于怎么安装,自学了哈。

数据嘛:

链接:https://pan.baidu.com/s/1rEf6JZyzA1ia5exoq5OF7g?pwd=x8xm

提取码:x8xm

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

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

相关文章

Docker部署nacos...用户名密码错误

前提 镜像选择v2.3.0版本&#xff0c;因为最新的没拉下来用的别的地方save load的镜像。 官方示例 官方文档 数据库脚本&#xff0c;直接去数据库新建数据库nacos吧&#xff0c;执行脚本&#xff0c;执行完成后&#xff0c;发现只有建表语句&#xff0c;查询得知&#xff0c…

springboot+Activiti7整合实践 (九) 网关

系列文章目录 第一章 springbootActiviti7整合实践 (一) 第二章 springbootActiviti7整合实践 (二) 模型定义 第三章 springbootActiviti7整合实践 (三) 流程定义 第四章 springbootActiviti7整合实践 (四) 分配规则 第五章 springbootActiviti7整合实践 (五) 发布流程 第…

股票预测模型中注意力多层Attention RNN LSTM 的应用

全文链接&#xff1a;https://tecdat.cn/?p37152 原文出处&#xff1a;拓端数据部落公众号 Attention 机制是一种在神经网络处理序列数据时极为关键的技术&#xff0c;它赋予了模型“聚焦”能力&#xff0c;能够自动评估输入序列中各部分的重要性。通过为序列中的每个元素分…

一文读懂CST电磁仿软件的TLM算法原理和历史背景

这期我们免公式地介绍一下TLM原理。TLM&#xff08;Transmission Line Method&#xff09;是传输线矩阵算法&#xff0c;基于Huygens的波传播模型的三维全波电磁算法&#xff0c;注意是full wave哦&#xff01; 什么是Huygens原理&#xff1f; 惠更斯原理能准确计算波的传播。…

三大旗舰实力,奇瑞风云T10全球上市,售价18.99万元起

旗舰之上&#xff0c;10力超群&#xff01;7月25日&#xff0c;超长续航旗舰电混SUV——风云T10于弥勒全球上市。基于全球标准及全球验证体系打造的风云T10&#xff0c;凭借旗舰级的性能、安全、空间三大产品价值&#xff0c;树立了新能源时代的新标杆。新车共推出3款车型&…

目标检测 YOLOv5-7.0 详细调试自制数据集实战

目标检测 YOLOv5-7.0 详细调试&自制数据集实战 一、项目介绍及环境配置&#xff08;一&#xff09;项目解读&#xff08;二&#xff09;版本选择&#xff08;三&#xff09;环境配置 二、如何利用YOLOv5进行预测&#xff08;detect.py&#xff09;&#xff08;一&#xff0…

DOS攻击实验

实验背景 Dos 攻击是指故意的攻击网络协议实现的缺陷或直接通过野蛮手段&#xff0c;残忍地耗尽被攻击对象的资源&#xff0c;目的是让目标计算机或网络无法提供正常的服务或资源访问&#xff0c;使目标系统服务系统停止响应甚至崩溃。 实验设备 一个网络 net:cloud0 一台模…

如何在go里使用jwt(包含示例)

什么是JWT JWT就是一种基于Token的轻量级认证模式&#xff0c;服务端认证通过后&#xff0c;会生成一个JSON对象&#xff0c;经过签名后得到一个Token&#xff08;令牌&#xff09;再发回给用户&#xff0c;用户后续请求只需要带上这个Token&#xff0c;服务端解密之后就能获取…

关于安装yarn后pnpm无法使用的问题

踩坑经过 因为公司项目变更需要&#xff0c;需要切换到yarn包管理工具&#xff0c;师父帮我调整了node版本&#xff0c;然后全局安装了yarn&#xff1a;npm install -g yarn 然后在项目里面用了yarn install然后用yarn dev语句跑起来了新项目。但是现在老项目有bug&#xff0c…

基于JSP、java、Tomcat三者的项目实战--校园交易网(2)登录,注册功能实现

技术支持&#xff1a;JAVA、JSP 服务器&#xff1a;TOMCAT 7.0.86 编程软件&#xff1a;IntelliJ IDEA 2021.1.3 x64 OK&#xff0c;那我们进入正题&#xff0c;随着前面一篇博客的尚未完结基于JSP、java、Tomcat三者的项目实战--校园交易网&#xff08;2&#xff09;登录功能…

2024杭电多校(4)1012. 寻找宝藏 【扫描线、树状数组二维偏序】

寻找宝藏 题意 思路 如果没有矩形陷阱区域的话&#xff0c;设 f i f_i fi​ 表示从 ( 0 , 0 ) (0, 0) (0,0) 到 ( i , p i ) (i, p_i) (i,pi​) 的最大收益&#xff0c;那么可以很容易通过扫描线 d p dp dp 求出&#xff1a; f i v i max ⁡ j < i ∧ p j < p …

颜色识别基于高斯混合模型(GMM)的查找表分类器(LUT)

文章目录 create_class_gmm 创建高斯混合模型&#xff08;GMM&#xff09;以进行分类任务add_samples_image_class_gmm 提取训练样本&#xff0c;并将其添加到高斯混合模型 (GMM) 的训练数据集中train_class_gmm 训练一个高斯混合模型 (GMM)clear_class_gmm 清除模型create_cla…

车载客流统计大揭秘——双目客流统计

客流统计大揭秘——双目客流统计 随着科技的飞速发展和商业竞争的加剧&#xff0c;客流统计已成为商业运营中不可或缺的一环。在众多客流统计技术中&#xff0c;双目客流统计以其高精度和高效率逐渐受到广大商家的青睐。本文将带您一探双目客流统计的奥秘。 一、什么是双目客流…

axure10的安装与使用教程,问题整理

前言&#xff1a; axure10的安装与激活使用教程。 1、百度网盘下载相关资料 链接&#xff1a;https://pan.baidu.com/s/1OSD9J1wVuIptGxeRzwjlpA?pwddkbj 提取码&#xff1a;dkbj 2、开始安装&#xff0c;点击setup的安装包 除了更改地址外&#xff0c;其他的默认就行&…

平台总线驱动和设备的匹配流程分析

参考文章:https://blog.csdn.net/qq_44182115/article/details/123231576 1、宏module_platform_driver // include/linux/platform_device.h 展开为 static int __init __platform_driver_init(void) \ {\return platform_driver_register(&

谷粒商城实战笔记-84-商品服务-API-新增商品-获取分类关联的品牌

文章目录 一&#xff0c;品牌查询接口的后台实现二&#xff0c;编码经验总结1&#xff0c;Controller层的作用1.1 参数处理1.2 调用Service1.3 处理Service返回结果实例 2&#xff0c;VO的封装时机3&#xff0c;Service中最好注入Service&#xff0c;不要直接依赖Dao 问题记录 …

BUGKU-CTF-WEB 源代码

URL解码平台&#xff1a;https://www.iamwawa.cn/urldecode.html 看看源码 存在script&#xff1a; <script> var p1 %66%75%6e%63%74%69%6f%6e%20%63%68%65%63%6b%53%75%62%6d%69%74%28%29%7b%76%61%72%20%61%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65…

基于Gunicorn、Flask和Docker的高并发应用部署指南

一、简介 随着互联网的发展&#xff0c;现代应用程序需要处理越来越多的并发请求&#xff0c;高并发应用程序的需求促使开发者寻找可靠且高效的解决方案来管理和优化服务器负载。在这种背景下&#xff0c;Gunicorn、Flask和Docker成为构建和部署高并发应用的理想组合。 首先&…

一分钟了解VMware虚拟机三种网络模式区别

VMware虚拟机提供了三种主要的网络模式&#xff0c;分别是桥接模式&#xff08;Bridged Mode&#xff09;、网络地址转换模式&#xff08;NAT Mode&#xff09;和仅主机模式&#xff08;Host-Only Mode&#xff09;。这三种模式各有其特点和适用场景&#xff0c;以下是对它们之…

mysql的回表查询

大家好&#xff0c;我是程序媛雪儿&#xff0c;今天咱们聊mysql的回表查询&#xff0c;在mysql慢查询那篇文章中我们知道&#xff0c;当extra那一列显示&#xff0c;Using index condition&#xff0c;表示直接使用了索引&#xff0c;但是需要回表查询数据&#xff0c;这种情况…