深度学习L6 深度学习 SVM 支持向量机

● 文为「365天深度学习训练营」内部文章
● 参考本文所写文章,请在文章开头带上「🔗 声明」

简介

SVM(支持向量机)是一种常见的机器学习算法,主要用于分类和回归任务。用通俗的语言来说,可以把SVM想象成一个“分界线”寻找器。

假设你两类数据点,它们分布在一个平面上,比如红点和蓝点。SVM的任务就是找到一条线(在高维空间中可以是一个面或超平面),能够将这些红点和蓝点尽可能完美地分开。

但是SVM并不只找一条能简单分开的线,而是要找到一条最优的分界线。它的目标是让线到红点和蓝点中离它最近的那些点的距离尽可能大。离分界线最近的点就是“支持向量”,它们决定了这条线的位置和方向。

SVM的特点

适合小数据集 SVM对小规模的数据集表现好,尤其是在数据不多时也能找到较优的分类方式。
适用于非线性问题 如果红点和蓝点不是线性可分的(即找不到一条直线能分开它们),SVM可以通过“核技巧”将数据投影到高维空间,在那个空间里寻找一条可以分开的线。
对噪音敏感 如果数据中有很多错误或噪音点,SVM的效果可能会受到影响,因为这些错误点会干扰它寻找分界线。

总结

SVM就是找到一条最优分界线,把数据的不同类别分开,确保分界线尽量远离各类数据中距离它最近的点。它还能处理一些比较复杂的分类问题,比如无法用直线分开的数据。

代码

scikit-learn库实现线性可分的SVM

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

# 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 数据预处理
sc = StandardScaler()
X = sc.fit_transform(X)

# 训练集和测试集的分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建SVM模型
svm = SVC(kernel='linear', C=1.0)

# 训练模型
svm.fit(X_train, y_train)

# 预测
y_pred = svm.predict(X_test)

# 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy: %.2f' % (accuracy * 100.0))

scikit-learn库实现非线性可分的SVM

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

# 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 数据预处理
sc = StandardScaler()
X = sc.fit_transform(X)

# 训练集和测试集的分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建SVM模型
svm = SVC(kernel='rbf', C=1.0, gamma=0.1)

# 训练模型
svm.fit(X_train, y_train)

# 预测
y_pred = svm.predict(X_test)

# 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy: %.2f' % (accuracy * 100.0))

sklearn.svm.SVC函数详解

sklearn.svm.SVC(
    C=1.0,
    kernel='rbf',
    degree=3,
    gamma='scale',
    coef0=0.0,
    shrinking=True,
    probability=False,
    tol=1e-3,
    cache_size=200,
    class_weight=None,
    verbose=False,
    max_iter=-1,
    decision_function_shape='ovr',
    break_ties=False,
    random_state=None
)

常用参数详解

  1. C(默认值:1.0)

    • 作用:惩罚参数,用于平衡最大化分类间隔和误分类惩罚之间的关系。
    • 解释:较大的 C 值意味着对误分类的惩罚更大,模型会倾向于将更多的训练数据点分类正确,但可能会导致间隔变小,可能出现过拟合;较小的 C 值则会更关注于间隔的大小,而允许更多的误分类,从而提高模型的泛化能力。
    • 常用范围:通常在 0.001 到 1000 之间进行调节。
  2. kernel(默认值:‘rbf’)

    • 作用:指定要使用的核函数,支持不同的非线性映射方法。
    • 可选值
      • 'linear':线性核函数,即不进行任何非线性映射。
      • 'poly':多项式核函数,通常用于多项式可分的情况。
      • 'rbf':径向基函数(Radial Basis Function),又称高斯核,是最常用的非线性核函数。
      • 'sigmoid':类似于神经网络的激活函数,较少使用。
    • 你也可以传递自定义核函数,方法是传递一个函数。
  3. degree(默认值:3)

    • 作用:当 kernel='poly' 时,指定多项式核的多项式次数。
    • 解释:如果使用多项式核函数(poly),degree 参数决定多项式的阶数,通常是 2 或 3。
  4. gamma(默认值:scale

    • 作用:核函数系数,适用于 'rbf''poly''sigmoid' 核函数。
    • 可选值
      • 'scale':使用 1 / (n_features * X.var()) 作为默认值。这个值会根据输入特征的数量和方差自动调整。
      • 'auto':使用 1 / n_features 作为值。
    • 解释gamma 值越大,模型越倾向于拟合训练数据,但可能会导致过拟合;gamma 值越小,模型更倾向于平滑。
  5. coef0(默认值:0.0)

    • 作用:核函数中的独立项,仅在 kernel='poly'kernel='sigmoid' 时有意义。
    • 解释:用于控制多项式核函数和 sigmoid 核函数中的偏移量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值