支持向量机:从理论到实践
学习目标
通过本课程的学习,学员将掌握支持向量机(SVM)的基本原理,了解SVM在分类和回归任务中的应用,并能够使用Scikit-learn库实现SVM模型。
相关知识点
- Scikit-learn支持向量机
学习内容
1 Scikit-learn支持向量机
1.1 支持向量机的基本原理
支持向量机(Support Vector Machine, SVM)是一种监督学习模型,用于分类和回归分析。SVM的基本思想是找到一个超平面,使得两类样本在该超平面两侧的间隔最大。这个超平面被称为最大间隔超平面,而位于间隔边界上的样本点被称为支持向量。
线性可分情况
在最简单的情况下,如果数据集是线性可分的,即存在一个超平面可以将两类数据完全分开,那么SVM的目标就是找到这个超平面。数学上,这个超平面可以表示为:
[w⋅x+b=0][ w \cdot x + b = 0 ][w⋅x+b=0]
其中,$ w $ 是超平面的法向量,$ b $ 是偏置项,$ x $ 是样本点。为了最大化间隔,SVM优化问题可以表示为:
[minw,b12∥w∥2][ \min_{w, b} \frac{1}{2} \| w \|^2 ][minw,b21∥w∥2]
[subject to yi(w⋅xi+b)≥1,i=1,2,…,n][ \text{subject to } y_i (w \cdot x_i + b) \geq 1, \quad i = 1, 2, \ldots, n ][subject to yi(w⋅xi+b)≥1,i=1,2,…,n]
其中,$ y_i $ 是样本 $ x_i $ 的标签,取值为 +1 或 -1。
线性不可分情况
在实际应用中,数据往往不是线性可分的。为了处理这种情况,SVM引入了软间隔的概念,允许一些样本点位于间隔内部或错误分类。通过引入松弛变量 $ \xi_i $,优化问题变为:
[minw,b,ξ12∥w∥2+C∑i=1nξi][ \min_{w, b, \xi} \frac{1}{2} \| w \|^2 + C \sum_{i=1}^n \xi_i ][minw,b,ξ21∥w∥2+C∑i=1nξi]
[subject to yi(w⋅xi+b)≥1−ξi,ξi≥0,i=1,2,…,n][ \text{subject to } y_i (w \cdot x_i + b) \geq 1 - \xi_i, \quad \xi_i \geq 0, \quad i = 1, 2, \ldots, n ][subject to yi(w⋅xi+b)≥1−ξi,ξi≥0,i=1,2,…,n]
其中,$ C $ 是惩罚参数,用于控制对误分类的惩罚程度。
核技巧
对于非线性可分的数据,SVM通过核技巧将数据映射到高维空间,使其在高维空间中线性可分。常用的核函数包括线性核、多项式核、RBF核等。核函数 $ K(x, x’) $ 定义为:
[K(x,x′)=ϕ(x)⋅ϕ(x′)][ K(x, x') = \phi(x) \cdot \phi(x') ][K(x,x′)=ϕ(x)⋅ϕ(x′)]
其中,$ \phi $ 是从原始空间到高维空间的映射函数。
1.2 使用Scikit-learn实现SVM分类
Scikit-learn 提供了 SVC 类来实现SVM分类。下面是一个简单的示例,展示如何使用 SVC 进行分类。
导入库
pip install scikit-learn==1.1
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report
加载数据集
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data[:, :2] # 只使用前两个特征
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
数据预处理
# 标准化特征
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
训练模型
# 创建SVM分类器
svm = SVC(kernel='linear', C=1.0, random_state=42)
# 训练模型
svm.fit(X_train, y_train)
预测和评估
# 预测
y_pred = svm.predict(X_test)
# 评估
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')
print(classification_report(y_test, y_pred, target_names=iris.target_names))

1.3 使用Scikit-learn实现SVM回归
Scikit-learn 提供了 SVR 类来实现SVM回归。下面是一个简单的示例,展示如何使用 SVR 进行回归。
导入库
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
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
加载数据集
# 加载糖尿病房价数据集
diabetes = datasets.load_diabetes()
X = diabetes.data[:, 5:6] # 只使用第6个特征
y = diabetes.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
数据预处理
# 标准化特征
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
训练模型
# 创建SVM回归器
svr = SVR(kernel='linear', C=1.0, epsilon=0.1)
# 训练模型
svr.fit(X_train, y_train)
预测和评估
# 预测
y_pred = svr.predict(X_test)
# 评估
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')
print(f'R^2 Score: {r2:.2f}')
Mean Squared Error: 5262.11
R^2 Score: 0.03
通过本课程的学习,学员将能够理解支持向量机的基本原理,并能够使用Scikit-learn库实现SVM进行分类和回归任务。

被折叠的 条评论
为什么被折叠?



