SVM

一、基本原理


机器学习算法支持向量机(Support Vector Machine,简称SVM)的原理

SVM是一种监督式学习的方法,广泛应用于统计分类以及回归分析。
其基本原理是找到一个超平面,将不同类别的样本数据分开,并使得间隔最大化。
间隔是指超平面与两个最近的样本点之间的距离,通过最大化间隔,可以提高分类器的鲁棒性和泛化能力。


二、关键概念


间隔和边界:
SVM的目标是找到一个超平面,能够将不同类别的样本数据分开,并且使得间隔最大化。
间隔是 指 超平面与两个最近的样本点之间的 距离,
而边界是指 超平面两侧的样本点 构成的区域。

支持向量:
在SVM中,只有位于边界上的样本点才对分类决策起作用,这些样本点被称为支持向量。
支持向量是决定超平面位置的关键因素,因为它们确定了分类边界的位置和姿态。

核函数:
对于非线性可分的数据,SVM引入了核函数的概念。
核函数能够将原始的特征空间映射到一个更高维度的特征空间,
使得原本线性不可分的样本在该高维空间中线性可分。

常见的核函数有线性核、多项式核、高斯核等。
    

三、SVM的分类


SVM主要分为三类:线性可分支持向量机、线性支持向量机和非线性支持向量机。

线性可分支持向量机:
当训练数据线性可分时,可通过硬间隔最大化,学习一个线性的分类器,
称为线性可分支持向量机,也称硬间隔支持向量机。
在这种情况下,存在一个唯一的超平面,能够将所有样本点完全正确地分开,且使得间隔最大化。

线性支持向量机:
当训练数据近似线性可分时,可通过软间隔最大化,也学习一个线性的分类器,
称为线性支持向量机,也称为软间隔支持向量机。
在这种情况下,允许少量样本点被错误分类,以换取更大的间隔,从而提高分类器的鲁棒性。

非线性支持向量机:
当训练数据线性不可分时,通过使用核函数技巧及软间隔最大化,学习一个非线性的支持向量机。
核函数将原始数据映射到高维空间,
使得在高维空间中数据变得线性可分,从而可以使用线性分类器进行分类。

四、算法步骤


SVM算法的一般步骤包括:
导入数据。
数据归一化(可选,但通常有助于算法的稳定性和性能)。
执行SVM算法,寻找最优的超平面。
绘制分类超平面和支持向量(可选,用于可视化)。
对于非线性问题,选择合适的核函数,执行非线性SVM。

五、优缺点

    
优点:
使用核函数可以向高维空间进行映射,解决非线性分类问题。
分类思想简单,即将样本与决策面的间隔最大化。
分类效果较好,特别是在高维空间中。
    
缺点:
对大规模训练样本难以实施,计算复杂度较高。
解决多分类问题存在困难,通常需要通过组合多个二分类器来实现。

对缺失数据敏感,对参数和核函数的选择敏感。

综上所述,支持向量机是一种基于间隔最大化原则的机器学习算法,
通过找到最优超平面来实现数据的分类。
其强大的分类能力和广泛的应用场景使得SVM在机器学习领域占据重要地位。
    



合页损失函数(Hinge Loss)


合页损失函数是SVM中用于分类任务的一种损失函数,其定义如下:

定义:合页损失函数是一种用于二分类问题的损失函数,其目的是使分类间隔最大化。
对于给定的样本点(x, y),其中x是特征向量,y是目标标签(通常为+1或-1),
合页损失函数试图找到一个超平面,
使得所有样本点被正确分类,并且距离超平面最近的点的距离(即间隔)最大化。

公式:合页损失函数的公式通常表示为:
[
L(y) = \max(0, 1 - ty)
]

其中,t是分类器的预测值(通常是一个实数),y是真实标签(+1或-1)。
这个公式意味着,
当预测值t与真实标签y的乘积大于1时(即分类正确且间隔足够大),损失为0;
否则,损失为(1 - ty),这个值会随着间隔的减小而增大。


SVM与合页损失函数的关系
在SVM中,合页损失函数被用来作为优化目标的一部分,通过最小化合页损失来找到最优的超平面。

与其他损失函数(如0-1损失函数、平方损失函数、绝对损失函数等)相比,
合页损失函数具有一些独特的优点,
如它能够直接体现分类间隔的概念,并且对异常点(即噪声或离群点)的鲁棒性较好。

综上所述,支持向量机在分类任务中常使用的损失函数是合页损失函数,而不是“荷叶损失函数”。
这个名称可能是对合页损失函数的一个误解或笔误。









SVC简易示例


SVC(Support Vector Classification,支持向量分类)算法是SVM中的分类算法,
主要用于解决二分类或多分类问题。

以2维平面为例,数据投影到2维平面上后,
相同类别的数据会相互靠近,不同类别的数据间隔会远一些,就是物以类聚

SVM会在平面上画一条曲线,根据不同类别边缘的样本画线,这样的曲线可以将不同类别的样本划分开
如果2维平面分不开,SVM会将数据投影到更高的维度上,此时这样的线称为超平面

边缘样本中被SVM使用的样本向量,就是支持向量


SVC背后的数学原理基于线性可分的支持向量机(SVM),
当数据不是线性可分时,
可以通过引入松弛变量和使用核技巧将数据映射到更高维的空间,
使原本线性不可分的数据在高维空间中变得线性可分。

以下将使用乳腺癌数据集来举例说明SVC算法,并解释其常用参数的含义及如何按概率方式输出预测结果。

SVC算法在乳腺癌数据集上的应用原因

乳腺癌数据集是一个典型的二分类问题,
目标是根据患者的特征数据判断其是否患有乳腺癌。

SVC算法能够处理这种非线性可分的数据集,
并通过核技巧将数据映射到高维空间,从而找到一个最优的决策边界来区分两类数据。

此外,SVC算法在多个领域中有着广泛的应用,
包括生物信息学、金融领域和自然语言处理等,
其强大的分类能力和稳定性使得它成为解决乳腺癌数据集分类问题的有力工具。




from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import numpy as np

# 加载乳腺癌数据集
data = load_breast_cancer()
X = data.data
y = data.target

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)


# 训练SVC模型,并设置probability=True以生成预测概率
svc = SVC(kernel='rbf', gamma='auto', C=1.0, probability=True)
svc.fit(X_train, y_train)

    
# 输出测试集的预测概率
y_probs = svc.predict_proba(X_test)
y_probs.shape



C:惩罚系数,用于控制误分类点的影响

C越大,
分类的准确性通常越高,但也可能导致过拟合,但受噪声影响较大
模型会仔细区分边缘,精细挑选支持向量

C越小,
模型越简单,但可能欠拟合,模型的预测能力越弱
从边缘向量中,大致选一批支持向量

kernel:核函数

- 用于将非线性可分的训练样本转换成线性可分的样本。
- 常用的核函数包括线性核函数(linear)、多项式核函数(polynomial)、高斯核函数(rbf)等。
- 选择不同的核函数有助于提高模型的准确性和泛化能力。

gamma:核函数的系数

主要影响支持向量的形成。
gamma的值设置得合适时,能够最大化支持向量的训练效果。
如果设置的值太小,模型的准确度可能会受到影响;
如果设置的值太大,则会有欠拟合的风险。

degree:多项式核函数的参数

用于改变模型的复杂度
degree的值越大,模型的复杂度越高,分类效果可能越好,但也可能导致过拟合。







重要参数


SVM(支持向量机)算法的重要参数主要包括以下几个:
一、C参数

    描述:C是正则化参数,用于控制模型的复杂度。它相当于惩罚松弛变量的强度,也反映了模型对误分类的容忍程度。
    作用:
        C值越小,模型越简单,对误分类的惩罚越小,允许一定的容错,泛化能力较强,但可能导致欠拟合。
        C值越大,模型越复杂,对误分类的惩罚越大,追求更高的分类准确率,但可能导致过拟合。

二、kernel参数

    描述:kernel是核函数,用于将原始特征映射到高维空间,以处理非线性问题。
    可选值:
        "linear":线性核函数,适用于线性可分问题。
        "poly":多项式核函数,适用于多项式关系的问题。
        "rbf":高斯核函数(径向基函数),适用于大多数非线性问题。
        "sigmoid":Sigmoid核函数,在某些情况下与神经网络类似。
        "precomputed":表示使用预先计算好的核矩阵。

三、degree参数

    描述:degree是多项式核函数的维度,仅对多项式核函数有效。
    作用:影响多项式核函数的复杂度,进而影响模型的复杂度。

四、gamma参数

    描述:gamma是高斯核函数和多项式核函数中的参数,控制数据点在高维空间中的分布。
    作用:
        gamma值越小,模型对于未知数据的泛化能力越好,但可能导致过度拟合训练数据(在极端情况下可能表现为欠拟合)。
        gamma值越大,模型对于训练集的拟合程度越高,但对于未知数据的泛化能力越差,容易导致过拟合。

五、coef0参数

    描述:coef0是多项式核和Sigmoid核函数中的常数项。
    作用:调整模型的复杂度,影响核函数的形状和决策边界。

六、其他参数

    probability:是否计算每个类别的概率,默认为False。启用此参数会使模型训练时间变长。
    shrinking:是否使用启发式的shrinking算法,默认为True。该算法可以加速训练过程并减少内存使用。
    tol:终止条件中的容限值,用于控制训练的停止条件。值越小,训练过程越严格,迭代次数可能增加。
    cache_size:内存大小,用于缓存核函数计算的结果,以加速训练过程。
    class_weight:类别权重,用于处理类别不平衡问题。可以设置为字典形式,指定每个类别的权重。
    max_iter:最大迭代次数,用于控制训练过程的迭代次数。
    decision_function_shape:决策函数类型,用于多分类问题。可选值为"ovo"(一对一)和"ovr"(一对多)。

这些参数共同决定了SVM模型的性能和表现。在实际应用中,需要根据具体的数据集和任务需求来调整这些参数的值,以达到最佳的模型效果。







import numpy as np
import pandas as pd
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 classification_report, accuracy_score

# 加载乳腺癌数据集
data = datasets.load_breast_cancer()
X = data.data
y = data.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)

# 设置SVC的参数
# class_weight 用于处理类别不平衡问题,这里使用 'balanced' 自动调整权重
# max_iter 设置最大迭代次数
# decision_function_shape 设置为 'ovr'(一对多)或 'ovo'(一对一),针对多分类问题
svc = SVC(kernel='rbf', gamma='scale', C=1.0, class_weight='balanced', max_iter=10000, decision_function_shape='ovr')

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

# 预测
y_pred = svc.predict(X_test)

# 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Classification Report:\n", classification_report(y_test, y_pred))



 
偏置,常量
- coef0参数仅对多项式核('poly')和Sigmoid核('sigmoid')有效。
    


SVC参数coef0的取值范围通常是实数集R,即可以是任意实数。
然而,在实际应用中,coef0的取值通常被限制在一个合理的范围内,以避免模型过于复杂或不稳定。

coef0是多项式核和Sigmoid核中的常数项,它影响了核函数的形状和决策边界的复杂度。具体来说:

当coef0的值较小时,核函数的形状和影响力会相对平滑,这可能导致模型对数据的拟合程度降低,
但有助于提高模型的泛化能力。较小的coef0值可能使得决策边界更加简单,减少了过拟合的风险。

当coef0的值较大时,核函数的形状和影响力会变得更加尖锐,这可能导致模型对数据的拟合程度提高,
但也可能增加过拟合的风险。较大的coef0值可能使得决策边界更加复杂,能够捕捉数据中的细微变化,
但也可能导致模型在未见过的数据上表现不佳。

因此,在选择coef0的值时,需要权衡模型的拟合程度和泛化能力。
通常,可以通过交叉验证等方法来找到最佳的coef0值,以使得模型在训练集和测试集上都能取得较好的性能。

需要注意的是,coef0参数仅对多项式核('poly')和Sigmoid核('sigmoid')有效。
对于其他类型的核函数(如线性核'linear'或径向基函数核'rbf'),coef0参数是不起作用的。因此,在选择核函数时,也需要考虑是否需要使用coef0参数。


与参数C的区别


作为机器学习算法工程师,对于SVM(支持向量机)算法有着深入的理解。在SVM算法中,coef0参数和C参数都是重要的超参数,它们对模型的性能和效果有着显著的影响。下面将分别说明coef0=0.0的含义、各种取值的含义,以及它与参数C的区别。
coef0参数的含义及取值

含义:

coef0是SVM算法中核函数的一个独立项(也称为常数项或偏置项),它主要用于多项式核函数('poly')和sigmoid核函数('sigmoid')中。在核函数的计算公式中,coef0作为一个常数项与特征向量的内积和多项式次数等参数一起参与计算,从而影响样本点在特征空间中的分布和决策边界的形状。

取值:

coef0的默认值为0.0,表示在多项式核函数和sigmoid核函数中不添加额外的常数项。然而,根据具体的数据集和任务需求,可以通过调整coef0的值来改变决策边界的形状和位置,从而优化模型的性能。具体来说,coef0的取值可以是任意实数,但通常会在一定范围内进行搜索和调优,以找到最优的取值。

影响:

coef0的取值对模型的性能有显著影响。当coef0较大时,决策边界可能会更加复杂,因为核函数的计算公式中增加了一个较大的常数项;而当coef0较小时,决策边界可能会更加简单和平滑。因此,在调整coef0的值时,需要权衡模型的复杂度和泛化能力。

与参数C的区别

含义不同:

C参数是SVM算法中的惩罚系数,用于控制对误分类样本的惩罚程度。它决定了模型对分类间隔和错分样本之间的权衡。较大的C值意味着模型会更加重视误分类的惩罚,可能导致过拟合;而较小的C值则意味着模型会更加注重间隔最大化,可能导致欠拟合。

coef0参数则是核函数中的一个独立项,主要用于影响决策边界的形状和位置。它与C参数在含义上是完全不同的。

作用范围不同:

C参数的作用范围是整个模型,它影响了所有样本点的分类和决策边界的形状。而coef0参数的作用范围则更加局部,它主要影响了多项式核函数和sigmoid核函数中样本点在特征空间中的分布。

调优方式不同:

在调优过程中,C参数通常需要通过交叉验证等方法在较大范围内进行搜索和调优,以找到最优的取值。而coef0参数的调优则相对简单一些,因为它通常只需要在一定范围内进行微调即可。

综上所述,coef0参数和C参数在SVM算法中扮演着不同的角色,它们对模型的性能和效果有着各自的影响。在实际应用中,需要根据具体的数据集和任务需求来选择合适的取值,并通过交叉验证等方法进行调优,以获得最优的模型性能。





默认值 scale
- 意味着会根据特征的尺度,自动调整gamma的值 

gamma的含义


gamma参数主要适用于使用高斯径向基函数(RBF)核或多项式(Poly)核的情况。
它用于控制核函数的影响范围,从而决定 样本在特征空间中的分布 以及 决策边界的形状。

各种取值的含义

较小的gamma值:
    RBF核:较小的gamma值意味着单个训练样本对模型的影响范围较大,即样本之间的距离相对较远的特征也可能被考虑进来。这会导致决策边界更加平滑,模型的泛化能力更强。然而,过小的gamma值可能导致模型忽略了样本之间的细节,从而产生欠拟合。
    多项式核:较小的gamma值表示特征之间的相似度较高,这同样会产生更平滑的决策边界。

较大的gamma值:
    RBF核:较大的gamma值表示单个训练样本对模型的影响范围较小,模型将更加关注每个训练样本的局部区域。这会导致决策边界更加复杂和详细,可能更好地拟合训练数据。然而,过大的gamma值可能导致模型过于关注训练样本的细微差异,从而产生过拟合。此外,较大的gamma值会减少支持向量的数量,这可能会影响训练与预测的速度。
    多项式核:较大的gamma值表示特征之间的相似度较低,这可能导致更复杂的决策边界。

默认值“scale”(在scikit-learn库中):
    在scikit-learn的SVC和SVR类中,gamma的默认值为“scale”。
    这意味着gamma的取值与特征的尺度有关,具体地,它使用特征的标准差的倒数作为gamma的值。
    当特征具有不同的尺度时,gamma的值会自动进行调整,以确保模型的性能。
    这是一种自适应的选择,有助于避免手动调整gamma值带来的复杂性。

总结

gamma参数的选择对SVM模型的性能和复杂度具有重要影响。较小的gamma值可能导致欠拟合,而较大的gamma值可能导致过拟合。因此,在使用SVM时,通常需要通过交叉验证、网格搜索等方法来选择最优的gamma值,以取得最好的模型性能。同时,了解gamma参数在不同核函数中的作用以及默认值“scale”的含义,有助于更好地理解和应用SVM算法。
    



 
当选择多项式核函数('poly')
- 默认值 3 
- 小了,模型能力弱,容易欠拟合
- 大小,会过度学习,过拟合 
    

 
在SVM算法中,degree参数主要影响多项式核函数的复杂度。
degree参数的含义

degree参数指定了多项式核函数的次数。当选择多项式核函数('poly')时,
degree决定了特征空间中样本点之间相似度的计算方式。

多项式核函数将原始特征空间中的样本点映射到一个更高维的空间中,
在这个空间中,样本点之间的相似度 可以通过多项式的形式来计算。
degree参数就是这个多项式的次数。

    

各种取值的含义


较小的degree值:
    当degree值较小时,多项式核函数将原始特征空间中的样本点映射到一个相对较低维的空间中。
    在这个空间中,样本点之间的相似度计算相对简单,决策边界也相对平滑。
    这可能导致模型在训练数据上的拟合程度较低,但泛化能力较强。

适中的degree值:
    当degree值适中时,多项式核函数能够将原始特征空间中的样本点映射到一个适当高维的空间中。
    在这个空间中,样本点之间的相似度计算更加复杂,但能够更好地捕捉样本之间的细微差异。
    这通常能够导致模型在训练数据上取得较好的拟合效果,同时保持一定的泛化能力。

较大的degree值:
    当degree值较大时,多项式核函数将原始特征空间中的样本点映射到一个非常高维的空间中。
    在这个空间中,样本点之间的相似度计算非常复杂,决策边界也非常复杂。
    这可能导致模型在训练数据上取得非常好的拟合效果,但泛化能力较弱。
    因为模型过于复杂,容易对训练数据中的噪声和细节进行过度拟合。


总结

 
degree参数的选择对SVM模型的性能和复杂度具有重要影响。
较小的degree值可能导致欠拟合,而较大的degree值可能导致过拟合。
因此,在使用SVM时,通常需要通过交叉验证、网格搜索等方法来选择最优的degree值,以取得最好的模型性能。
同时,了解degree参数在多项式核函数中的作用以及不同取值对模型性能的影响,有助于更好地理解和应用SVM算法。
在实际应用中,还需要结合具体的数据集和任务需求来选择合适的degree值。

    

 

    

 
默认值None,处理样本不平衡问题
- balanced
- {0: 1, 1: 10},值越大表示越侧重

 
作为机器学习算法工程师,对于SVM(支持向量机)算法有着深入的理解。在SVM算法中,class_weight参数是一个非常重要的参数,它主要用于处理不平衡数据集的问题。

class_weight参数的含义

class_weight参数用于指定不同类别的权重,以便在训练过程中对不同类别的样本给予不同的重视程度。
在分类问题中,如果不同类别的样本数量差异很大,
即存在不平衡数据集的情况,那么直接使用SVM算法可能会导致分类器对多数类别样本的过度拟合,
而对少数类别样本的分类效果不佳。
通过设置class_weight参数,可以调整不同类别样本在训练过程中的权重,从而改善模型对少数类别样本的分类能力。

各种取值的含义

自定义字典:

class_weight参数可以设置为一个字典,其中键为类别标签,值为该类别的权重值。
例如,在二分类问题中,可以设置为{0: 1, 1: 10},
表示类别0的权重为1,类别1的权重为10。
这意味着在训练过程中,分类器会更加重视类别1的样本,从而提高对类别1的分类准确性。
对于多分类问题,同样可以通过设置不同类别的权重来调整模型对不同类别的重视程度。

'balanced':

除了自定义字典外,class_weight参数还可以设置为'balanced'。
当设置为'balanced'时,SVM算法会自动根据每个类别的样本数量来计算权重,
使得每个类别的权重与其样本数量的倒数成正比。
这样,少数类别的样本在训练过程中会被赋予更高的权重,从而改善模型对少数类别样本的分类能力。
这种设置方式在处理不平衡数据集时非常有用,因为它能够自动调整权重,而无需手动设置。

 
总结

class_weight参数是SVM算法中一个重要的参数,它用于处理不平衡数据集的问题。
通过设置不同的取值,可以调整不同类别样本在训练过程中的权重,从而改善模型对少数类别样本的分类能力。
在实际应用中,需要根据具体的数据集和任务需求来选择合适的class_weight参数取值。
如果数据集中存在不平衡的情况,可以尝试使用'balanced'选项或手动设置类别权重来优化模型的性能。


 
ovo,ovr
- 对于二分类问题,在原理上没有区别 

 
作为机器学习算法工程师,对于SVM(支持向量机)算法有着深入的理解。
在SVM算法中,decision_function_shape参数是一个关键参数,它决定了多分类策略中决策函数的形状。

decision_function_shape参数的含义

decision_function_shape参数用于指定在多分类问题中,SVM算法如何构建决策函数。
它决定了分类器是采用一对一(ovo)还是一对多(ovr)的方式来构建超平面,从而进行分类。

 


各种取值的含义

'ovo'(one-vs-one):
含义:在ovo模式下,SVM算法会在任意两类样本之间设计一个分类器,
因此k个类别的样本就需要设计k(k-1)/2个分类器。
当对一个未知样本进行分类时,该样本会被提交给所有的分类器进行预测,最后得票最多的类别即为该未知样本的类别。
适用场景:ovo模式适用于类别数量较多且类别之间差异较大的情况。
由于它为每对类别都构建了一个分类器,因此能够更细致地捕捉类别之间的差异,但计算量相对较大。

'ovr'(one-vs-rest):
含义:在ovr模式下,SVM算法会依次把某个类别的样本归为一类,
其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个分类器。
分类时将未知样本分类为具有最大分类函数值的那类。
适用场景:ovr模式适用于类别数量较少或类别之间差异较小的情况。
由于它只为每个类别构建了一个分类器,因此计算量相对较小,但可能无法像ovo模式那样细致地捕捉类别之间的差异。

总结

decision_function_shape参数是SVM算法中一个重要的参数,它决定了多分类策略中决策函数的形状。在选择取值时,需要根据具体的数据集和任务需求来选择合适的模式。如果类别数量较多且类别之间差异较大,可以考虑使用ovo模式;如果类别数量较少或类别之间差异较小,可以考虑使用ovr模式。同时,也需要注意到不同模式在计算量和分类精度上的差异,以便在实际应用中做出最优的选择。


参考



    

    人工智能基础部分18-条件随机场CRF模型的应用