scikit-learn 中 SVM 的使用

本文介绍了SVM在分类和回归中的应用,包括线性SVM和非线性SVM。线性SVM使用`LinearSVC`实现,适合大数据集且数据线性可分的情况,而非线性SVM通过`SVC`配合多项式和高斯RBF核函数处理非线性问题。在选择核函数时,通常先尝试线性核,若效果不佳则采用RBF核。SVM回归同样可借助`LinearSVR`和`SVR`进行线性及非线性建模。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 线性 SVM 分类器

import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC

# sklearn 自带数据
iris = datasets.load_iris()
X = iris["data"][:, (2, 3)]  # petal length, petal width
y = (iris["target"] == 2).astype(np.float64)  # Iris virginica

svm_clf = Pipeline([
        # SVM 需要对数据做归一化处理
        ("scaler", StandardScaler()),
        # C越小,间距 margin 越大,容错率越高(允许更多的实例分错)
        ("linear_svc", LinearSVC(C=1, loss="hinge", random_state=42)),
    ])
# 训练
svm_clf.fit(X, y)

# 预测
svm_clf.predict([[5.5, 1.7]])
# 直接返回类别
>>>array([1.])

线性 SVM 优点:速度快

2 非线性 SVM 分类器

from sklearn.datasets import make_moons
X, y = make_moons(n_samples=100, noise=0.15, random_state=42)

from sklearn.svm import SVC

poly_kernel_svm_clf = Pipeline([
        ("scaler", StandardScaler()),
        ("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5))
    ])
poly_kernel_svm_clf.fit(X, y)
# Gaussian RBF Kernel
rbf_kernel_svm_clf = Pipeline([
        ("scaler", StandardScaler()),
        # gamma控制rbf钟形曲线得宽窄:gamma较小时钟形曲线较宽,实例影响更大,当模型过拟合时,减小gamma值,同 C 得调整一样
        ("svm_clf", SVC(kernel="rbf", gamma=5, C=0.001))
    ])
rbf_kernel_svm_clf.fit(X, y)

关于 kernel 的选择:
1 首选 linear kernel,在 scikit-learn 中 LinearSVC 比 SVC(kernel=“linear”) 要快,特别是训练集特别大时候,首选 LinearSVC

2 线性kernel 效果不好时再尝试 Gaussian RBF kernel,大部分时候 RBF 都能由较好的效果

3 有时间可以用 cross-validation 和 grid search 尝试其它 kernel

3 SVM 回归

# 线性回归
np.random.seed(42)
m = 50
X = 2 * np.random.rand(m, 1)
y = (4 + 3 * X + np.random.randn(m, 1)).ravel()

from sklearn.svm import LinearSVR

svm_reg = LinearSVR(epsilon=1.5, random_state=42)
svm_reg.fit(X, y)
from sklearn.svm import SVR
# 设置kernel非线性回归
svm_poly_reg = SVR(kernel="poly", degree=2, C=100, epsilon=0.1, gamma="scale")
svm_poly_reg.fit(X, y)

关于 SVM 的原理可以参考 SVM 原理详细推导

参考:
Hands-on Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值