简介
支持向量机是监督学习模型,支持分类与回归任务;
在二分类任务方面,模型通过找到样本点之间的最优分类间隔,使得两类样本点到该超平面的距离最大化;
求解最优间隔是一个线性规划问题,求解过程会用到拉格朗日乘子法、KKT条件以及SMO算法;
在回归任务方面,模型通过构建一条间隔带的方式,定义样本预测准确无损失状态,求解一个线性规划问题,其基本型跟二分类问题类似;
分类——硬间隔、软间隔、核函数
若数据完全线性可分,则模型为硬间隔支持向量机模型,分类完全正确;
若数据近似线性可分,则模型为软间隔支持向量机模型,允许一定的样本分类错误;
若数据非线性可分,则通过核函数(高斯核、多项式核、sigmoid核等)将数据映射到更高维的空间,使得在新的空间中,数据近似线性可分;
分类——求解超平面
- 超平面:y = wx + b ,求解w与b;
- 定义距离:样本点到超平面的距离 r = |wx + b| / ||w|| = 1 / ||w||;
- 基本问题原型:
min 1/2 * ||w|| ** 2
s.t. y * (w * x + b) >= 1; - 拉格朗日乘子法转化问题原型得到对偶问题;
- KKT条件求解,SMO算法;
回归——求解分隔带
- 超平面:y = wx + b ,求解w与b;
- 定义间隔带:样本点满足|wx + b - y| <= c(常量),此时认为预测准确、无损失;
- 基本问题原型:
min 1/2 * ||w|| ** 2
s.t. |wx + b - y| <= c; - 拉格朗日乘子法转化问题原型得到对偶问题;
- KKT条件求解,SMO算法;
样本量、特征量与使用场景
- 样本量小于特征量时,建议使用简单模型,如不含核函数的支持向量机或线性模型、逻辑回归模型;
- 样本量大于特征量,且特征量在1K以下、样本量在1w以下时,建议使用高斯核的支持向量机;
- 样本量大于特征量,且特征量在1K以下、样本量在5w以上时,求解分类间隔较慢,建议挖掘更多特征,且使用简单模型,如不含核函数的支持向量机或线性模型、逻辑回归模型;
优缺点
优点: 模型通过训练学习到的支持向量来进行决策,计算复杂度依赖于支持向量的数量而非样本空间的维数,具备较好的鲁棒性;模型的核函数可以将数据映射到更高维的空间以实现数据的近似线性可分,而又对核函数的选取不敏感;
缺点: 大样本的情况下,求解凸优化问题对于内存和时间的花销均较大;经典的支持向量机是二分类模型,在多分类任务中,需要训练多个二分类模型,这将增加训练时间;
sklearn实战应用
SVC、SVR主要参数
参数 | 类型 | 缺省 | 意义 |
---|---|---|---|
C | float | 1 | 错误项惩罚系数,C越大训练准确率越高、泛化能力越低 |
kernel | str | ‘rbf’ | 核函数;linear’: 线性核;‘poly’:多项式核;‘rbf’:高斯核;‘sigmod’: sigmod核 |
degree | int | 3 | 多项式核的最高阶数,其他核情况忽略 |
gamma | str | ‘auto’ | 核函数系数,只与rbf,poly,sigmoid核有关,值为1/n_features |
coef0 | float | 0.0 | 核函数系数,只与poly,sigmoid核有关,常数项 |
random_state | int | None | 随机种子,用于对应一种结果状态 |
… | … | … | … |
分类、回归任务
# SVC分类任务
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
# 鸢尾花分类数据
data = datasets.load_iris()
X_train, X_test, y_train, y_test = train_test_split(data["data"], data["target"], test_size=0.3, random_state=41)
# 支持向量机分类模型
model = SVC()
model.fit(X_train, y_train)
print("train acc: ", model.score(X_train, y_train))
print("test acc: ", model.score(X_test, y_test))
# 回归任务
from sklearn import datasets
from sklearn.svm import SVR
from sklearn.model_selection import train_test_split
# 波士顿房价数据
data = datasets.load_boston()
X_train, X_test, y_train, y_test = train_test_split(data["data"], data["target"], test_size=0.3, random_state=42)
# 支持向量机回归模型
model = SVR()
model.fit(X_train, y_train)
print("train loss: ", model.score(X_train, y_train))
print("test loss: ", model.score(X_test, y_test))
参考
https://blog.csdn.net/qq_42192693/article/details/121164645
https://blog.csdn.net/weixin_55703970/article/details/127308800
https://blog.csdn.net/u010366748/article/details/113066051