机器学习(三):SVM支持向量机

本文深入探讨了支持向量机(SVM)的原理及其在分类和回归任务中的应用。介绍了SVM作为强大分类器的优势,包括泛化错误率低和计算开销小的特点。通过示例展示了SVM在分类任务上的高效表现,同时也指出了其在回归任务上可能存在的局限性。

支持向量机介绍

支持向量机(Support Vectoc Machine,SVM)是一种强大的用于分类和回归的模型,十大数据挖掘算法之一。SVM是很好的现成分类器,即可以不加修改直接使用,应用SVM分类器会有很好的容错率。SVM甚至被称为是监督学习中最好的定式算法,所以SVM被广泛地应用于统计分类以及回归分析中。

支持向量机原理

如下图所示,二维平面上有黑白的一些点,它们被一条实现分开,使得左右两个种类的点互为分离,而这是二维平面,如果这些点是存在三维空间,需要分开这些点就需要一个平面,以此类推,n维的分割就需要n-1的“面”来分割,而这个“面”我们称之为超平面,这个超平面就是SVM分类器,找到这个面的过程就是SVM的计算过程。

在这里插入图片描述
在图中,如果直线是实线上面的虚线,也就是离黑色点更近,这样子会使得程序容易将本属于黑色的点分类到白色点的区域,反之亦然,所以要找到可以离点最远的“面”,这里需要提及,所谓支持向量(support vector)是指离分割超平面最近的那些点,如图中红色点,所以要SVM的本质就是要最大化支持向量到分隔平面的最大距离。

然而实际的工作更多时候数据分散,不想图中点分布一样,可以直接找到一个分隔界限。很多时候是非线性SVM,这时候无论分类器多高级,只要是线性分类器就不可能处理得了数据,这时候我们就有了核函数(kernel),它可以将数据映射到更高维的空间中,使得在低维空间不可线性分类的数据在高维空间中线性可分,常见的核函数有线性核、多项式核、高斯核、拉普拉斯核、sigmoid 核,或者是这些核函数的组合。这些函数的映射方式不同,但是目的是一样的,就是将低维数据映射到高维空间。

在SVM的推到中,会有大量的数学公式,但是如果不是搞学术研究的是不需要去深究的,虽然能理解更好,但是花费大量时间去理解最后实际运用也是很少,有点得不偿失,所以最好的是懂得怎么运用

SVM做分类

SVM分类示例
from sklearn.datasets import load_iris   # 鸢尾花数据集
from sklearn.model_selection import cross_val_score,train_test_split
from sklearn.svm import SVC   # 分类SVM
from sklearn.preprocessing import StandardScaler
import warnings
warnings.filterwarnings('ignore')
model = SVC()  # 默认参数为’rbf‘,即高斯核函数
ss = StandardScaler()
data = load_iris()
x = data.data
y = data.target
hhh = cross_val_score(model,x,y,cv=10)  # 10折交叉验证
print(hhh)

# output:
[1.         0.93333333 1.         1.         1.         0.93333333
 0.93333333 1.         1.         1.        ]

实测使用SVM可以实现较高的分类准确率,而且实测将特征做标准化处理后准确率并没有上升,像鸢尾花数据集这么少特征值的也不必做PCA降维,降维后准确率模型鲁棒性反倒变差了,所以简单的分类直接使用SVM就好。

SVM做回归

SVM回归示例
from sklearn.svm import SVR
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error,mean_absolute_error
import warnings
warnings.filterwarnings('ignore')
X_train = np.array([[158,1],[170,1],[183,1],[191,1],[155,0],[163,0],[180,0],[158,0],[170,0]])
y_train = [64,86,84,80,49,59,67,54,67]
X_test = np.array([[168,1],[180,1],[160,0],[169,0]])
y_test = [65,96,52,67]
ss = StandardScaler()
X_train_scaled = ss.fit_transform(X_train)
X_test_scaled = ss.transform(X_test)
model = SVR()
model.fit(X_train_scaled,y_train)
predict_y = model.predict(X_test_scaled)
print('预测的数据:',predict_y)
print('MAE为',mean_absolute_error(y_test,predict_y))  # 平均绝对误差
print('MSE为',mean_squared_error(y_test,predict_y))  # 均方误差


# output
预测的数据: [67.39767144 68.81362858 64.48401933 65.76472211]
MAE为 10.825835019182051
MSE为 225.55606733253782

实测看见SVM做回归效果不是很理想,相同情况下甚至不比KNN算法好,所以SVM还是适合分类吧。

SVM优缺点

SVM优点
  • 泛化错误率低,结果易解释
  • 计算开销小
SVM缺点
  • 对核函数选择敏感
  • 不适用于大数据集
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2020重新做人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值