支持向量机介绍
支持向量机(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缺点
- 对核函数选择敏感
- 不适用于大数据集