支持向量机(SVM)详解及应用:分类与回归
支持向量机(SVM)是一种强大的监督学习算法,广泛用于分类和回归任务。SVM 通过找到最优的超平面来区分不同类别,或者在回归任务中进行精确预测。本文将详细介绍 SVM 的基本理论,并提供分类和回归任务的代码示例,以帮助你深入理解 SVM 的应用。
1、支持向量机的基本原理
(1)分类任务
在分类问题中,SVM 的目标是找到一个最佳的超平面,将数据分成不同的类别。这个超平面使得两类数据点之间的间隔最大化,从而提高分类的准确性。SVM 的基本思想是通过最大化间隔来提高模型的泛化能力。
数学基础:
SVM 分类问题可以用以下优化问题来描述:
min w , b 1 2 ∥ w ∥ 2 \min_{\mathbf{w}, b} \frac{1}{2} \|\mathbf{w}\|^2 w,bmin21∥w∥2
受约束条件:
y i ( w ⋅ x i + b ) ≥ 1 y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1 yi(w⋅xi+b)≥1
其中,(\mathbf{w}) 是超平面的法向量,(b) 是偏置项,(\mathbf{x}_i) 是特征向量,(y_i) 是标签(+1 或 -1)。
(2)回归任务
支持向量回归(SVR)是 SVM 的一种扩展,用于处理回归问题。SVR 的目标是找到一个回归函数,该函数能够在允许的误差范围内最佳地拟合数据。
数学基础:
SVR 的优化问题可以表示为:
min w , b , ξ , ξ ∗ 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ( ξ i + ξ i ∗ ) \min_{\mathbf{w}, b, \xi, \xi^*} \frac{1}{2} \|\mathbf{w}\|^2 + C \sum_{i=1}^n (\xi_i + \xi_i^*) w,b,ξ,ξ∗min21∥w∥2+Ci=1∑n(ξi+ξi∗)
受约束条件:
y
i
−
(
w
⋅
x
i
+
b
)
≤
ϵ
+
ξ
i
y_i - (\mathbf{w} \cdot \mathbf{x}_i + b) \leq \epsilon + \xi_i
yi−(w⋅xi+b)≤ϵ+ξi
(
w
⋅
x
i
+
b
)
−
y
i
≤
ϵ
+
ξ
i
∗
(\mathbf{w} \cdot \mathbf{x}_i + b) - y_i \leq \epsilon + \xi_i^*
(w⋅xi+b)−yi≤ϵ+ξi∗
ξ
i
,
ξ
i
∗
≥
0
\xi_i, \xi_i^* \geq 0
ξi,ξi∗≥0
其中,(\xi_i) 和 (\xi_i^*) 是松弛变量,(\epsilon) 是容忍度,(C) 是正则化参数。
2、SVM 分类任务代码示例
我们将使用 scikit-learn
库中的 SVC
进行分类任务。以下代码演示了如何使用支持向量机进行分类,并绘制决策边界。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import classification_report, confusion_matrix
# 1. 加载数据集
iris = datasets.load_iris()
X = iris.data[:, :2] # 只选择前两个特征
y = iris.target
# 2. 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 3. 创建 SVM 模型
svm_model = SVC(kernel='rbf', C=1.0, gamma='scale')
# 4. 训练模型
svm_model.fit(X_train, y_train)
# 5. 预测
y_pred = svm_model.predict(X_test)
# 6. 评估模型
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))
print("\nClassification Report:")
print(classification_report(y_test, y_pred))
# 7. 可视化
def plot_decision_boundaries(X, y, model, title="Decision Boundaries"):
h = .02 # step size in the mesh
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.3)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title(title)
plt.show()
plot_decision_boundaries(X, y, svm_model, title="SVM Decision Boundaries with RBF Kernel")
3、SVM 回归任务代码示例
接下来,我们使用 scikit-learn
中的 SVR
进行回归任务。以下代码演示了如何使用支持向量回归进行预测,并绘制回归结果。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVR
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
# 1. 生成合成回归数据
X, y = make_regression(n_samples=100, n_features=1, noise=0.1, random_state=42)
# 2. 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 3. 创建 SVR 模型
svr_model = SVR(kernel='rbf', C=100, epsilon=0.1)
# 4. 训练模型
svr_model.fit(X_train, y_train)
# 5. 预测
y_pred = svr_model.predict(X_test)
# 6. 评估模型
print("Mean Squared Error:", mean_squared_error(y_test, y_pred))
print("R^2 Score:", r2_score(y_test, y_pred))
# 7. 可视化
plt.scatter(X_test, y_test, color='darkorange', label='Data')
plt.plot(X_test, y_pred, color='navy', lw=2, label='SVR fit')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.title('Support Vector Regression')
plt.legend()
plt.show()
结论
支持向量机(SVM)是一种有效的分类和回归算法。对于分类任务,SVM 通过最大化类别间的间隔来进行优化,而在回归任务中,SVM 通过找到一个容忍误差的回归函数来进行预测。通过 scikit-learn
提供的 SVM 实现,我们可以方便地进行模型训练、预测和评估,并通过可视化工具直观地展示模型效果。希望本文的理论介绍和代码示例能帮助你更好地理解和应用 SVM。