用Python实现9大回归算法详解——07. 支持向量机回归算法

1. 支持向量机回归的基本概念

支持向量机回归(Support Vector Regression, SVR)是支持向量机(SVM)的一个应用,主要用于回归任务。与分类任务中的 SVM 类似,SVR 通过找到一个最大化边界(即支持向量)的模型,来最小化模型的误差。在 SVR 中,模型试图在误差不超过某个阈值(ϵ\epsilonϵ)的情况下,最大限度地保持平滑度。

2. 支持向量机回归的数学表达
2.1 SVR 目标函数

支持向量机回归的目标是在满足一定误差()的情况下,使模型尽可能简单。其优化问题可以表示为:

在约束条件下:

其中:

  • 是权重向量。
  • 是偏置项。
  • 是误差容忍度。
  • 是松弛变量,允许有些点位于边界外。
2.2 拉格朗日函数

为了求解上述优化问题,我们引入拉格朗日乘子并构造拉格朗日函数:

其中, 是拉格朗日乘子, 是惩罚参数,控制模型对误差的容忍度。

2.3 对偶问题

通过对拉格朗日函数求偏导数并进行优化,可以得到对偶问题的表达式:

在约束条件下:

2.4 最终回归模型

通过解对偶问题,最终的回归模型可以表示为:

3. 支持向量机回归的核函数

与 SVM 类似,SVR 也可以应用核函数来处理非线性回归问题。常见的核函数包括:

  • 线性核
  • 多项式核
  • 高斯径向基函数(RBF)核

其中, 是核函数的参数,控制核的宽度。

4. 支持向量机回归的优缺点

优点

  1. 有效处理高维数据:SVR 可以很好地处理特征空间非常大的数据集,尤其是在使用核函数的情况下。
  2. 控制泛化能力 :通过调整参数 ,可以很好地控制模型的泛化能力。
  3. 适用于非线性数据:SVR 通过核技巧可以很好地处理非线性回归问题。

缺点

  1. 计算复杂度高:SVR 的训练过程涉及二次规划问题,计算复杂度较高,尤其是在大规模数据集上。
  2. 难以解释:对于非线性核函数,SVR 模型的解释性较差,很难直观理解模型的决策过程。

5. 支持向量机回归案例

我们将通过一个具体的案例来展示如何使用支持向量机回归进行预测,并对结果进行详细分析。

5.1 数据加载与预处理

我们将使用一个模拟的数据集来进行回归预测。该数据集包含一个特征和一个目标变量,目标变量与特征之间存在非线性关系。

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error, r2_score

# 生成模拟数据
np.random.seed(42)
X = np.sort(5 * np.random.rand(100, 1), axis=0)
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])

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

# 绘制数据点
plt.scatter(X, y, color='darkorange', label='data')
plt.title('Data Points')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.show()

输出:

解释

  • 数据生成 :生成的数据包含一个输入特征 和一个目标变量 ,其中目标变量是通过对输入特征的正弦函数进行变换并加入噪声后得到的。这种数据模拟了真实情况下的非线性关系。

  • 数据可视化:通过绘制数据点,我们可以直观地看到数据的分布情况,数据具有明显的非线性趋势。

5.2 模型训练与预测

我们使用 SVR 进行模型训练,并选择 RBF 核函数。RBF 核函数可以很好地处理非线性数据。

python 复制代码
# 定义支持向量机回归模型,使用RBF核函数
svr = SVR(kernel='rbf', C=1.0, epsilon=0.1)

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

# 对测试集进行预测
y_pred = svr.predict(X_test)

解释

  • 模型定义 :我们选择 RBF 核函数来处理非线性数据。参数 控制对训练误差的惩罚, 控制模型的精度。
  • 模型训练:使用训练集对 SVR 模型进行训练。
  • 模型预测:训练完成后,对测试集进行预测。
5.3 模型评估与结果分析

我们使用均方误差(MSE)和决定系数()来评估模型的性能。

python 复制代码
# 计算均方误差 (MSE) 和决定系数 (R²)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("均方误差 (MSE):", mse)
print("决定系数 (R²):", r2)

输出:

python 复制代码
均方误差 (MSE): 0.008105511962284498
决定系数 (R²): 0.9831038186845479

解释

  • 均方误差 (MSE):MSE 是预测值与实际值之间的平均平方误差。MSE 越小,模型的预测效果越好。在本例中,MSE 为 0.008,表明模型的预测误差非常小。
  • 决定系数 (R²) 表示模型解释了目标变量方差的百分比。这里的 为 0.983,说明模型能够解释 98.0% 的目标变量方差,拟合效果极佳。
5.4 模型预测的可视化

为了更直观地展示支持向量机回归模型的预测效果,我们将绘制测试集的预测值与实际值的对比图。

python 复制代码
# 绘制测试集预测值与实际值的对比图
plt.scatter(X_test, y_test, color='darkorange', label='Actual')
plt.scatter(X_test, y_pred, color='navy', label='Predicted')
plt.plot(X_test, y_pred, color='blue', linewidth=2, label='SVR Model')
plt.title('SVR: Actual vs Predicted')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.legend()
plt.show()

输出:

可视化解释

  • 实际值(橙色点):表示测试集的实际目标值。
  • 预测值(蓝色点):表示模型预测的目标值。通过对比可以看出,模型的预测值与实际值非常接近。
  • 预测曲线(蓝色线):表示 SVR 模型的预测曲线,说明模型很好地捕捉到了数据中的非线性关系。
5.5 参数调优

为了进一步提升模型性能,我们可以调整 SVR 模型的参数,如 。这些参数决定了模型的复杂度和对误差的容忍度。

  1. 参数 :控制对训练误差的惩罚。较大的 值会让模型尝试更好地拟合训练数据,但可能导致过拟合。
  2. 参数 :控制模型的精度。较小的 值会使模型更精确地拟合数据,但也可能增加模型复杂度。

通过网格搜索(Grid Search)或随机搜索(Random Search),可以找到最优的参数组合。

python 复制代码
from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'C': [0.1, 1, 10],
    'epsilon': [0.01, 0.1],
    'kernel': ['rbf']
}

# 实例化支持向量机回归模型
svr = SVR()

# 进行网格搜索
grid_search = GridSearchCV(estimator=svr, param_grid=param_grid, cv=5, scoring='neg_mean_squared_error')
grid_search.fit(X_train, y_train)

# 输出最佳参数
print("最佳参数:", grid_search.best_params_)

输出:

python 复制代码
最佳参数: {'C': 10, 'epsilon': 0.01, 'kernel': 'rbf'}

解释

  • 参数选择 :我们通过网格搜索选择了多个 值,以及核函数 rbf
  • 交叉验证:通过 5 折交叉验证(cv=5),网格搜索选择出最优参数组合。
  • 最佳参数输出:训练完成后,输出最优的参数组合。

6. 总结

支持向量机回归是一种强大的回归算法,通过最大化边界和最小化误差来构建稳健的回归模型。它特别适用于高维数据和非线性回归任务。通过合理选择核函数和调整模型参数,SVR 能够在各种复杂的回归任务中表现出色。然而,SVR 的计算复杂度较高,且模型解释性较差,因此在应用时需要注意这些限制。

相关推荐
花海少爷2 分钟前
第十章 JavaScript的应用课后习题
开发语言·javascript·ecmascript
手握风云-2 分钟前
数据结构(Java版)第二期:包装类和泛型
java·开发语言·数据结构
喵叔哟22 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生28 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
hopetomorrow42 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
小牛itbull1 小时前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i1 小时前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
nuclear20111 小时前
使用Python 在Excel中创建和取消数据分组 - 详解
python·excel数据分组·创建excel分组·excel分类汇总·excel嵌套分组·excel大纲级别·取消excel分组
闲暇部落1 小时前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
GIS瞧葩菜1 小时前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript