支持向量机与最大边际分类器详解

在机器学习领域,最大边际分类器(Maximal-Margin Classifier)、支持向量分类器(Support Vector Classifier)和支持向量机(Support Vector Machines)是三个经常被提及但常被混淆的概念。本文将逐一探讨这些概念,并解释它们之间的联系与区别。

超平面(Hyperplane)

超平面是机器学习中一个重要的概念,它用于在d维空间中通过一个(d-1)维的超平面将空间分割成两个部分。例如,在三维空间中,一个二维的“绿色”超平面可以用来分隔两个类别“红色”和“蓝色”。以下是超平面的一个示意图:

在d维空间中,数据被分割成两部分,使用的是(d-1)维的超平面。例如,一个点在0-D空间可以将一条线(1-D)分割成两部分,一条线在1-D空间可以将一个平面(2-D)分割成两部分,一个平面在2-D空间可以将一个三维空间分割成两部分。

1. 最大边际分类器(Maximal Margin Classifier)

最大边际分类器专门用于处理线性可分数据,即数据可以通过超平面线性分割。线性可分和非线性可分数据的示意图如下:

然而,即使对于线性可分的数据,也可能存在无限多个超平面可以正确分类这些数据。那么,如何选择真正需要的超平面呢?最大边际分类器基于最大边际原则选择最优超平面。在下面的示意图中,与超平面平行的虚线表示边际,两条虚线之间的距离(边际)就是最大边际。

边际通过每个类别最近的点到超平面。这些最近点与超平面的角度为90°,这些点被称为“支持向量”。在下面的示意图中,支持向量用圆圈表示。

这种分类器会选择具有最大边际的超平面,因此被称为最大边际分类器。

缺点:

最大边际分类器过度依赖支持向量,并且随着支持向量的变化而变化,因此它们倾向于过拟合。它们不能用于非线性可分的数据,因为大多数现实世界的数据都是非线性的。因此,这种分类器效率不高。

最大边际分类器也被称为“硬边际分类器”,因为它防止误分类并确保没有点穿过边际。由于硬边际,它倾向于过拟合。为了解决与最大边际分类器相关的问题,引入了“支持向量分类器”。

2. 支持向量分类器(Support Vector Classifier)

支持向量分类器是最大边际分类器的扩展。它对个别数据的敏感性较低,因为它允许某些数据被误分类,因此也被称为“软边际分类器”。它创建了一个预算,允许在该预算下进行误分类。

在构建模型时,使用一个称为“成本”的超参数。成本是预算的倒数,意味着当预算增加时,成本降低,反之亦然。它由“C”表示。

C值对边际的影响如下图所示。当值较小时,例如C=1,边际变宽,而当值较大时,边际变窄。

小‘C’值 ——> 大预算 ——> 宽边际 ——> 允许更多误分类

大‘C’值 ——> 小预算 ——> 窄边际 ——> 允许较少误分类

缺点:这种分类器只能进行线性分类。当分类是非线性时,它变得效率低下。

3.支持向量机(Support Vector Machines)

支持向量机是软边际分类器的扩展。它也可以通过使用核函数用于非线性分类。因此,这个算法在大多数现实世界的问题陈述中表现良好。因为在现实世界中,大多会发现非线性可分数据,这将需要使用复杂的分类器来对它们进行分类。

核函数:它将非线性可分数据从低维转换到高维以便于线性分类,如下图所示。使用基于核的技术来分离非线性数据,因为在高维中分离可能更简单。

核函数使用数学公式将数据从低维转换到高维。

以另一个例子来理解核函数的工作方式。假设希望模型能够在x轴上区分芒果和番石榴,如下图所示。模型无法使用x轴上的特定“点”来区分这两个类别,因为这里没有这样的点。

在这种情况下,核函数将使用数学函数“f = x ^ 2”转换x轴上的数据。这个函数将直线转换为抛物线,其中分类是线性的,使用超平面相对容易。

同样,核函数将应用所需的数学公式将数据转换到更高维度,使非线性可分数据的分类变得更容易。

以下是一些SVM核函数:

Linear Kernel = F(x, y) = sum( x.y) Polynomial Kernel= F(x, y) = (x.y+1)^d Radial Kernel= F(x, y) = exp (-gamma * ||x – y||^2)

线性核等同于支持向量分类器。多项式核优于线性核。这里d表示多项式的度数。径向核非常适合分类非线性数据。每个点的影响半径由gamma值定义。高gamma值对应每个数据的小影响半径,低gamma值对应每个数据的大影响半径。

步骤1:使用library()函数加载“caTools”、“e1071”和“caret”库。如果这些库尚未安装,请使用install.pacakges()进行安装。

library(caTools) library(e1071) library(caret)

步骤2:现在,将数据集加载到‘data’变量中;在这种情况下,使用的是糖尿病数据,属性包括“Pregnancies”、“Glucose”、“BloodPressure”、“SkinThickness”、“Insulin”、“BMI”、“DiabetesPedigreeFunction”、“Age”和“Outcome”。响应变量是“Outcome”。加载数据后,将其分为训练和测试两部分。使用了70%的数据进行训练,30%用于测试。

data <- read.csv(diabetes.csv, header=T) set.seed(123) split <- sample.split(data,SplitRatio = 0.7) train <- subset(data,split==T) test <- subset(data,split==F)

步骤3:首先,使用线性核构建了模型。还进行了成本参数的超参数调整。

set.seed(123) hypertunelinear <- tune(svm,Outcome~., data = train, kernel="linear", ranges = list(cost=c(0.1,0.5,1, 1.5, 2,10))) Linearmodel <- hypertunelinear$best.model

使用线性核进行预测

predict_linear <- predict(Linearmodel,test) confusionMatrix(table(predict_linear, test$Outcome))

步骤4:然后,使用了多项式核,并进行了成本和度数参数的超参数调整。使用多项式核构建的模型准确率为“85.14%”。

set.seed(123) hypertune_Poly <- tune(svm,Outcome~., data = train,cross=4, kernel="polynomial", ranges = list(cost=c(0.1,0.5,1, 1.5, 2,10), degree=c(0.5,1,2,3,4))) polynomial_model <- hypertune_Poly$best.model

使用多项式核进行预测

predict_poly <- predict(polynomial_model, test) confusionMatrix(table(predict_poly, test$Outcome))

步骤5:最后,使用径向核构建了模型。在这里,调整了“成本”和“gamma”超参数。在迄今为止构建的所有模型中,它的准确率最高。使用径向核构建的模型准确率为“98.2%”。

set.seed(123) hypertune_radial <- tune(svm,Outcome~., data = train,cross=4, kernel="radial", ranges = list(cost=c(0.1,0.5,1, 1.5, 2,10),gamma=c(0.01,0.1,0.5,1,2,3))) radial_model <- hypertune_radial$best.model predict_radial <- predict(radial_model, test) confusionMatrix(table(predict_radial, test$Outcome))
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485