支持向量机(SVM)是一种监督学习算法,可用于分类和回归问题。支持向量机是最常用也是大家最熟悉的算法,你可能不懂其算法原理,但你绝对听说过这种算法。今天算法研习第三节就来说说关于向量机的基本思想,具体有以下五个问题。
1、什么是SVM?
2、超平面和支持向量
3、SVM内核
4、特征选择
5、Python调用SVM
什么是SVM
支持向量机(SVM)是一种机器学习算法,可用于许多不同的任务。
SVM的主要目标是找到最佳超平面,以便在不同类的数据点之间进行正确分类。超平面维度等于输入特征的数量减去1(例如,当使用三个特征时,超平面将是二维平面)。
为了分离两类数据点,可以选择许多可能的超平面。我们的目标是找到一个具有最大边距的平面,即两个类的数据点之间的最大距离。最大化边距的目的是最大概率的对未知的数据点进行正确分类。
超平面和支持向量
超平面是决策边界,有助于对数据点进行分类。落在超平面两侧的数据点可归因于不同的类。此外,超平面的尺寸取决于特征的数量。如果输入要素的数量是2,则超平面只是一条线。如果输入要素的数量是3,则超平面变为二维平面。当特征数量超过3时,就超出我们的想象了。
最接近超平面的数据点称为支持向量。支持向量确定超平面的方向和位置,以便最大化分类器边界(以及分类分数)。SVM算法应该使用的支持向量的数量可以根据应用任意选择。
SVM内核
如果我们使用的数据不是线性可分的(因此导致线性SVM分类结果不佳),则可以应用称为Kernel Trick的技术。此方法能够将非线性可分离数据映射到更高维空间,使我们的数据可线性分离。使用这个新的维度空间SVM可以很容易地实现。
SVM中有许多不同类型的内核可用于创建这种更高维度的空间,例如线性,多项式,Sigmoid和径向基函数(RBF)。在Scikit-Learn中,可以通过添加内核参数来指定内核函数svm.SVC,也可以通过gamma参数来指定内核对模型的影响。如果特征数量大于数据集中的样本数量,则建议使用线性内核(否则RBF可能是更好的选择)。
特征选择
在SVM中,我们可以使用.coef_训练模型访问分类器系数 。这些权重表示与超平面正交的正交矢量坐标。他们的方向代表预测的阶级。于是通过将这些系数的大小相互比较来确定特征重要性。因此通过查看SVM系数,可以识别分类中使用的主要特征,并消除不重要的特征(保持较小的方差)。
减少机器学习中的功能数量起着非常重要的作用,尤其是在处理大型数据集时。实际上,这可以:加速训练,避免过度拟合,并最终通过降低数据噪音来获得更好的分类结果。例如下图中显示了在Pima Indians糖尿病数据库中使用SVM识别的主要特征。在绿色中显示对应于负系数的所有特征,而蓝色显示为正系数。
Python调用SVM
使用Scikit-Learn Python库在几行代码中轻松实现基本SVM分类。
代码语言:javascript复制from sklearn import svm
trainedsvm = svm.SVC().fit(X_Train,Y_Train)
predictionsvm = trainedsvm.predict(X_Test)
print(confusion_matrix(Y_Test,predictionsvm))
print(classification_report(Y_Test,predictionsvm))
SVM算法在进行分类时可选择硬边距或软边距:
- 硬边距:旨在找到最好的超平面而不会容忍任何形式的错误分类。
- 软边距:我们在SVM中添加了一定程度的容差。通过这种方式,我们允许模型对一些数据点进行错误分类,从而增加模型的泛化性能。
软边距SVM可以通过在Scikit-Learn中的svm.SVC中添加C惩罚系数实现。C越大表示算法在进行错误分类时得到的惩罚越多。