虽然SVM算法已经用烂了,但审稿专家就是喜欢!

文摘   2024-11-12 09:00   爱尔兰  

一、支持向量机(SVM)简介

支持向量机(Support Vector Machine,简称 SVM)是一种基于统计学习理论的机器学习方法,最初由 Vladimir Vapnik 等人在 20 世纪 90 年代提出。SVM 能够找到一个最优超平面,将数据点进行分类,并且最大化类间间隔。对于非线性数据,SVM 通过使用核函数(kernel function)将数据映射到高维空间,从而实现线性可分性,极大地提升了模型的灵活性和实用性。

SVM 的优缺点及适用场景: 

优点:SVM 适合处理高维数据,在小样本数据上表现尤佳。它能够有效地解决非线性分类问题,并且对异常点不敏感。 

缺点:在数据量较大时,SVM 的计算成本较高,训练时间较长。同时,由于本质上是二分类算法,在多类别分类任务中,效果不如直接设计的多类别模型。

SVM 尤其适合小样本且维度较高的数据集,但在噪声较多或特别大的数据集上可能表现不佳。当数据分布明确、类别可分性较高时,SVM 反而可能显得复杂冗余。


二、SVM 的应用与滥用

SVM 在学术研究中应用广泛,尤其在图像识别、文本分类和生物信息学等领域取得了显著成果。例如,在癌症基因预测的研究中,SVM 被用于不同基因表达数据组的分类,展现出强大的预测能力。然而,近年来,SVM 也逐渐成为一些灌水论文中的“噱头”工具。

一些研究者缺乏对数据特性和模型局限的深入理解,简单套用 SVM,以此来提升论文的“高级感”,而忽视了结果的科学性和实际意义。例如,在医学图像分类、文本情感分析等领域,一些论文无视数据特性,简单使用 SVM 进行建模,只为展示“使用了先进算法”,而没有进行模型效果验证或优化,导致结论不够可靠。造成这种现象的原因在于,SVM 算法的理论复杂性和广泛应用往往会让审稿人觉得研究“深度”较高,但如果研究者没有合理地选择模型和核函数,结果并不科学。

正因如此,掌握 SVM 的实际操作、熟练使用代码对于研究生和数据科学学习者来说至关重要。数据科学的普及带来了新的学术要求,合理、科学地使用机器学习算法成为重要的能力。掌握 SVM 编程,不仅可以帮助学生深刻理解数据与模型的关系,还能避免因盲目套用工具而导致研究结论失真。


三、SVM 实战:R 语言的完整实现

接下来,我们将使用 R 语言自带的 iris 数据集,完整展示 SVM 的实现过程。从数据导入、可视化、模型构建、超参数调优到模型验证,逐步讲解。

1. 数据导入和查看

我们选择 R 自带的 iris 数据集进行实验,该数据集包含 150 条记录,描述了三种鸢尾花(setosaversicolor 和 virginica)的花萼和花瓣尺寸信息。

# 加载数据集
data(iris)
# 查看数据结构
str(iris)

## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

2. 数据可视化

在建模之前,可以通过可视化来了解数据的基本分布情况,帮助我们理解特征间的关系。

# 加载可视化包
library(ggplot2)

# 绘制散点图
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
geom_point(size = 2) +
labs(title = "Iris 数据集的散点图")

3. 构建 SVM 模型

在 e1071 包中,我们可以使用 svm 函数轻松地构建 SVM 模型。这里我们使用 Species 作为预测目标,其余特征作为输入特征。

# 加载 e1071 包
library(e1071)

# 划分训练集和测试集
set.seed(123) # 设置随机种子
index <- sample(1:nrow(iris), 0.7 * nrow(iris)) # 70% 为训练集
train_data <- iris[index, ]
test_data <- iris[-index, ]

# 构建 SVM 模型
svm_model <- svm(Species ~ ., data = train_data, kernel = "linear", cost = 1)

# 查看模型
summary(svm_model)

##
## Call:
## svm(formula = Species ~ ., data = train_data, kernel = "linear",
## cost = 1)
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: linear
## cost: 1
##
## Number of Support Vectors: 24
##
## ( 2 10 12 )
##
##
## Number of Classes: 3
##
## Levels:
## setosa versicolor virginica

4. 模型预测与验证

在测试集上验证模型的准确率,观察模型的实际效果。

# 模型预测
predictions <- predict(svm_model, newdata = test_data)

# 混淆矩阵
confusion_matrix <- table(Predicted = predictions, Actual = test_data$Species)

# 计算准确率
accuracy <- sum(diag(confusion_matrix)) / sum(confusion_matrix)
print(paste("模型准确率为:", round(accuracy * 100, 2), "%"))

## [1] "模型准确率为:97.78 %"

5. 超参数调整

我们可以通过调节超参数 cost 和 gamma 来进一步优化模型表现。这里使用网格搜索进行参数调优。

# 超参数网格搜索
tuned_model <- tune(svm, Species ~ ., data = train_data, kernel = "radial",
ranges = list(cost = 10^(-1:2), gamma = c(0.5, 1, 2)))

# 获取最佳模型
best_model <- tuned_model$best.model
summary(best_model)

##
## Call:
## best.tune(METHOD = svm, train.x = Species ~ ., data = train_data,
## ranges = list(cost = 10^(-1:2), gamma = c(0.5, 1, 2)), kernel = "radial")
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: radial
## cost: 100
##
## Number of Support Vectors: 35
##
## ( 10 14 11 )
##
##
## Number of Classes: 3
##
## Levels:
## setosa versicolor virginica

6. 模型可视化

通过绘制 SVM 的决策边界来可视化分类效果。

# 绘制决策边界
plot(svm_model, data = train_data, Petal.Width ~ Petal.Length,
slice = list(Sepal.Width = 3, Sepal.Length = 4))

7. 模型评估

最后,计算精确度、召回率和 F1 值,进一步评估模型的性能。

# 计算精确度、召回率和 F1 值
precision <- diag(confusion_matrix) / rowSums(confusion_matrix)
recall <- diag(confusion_matrix) / colSums(confusion_matrix)
f1_score <- 2 * precision * recall / (precision + recall)

print("精确度:")

## [1] "精确度:"

print(precision)

## setosa versicolor virginica
## 1.0000000 1.0000000 0.9285714

print("召回率:")

## [1] "召回率:"

print(recall)

## setosa versicolor virginica
## 1.0000000 0.9444444 1.0000000

print("F1 值:")

## [1] "F1 值:"

print(f1_score)

## setosa versicolor virginica
## 1.0000000 0.9714286 0.9629630


四、总结与思考

本文详细介绍了支持向量机(SVM)从理论到实战的完整实现过程,包含数据导入、可视化、模型构建、超参数调优和模型验证。SVM 作为一种经典的分类算法,适合处理高维、小样本数据,但在数据集特别庞大、数据噪声较多的情况下表现欠佳。对于学生和研究者而言,掌握 SVM 的基本理论、具备动手实践能力,是一项非常实用的技能!

感谢关注,你的支持是我不懈的动力!

科研代码
专注R和Python的数据分析。
 最新文章