一、支持向量机(SVM)
简介
定义:支持向量机是一种二类分类器。假如我们有两个类别的数据,而这两个类别恰好能被一条线分开,线上所有点为一类,线下所有的点属于另一类。SVM要做的就是找到这条线,用它来做预测,跟线性回归原理很像。只是SVM要找出最佳的分割线。
最佳分隔线:最优化问题,让各点到分割线之间的距离最大化。
多类别分类问题:创建多个SVM分类器。为每个类别创建一对多分类器,把训练数据分为两个类别——属于特定类别的数据和其他所有类别数据。对新数据进行 分类时,从这些类别中找出最匹配的。
参数
C参数:与分类器正确分类比例相关 。C值越高,间隔越小,表示要尽可能把所有数据正确分类;C值越小,间隔越大——有些数据将无法正确分类。
kernel参数:指定内核函数。
SVM(基础形式)局限性之一就是只能用来对线性可分的数据进行分类。如果线性不可分 呢?SVM中使用核技巧(kernel trick)来解决非线性问题。核技巧及构造核函数。
非线性问题:如果数据线性不可分,就需要将其置入更高维的空间中,加入更多伪特征直到数据线性可分 。
常见的核函数:线性核(两个个体的特征向量的点积、带权重的 特征和偏置项 )、多项式核(提高点积的阶数(比如2) )、高斯核(rbf)、拉普拉斯核、Sigmoid核。这些内核能够有效地确定两类数据之间的距离,SVM可以据此对新数据进行分类。
二、基于SVM对MNIST数据集进行分类
加载minist数据集
import numpy as np
X = np.load('./data/dataset.npy')
y = np.load('./data/class.npy')
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, y, random_state=14)
使用SVM训练
SVM有很多类型的Estimators: svm.SVR、svm.SVC、svm.OneClassSVM、svm.NuSVR等。
from sklearn import svm
predictor = svm.SVC(gamma='scale', C=1.0, decision_function_shape='ovr', kernel='rbf')
predictor.fit(x_train, y_train)
预测并使用f1评估
# 预测结果
result = predictor.predict(x_test)
# 进