引言:
在正文开始之前,首先给大家介绍一个不错的人工智能学习教程:https://www.captainbed.cn/bbs。其中包含了机器学习、深度学习、强化学习等系列教程,感兴趣的读者可以自行查阅。
一、算法介绍
支持向量回归(SVR)是一种监督学习算法,用于解决回归问题。其核心思想是找到一个超平面,这个超平面能够以最小的误差包含所有的训练样本。与支持向量机处理分类问题类似,支持向量回归的目标是确保尽可能多的数据点位于由超平面决定的边界内。
二、算法原理
2.1 基本思想
SVR的目标是找到一个函数 f ( x ) f(x) f(x),使得该函数在整个数据集上的偏差最小,并且同时保证模型的复杂度较低,以提高模型的泛化能力。在实现上,这通常通过引入所谓的“软间隔”来实现,允许某些数据点可以处于误差允许的范围之外,从而达到更好的预测效果。
2.2 数学模型
在支持向量回归中,我们试图找到一个线性函数 f ( x ) = w x + b f(x) = wx + b f(x)=wx+b,其中 w w w 是权重向量, b b b 是偏置。我们希望大部分的数据点 ( x i , y i ) (x_i, y_i) (xi,yi) 都满足 ∣ y i − f ( x i ) ∣ ≤ ϵ |y_i - f(x_i)| \leq \epsilon ∣yi−f(xi)∣≤ϵ,这里的 ϵ \epsilon ϵ 是预先设定的一个小的非负数,表示容忍的误差范围。
为了找到这样的函数,我们需要解决以下优化问题:
min w , b 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ( ξ i + ξ i ∗ ) \min_{w, b} \frac{1}{2} \|w\|^2 + C \sum_{i=1}^n (\xi_i + \xi_i^*) w,bmin21∥w∥2+Ci=1∑n(ξi+ξi∗)
其中, ξ i \xi_i ξi 和 ξ i ∗ \xi_i^* ξi∗ 是松弛变量,用于处理不在误差范围内的数据点, C C C 是正则化参数,用于控制模型复杂度和误差之间的平衡。
2.3 核技巧
在实际应用中,很多问题的数据分布可能是非线性的,直接使用线性函数进行回归可能无法达到较好的效果。SVR通过引入核函数来解决这一问题。核函数可以将数据映射到一个高维空间,在这个高维空间中,原本线性不可分的数据可能变得线性可分。常见的核函数包括线性核、多项式核、径向基函数(RBF)核等。
三、案例分析
为了进一步理解支持向量回归(SVR)的应用,我们将使用加州房价数据集进行模型训练和测试。加州房价数据集包含以下特征:
- MedInc:收入中位数
- HouseAge:房屋年龄的中位数
- AveRooms:平均房间数目
- AveBedrms:平均卧室数目
- Population:区域人口
- AveOccup:平均入住率
- Latitude:纬度
- Longitude:经度
数据集的目标变量为MedHouseVal,即房屋价值的中位数(单位为$100,000)。
3.1 案例代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
# 加载数据
california = fetch_california_housing()
X = pd.DataFrame(california.data, columns=california.feature_names)
y = california.target
X
# 数据预处理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 创建SVR模型
svr = SVR(kernel='rbf')
# 训练模型
svr.fit(X_train, y_train)
# 预测测试集
y_pred = svr.predict(X_test)
# 计算MSE
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse}')
# 可视化实际值与预测值
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, color='blue')
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'r--', lw=2)
plt.xlabel('Actual')
plt.ylabel('Predicted')
plt.title('Actual vs. Predicted')
plt.show()
# 可视化误差分布
errors = y_pred - y_test
plt.figure(figsize=(10, 6))
plt.hist(errors, bins=20, color='purple')
plt.xlabel('Prediction Error')
plt.ylabel('Frequency')
plt.title('Prediction Error Distribution')
plt.show()
3.2 结果分析
通过运行代码,得到模型在测试集上的平均平方误差(MSE)为: 0.3551984619989417。这个值越低,表示模型的预测能力越好。大家可以通过更换 SVR 的核函数类型(如 ‘linear’, ‘poly’ 等)来尝试改善模型的表现。
预测值与实际值的对比图如下:
误差分布图如下:
四、结论
通过这个案例,我们可以看到支持向量回归在实际数据集上的应用。尽管 SVR 是一种强大的回归工具,但选择合适的核函数和调整模型参数对于获得最佳性能至关重要。