Scikit-learn从入门到实践:Scikit-learn SVM入门与实践

支持向量机:从理论到实践

学习目标

通过本课程的学习,学员将掌握支持向量机(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 ][wx+b=0]
其中,$ w $ 是超平面的法向量,$ b $ 是偏置项,$ x $ 是样本点。为了最大化间隔,SVM优化问题可以表示为:
[min⁡w,b12∥w∥2][ \min_{w, b} \frac{1}{2} \| w \|^2 ][minw,b21w2]
[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(wxi+b)1,i=1,2,,n]
其中,$ y_i $ 是样本 $ x_i $ 的标签,取值为 +1 或 -1。

线性不可分情况

在实际应用中,数据往往不是线性可分的。为了处理这种情况,SVM引入了软间隔的概念,允许一些样本点位于间隔内部或错误分类。通过引入松弛变量 $ \xi_i $,优化问题变为:
[min⁡w,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,ξ21w2+Ci=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(wxi+b)1ξi,ξi0,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进行分类和回归任务。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值