R语言 用Caret包实现支持向量机分类器

R语言 用Caret包实现支持向量机分类器

大多数数据科学家在其职业生涯中遇到的机器学习的最关键方面之一是分类问题。分类算法的目标是预测一个特定的活动是否会发生。根据现有的数据,分类算法努力为一些问题提供答案,比如一个客户是否有可能离开,一个YouTube观众是否有可能点击建议的视频,以及今天是否会下雨。在本教程中,我们将使用R编程语言来创建支持向量机分类器,它将帮助我们解决一个分类问题。

支持向量机(SVM)

要理解支持向量机背后的想法,有必要知道,该算法根据两边的点的同质关系,用一条叫做 超平面的 线来分组 。 如果一条直线可以将这些点分割开来,就可以说这些点是线性可分离的。请看下图中的超平面,它线性地划分了像星星和太阳这样的符号。

用Caret包在R中实现支持向量机分类器

看了上图,人们可能会惊讶地发现,我们可以在不同的形状和位置画一条线,在这两个形状之间建立一个边界,如下图所示。这就提出了一个问题:支持向量分类器机器应该如何处理这些条件,以便为所提出的具体分类问题建模。

用Caret包在R中实现支持向量机分类器

支持向量分类器的上述问题可以通过使用最大边际超平面–在两个类别之间产生最大差距的线条来解决。请看下面的图片,它显示了形状和最大边际超平面之间的关系。

用Caret包在R中实现支持向量机分类器

三个充满蓝色的形状是被称为支持向量的东西。它们是潜在的MMH定义的基础。如果这些点不能被线性地分开,会发生什么?支持向量机是如何处理这种性质的问题的?在存在松弛变量的情况下,使机器能够打破一些限制,允许有限的点进入限制区域,对于支持向量分类器来说,没有什么是不可能的。在这种情况下,机器努力降低算法的整体成本。

用Caret包在R中实现支持向量机分类器

在对现实世界的分类数据进行建模时,支持向量机可能遇到的另一个相关问题是一个数据的广泛非线性。核技术是支持向量分类器的一个特点,它使我们能够很容易地将这些数据操作为线性可分离的数据,这也是机器对这种问题的一个解决方案。请看下面的图示。

用Caret包在R中实现支持向量机分类器

通过说明这一点,让我们研究一下这种机器学习方法将如何在实践中使用。我们将深入研究R及其软件包caret,这是最流行的开源编程语言之一。 Caret ,代表分类和回归训练,是一种有力的能力,使你能够用它来创建大量的模型。让我们开始吧。

导入软件包

所有需要的软件包的安装和导入都可以通过以下代码完成。

# Code for installation of all necessary packages
install.packages("caret")
install.packages("ggplot2")
install.packages("GGally")
install.packages("psych")
install.packages("ggpubr")
install.packages("reshape")
  
# Code for importation of all necessary packages
library(caret)
library(ggplot2) 
library(GGally)
library(psych) 
library(ggpubr)
library(reshape)
R

载入数据

数据集包括来自美国亚利桑那州凤凰城附近社区的768名妇女的信息,可在皮马印第安人糖尿病数据集中找到,该数据集最初由美国国家糖尿病和消化道疾病研究所创建。本教程旨在根据数据集中的数据,对病人的结果是否是糖尿病进行分类。

让我们把数据添加到代码中。

# Code
df <- read.csv("data/diabetes.csv")
head(df)
R

输出

用Caret包在R中实现支持向量机分类器

检查我们的数据集中是否有任何空值。

# Code
sum(is.na(df))
R

输出

0
R

要看到我们的数据集的尺寸。

# Code
dim(df)
R

输出

768  9
R

数据可视化

要看到我们的数据框架的类型。

# Code
sapply(df, class)
R

输出

用Caret包在R中实现支持向量机分类器

# Code
summary(df) # to calculate the summary of our dataset
R

用Caret包在R中实现支持向量机分类器

我们的数据集摘要

# Code
a <- ggplot(data = df, aes(x = Pregnancies)) +
    geom_histogram( color = "red", fill = "blue", alpha = 0.1) + 
    geom_density()
  
b <- ggplot(data = df, aes(x = Glucose)) +
    geom_histogram( color = "red", fill = "blue", alpha = 0.1) + 
    geom_density()
  
c <- ggplot(data = df, aes(x = BloodPressure)) +
    geom_histogram( color = "red", fill = "blue", alpha = 0.1) + 
    geom_density()
  
d <- ggplot(data = df, aes(x = SkinThickness)) +
    geom_histogram( color = "red", fill = "blue", alpha = 0.1) + 
    geom_density()
  
e <- ggplot(data = df, aes(x = Insulin)) +
    geom_histogram( color = "red", fill = "blue", alpha = 0.1) +
    geom_density()
  
f <- ggplot(data = df, aes(x = BMI)) +
    geom_histogram( color = "red", fill = "blue", alpha = 0.1) + 
    geom_density()
  
g <- ggplot(data = df, aes(x = DiabetesPedigreeFunction)) +
    geom_histogram( color = "red", fill = "blue", alpha = 0.1) +
    geom_density()
  
h <- ggplot(data = df, aes(x = Age)) +
    geom_histogram( color = "red", fill = "blue", alpha = 0.1) +geom_density()
    ggarrange(a, b, c, d,e,f,g, h + rremove("x.text"), 
          labels = c("a", "b", "c", "d","e", "f", "g", "h"),
          ncol = 3, nrow = 3)
R

输出。

用Caret包在R中实现支持向量机分类器

# Code
ggplot(data = df, aes(x =Outcome, fill = Outcome)) +
    geom_bar()
R

输出。

用Caret包在R中实现支持向量机分类器

将我们的分类变量标记为一个因素的代码

# Code to label our categorical variable as a factor
dfOutcome<- factor(dfOutcome, 
                  levels = c(0, 1), 
                  labels = c("Negative", "Positive"))
R

从我们的数据集中只选择数字特征来绘制boxplot。

out <- subset(df, 
 select = c(Pregnancies,Glucose,
            BloodPressure,SkinThickness,
            Insulin,BMI,
            DiabetesPedigreeFunction,Age))
  
# Code for boxplot
ggplot(data = melt(out), 
               aes(x=variable, y=value)) + 
            geom_boxplot(aes(fill=variable))
R

输出

用Caret包在R中实现支持向量机分类器

通过使用psych软件包绘制相关图

corPlot(df[, 1:8])
R

输出。

用Caret包在R中实现支持向量机分类器

洞察力

  • 在这些研究结果中,预测结果变量所需的变量的平均值–怀孕、胰岛素、葡萄糖、糖尿病血统功能和年龄–大于中位数。平均值高于中位数是因为数据似乎偏向于右边。
  • 我们数据的直方图和boxplots支持汇总统计的结论。
  • 然而,相关图显示,我们的数据中的变量彼此之间没有强烈的相关性。

基于上述的总结,我们应该如何格式化数据?下一步该怎么做呢?我将让你自己来解决这个问题。

数据准备和建模

要把我们的数据集分成训练和验证两部分

cutoff <- createDataPartition(df$Outcome, p=0.85, list=FALSE)
# select 15% of the data for validation
testdf <- df[-cutoff,]
# use the remaining 85% of data to training and testing the models
traindf <- df[cutoff,]
R

现在我们来训练SVM模型。

# Code to train the SVM
set.seed(1234)
# set the 10 fold crossvalidation with AU 
# to pick for us what we call the best model
control <- trainControl(method="cv",number=10, classProbs = TRUE)
metric <- "Accuracy"
model <- train(Outcome ~., data = traindf, method = "svmRadial",
                tuneLength = 8,preProc = c("center","scale"), 
                   metric=metric, trControl=control)
R

要打印模型的摘要。

# Code for model summary
model
R

输出

用Caret包在R中实现支持向量机分类器

让我们来绘制准确度图。

# Code 
plot(model)
R

输出

用Caret包在R中实现支持向量机分类器

现在让我们评估一下我们模型的精确度。混淆矩阵将被用来预测精确度。

# validate our model 
predict <- predict(model, newdata = testdf)
confusionMatrix(predict, testdf$Outcome)
R

输出

用Caret包在R中实现支持向量机分类器

根据混淆矩阵的结果,验证集的准确率为81.74%,这表明我们的模型可以相当好地预测这个数据集。至此,本教程告一段落。我希望你能从中学到一些东西,并发现它很有用。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册