机器学习(6)-支持向量机(SVM)

支持向量机是什么

支持向量机(Support Vector Machines,SVM)是一种二分类模型,目的是寻找一个超平面来对样本进行分割,分割的原则是间隔最大化,最终转化为一个凸二次规划问题来求解。SVM是用来解决二分类问题的有监督学习算法,在引入了核方法之后SVM也可以用来解决非线性问题。

SVM 的核心思想是通过寻找数据集中的支持向量,从而将不同类别的数据点分开。支持向量是那些位于不同类别边界上的数据点,它们决定了边界的位置。SVM 通过最小化支持向量的数量和距离边界的最小值,来优化模型。

在多分类问题中,我们的目标是找到多个超平面,将不同类别的数据点分开。我们可以将这个问题转换为多个二分类问题,并为每个类别创建一个分类器。

超平面

超平面是指n维线性空间中维度为n-1的子空间。它可以把线性空间分割成不相交的两部分。比如,在二维空间中,一条直线是一维的,它把平面分成了两块;三维空间中,一个平面是二维的,它把空间分成了两块。

SVM可分为以下三类

  • 硬间隔支持向量机(线性可分支持向量机):当训练数据线性可分时,可通过硬间隔最大化学得一个线性可分支持向量机。
  • 软间隔支持向量机:当训练数据近似线性可分时,可通过软间隔最大化学得一个线性支持向量机。
  • 非线性支持向量机:当训练数据线性不可分时,可通过核方法以及软间隔最大化学得一个非线性支持向量机。

核函数(Kernel function)

将原始空间中的向量作为输入向量,并返回特征空间(转换后的数据空间,可能是高维)中向量的点积的函数称为核函数。

对于一些数据集,不存在一个能够正确划分两个类别样本的超平面,对这样的问题,可以将样本从原始空间映射到一个更高维的特征空间中,使得样本在这个特征空间中线性可分。数学上可以证明,如果原始空间是有限维,即属性数有限,则一定存在一个高维特征空间使样本可分。

给定一个训练实例X,我们利用X的各个特征与我们预先选定的地标(landmarks) 𝑙(1), 𝑙(2), 𝑙(3)的近似程度来选取新的特征f1,f2,f3。

在预测时,我们采用的特征不是训练实例本身的特征,而是通过核函数计算出的新特征f1,f2,f3。

硬间隔支持向量机

即线性可分的支持向量机,硬间隔支持向量机是一种用于线性可分数据的分类方法。其目标是找到一个能够完全分开两类数据的最优超平面,同时最大化两类之间的间隔。硬间隔SVM要求数据完全线性可分,且没有任何数据点落在间隔区域内或被误分类。这种严格的要求使得硬间隔SVM在处理现实世界中带有噪声和重叠的复杂数据时不太实用。

软间隔支持向量机

软间隔支持向量机是一种能够处理线性不可分数据的分类方法。与硬间隔SVM不同,软间隔SVM允许一些数据点落在间隔区域内,甚至被误分类。通过引入松弛变量,软间隔SVM在寻找最优超平面时允许一定程度的分类错误,从而在模型的复杂性和分类误差之间找到平衡。

通过引入松弛变量,允许一些样本出错,但我们希望出错的样本越少越好,所以松弛变量也有限制。

非线性支持向量机

非线性支持向量机使用核函数将原始特征空间映射到高维特征空间,以处理线性不可分的数据。通过在高维空间中寻找最优超平面,非线性SVM能够处理各种复杂的分类问题。常用的核函数包括线性核、多项式核、径向基函数(RBF)核等。核方法使得非线性SVM能够在原始空间中执行复杂的非线性分类,而无需显式地计算高维特征。

支持向量回归(SVR)

支持向量机还可以用来解决回归问题,称为支持向量回归(Support Vector Regression,SVR)。 支持向量机回归通过最小化预测误差来拟合数据,并且在拟合过程中保持一个边界(间隔),使得大部分数据点都落在这个边界之内。SVR与分类问题中的支持向量机(SVC)有些相似,但其目标是拟合数据而不是分离数据。

在SVR中,我们定义一个边界,由一个中心线和两个平行的边界线组成。这些边界线之间的距离称为间隔,它由用户预先设定。支持向量机的目标是找到一个函数,使得大部分数据点都落在间隔内,并且使得落在间隔之外的数据点的预测误差最小化。这些落在间隔之外的数据点被称为支持向量。

支持向量机回归(SVR)与一般线性回归的区别

SVR

  • 1.数据在间隔带内则不计算损失,当且仅当f(x)与y之间的差距的绝对值大于 ε 才计算损失
  • 2.通过最大化间隔带的宽度与最小化总损失来优化模型

一般线性回归

  • 1.只要f(x)与y不相等时,就计算损失
  • 2.通过梯度下降之后求均值来优化模型

支持向量机实践-Python

支持向量机分类(SVC)

使用经典的Iris数据集进行分类任务

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import classification_report, accuracy_score

# 加载Iris数据集
iris = load_iris()
X = iris.data
y = iris.target

# 数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 对特征进行标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 构建SVM模型
model = SVC(kernel='linear', random_state=42)

# 训练模型
model.fit(X_train, y_train)

# 进行预测
y_pred = model.predict(X_test)

# 输出分类报告和准确率
print("Classification Report:\n", classification_report(y_test, y_pred))
print("Accuracy Score:", accuracy_score(y_test, y_pred))

# 输出分类结果
print("Predicted Labels:", y_pred)
print("True Labels:     ", y_test)

支持向量机回归(SVR)

使用sklearn的california房价数据集

import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error, r2_score

# 加载数据集
california = fetch_california_housing()
X, y = california.data, california.target

# 数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 标准化数据
scaler_X = StandardScaler()
scaler_y = StandardScaler()
X_train = scaler_X.fit_transform(X_train)
X_test = scaler_X.transform(X_test)
y_train = scaler_y.fit_transform(y_train.reshape(-1, 1)).flatten()
y_test = scaler_y.transform(y_test.reshape(-1, 1)).flatten()

# 创建并训练SVR模型
svr = SVR(kernel='rbf')
svr.fit(X_train, y_train)

# 进行预测
y_pred_train = svr.predict(X_train)
y_pred_test = svr.predict(X_test)

# 反标准化预测结果
y_pred_train = scaler_y.inverse_transform(y_pred_train.reshape(-1, 1)).flatten()
y_pred_test = scaler_y.inverse_transform(y_pred_test.reshape(-1, 1)).flatten()
y_train = scaler_y.inverse_transform(y_train.reshape(-1, 1)).flatten()
y_test = scaler_y.inverse_transform(y_test.reshape(-1, 1)).flatten()

# 计算均方误差
mse_train = mean_squared_error(y_train, y_pred_train)
mse_test = mean_squared_error(y_test, y_pred_test)

# 计算R²得分
r2_train = r2_score(y_train, y_pred_train)
r2_test = r2_score(y_test, y_pred_test)

print(f"训练集均方误差: {mse_train}")
print(f"测试集均方误差: {mse_test}")
print(f"训练集R²得分: {r2_train}")
print(f"测试集R²得分: {r2_test}")

参考

【机器学习算法笔记系列】支持向量机(SVM)算法详解和实战_支持向量机算法-CSDN博客

机器学习算法(七):支持向量机SVM_svm进行六维数据-CSDN博客

机器学习有很多关于核函数的说法,核函数的定义和作用是什么? - 知乎 (zhihu.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值