SVM支持向量机进行分类与回归操作:
【机器学习】使用scikitLearn进行SVM支持向量机非线性分类
【机器学习】使用scikitLearn进行SVM支持向量机进行回归
一、基本概念介绍
支持向量机SVM特别适用于中小型复杂数据集的分类。
SVM作为一种大间隔分类方法,使用超平面对数据集进行分类,并保证超平面尽可能远离最近的分类实例。
如上图所示,经SVM分类后,超平面距离最近的数据实例尽可能远,这些数据实例被称为支持向量,数据集的分类结果,仅与支持向量有关,与虚线外的其它值无关。
同时,算法对于特征的缩放是敏感的,进行SVM运算前,应先对特征进行归一化处理。
二、软硬间隔区分:
当任何实例,都不出现在上图两虚线之中,这种分类,成为硬间隔分类,硬间隔分类对个别的异常支持向量值敏感。
为提升分类算法对异常值的适应能力。引入软间隔分类,使两虚线距离尽可能宽的同时,允许部分实例被错分,或出现在两虚线之中。
这种情况下,scikitlearn提供了重要参数k:
’
当C值很大时,间隔比较窄,C值很小时,间隔比较宽,泛化能力更好,相当于进行了正则化处理,体现了方差与偏差的权衡。
总体而言,C值越小,允许的错分数越多,泛化能力越强。C越大算法越硬。
C其实代表了对分类错误的惩罚程度,程度越大,分类容错性越低。
相关代码如下:
import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
iris = datasets.load_iris()
X = iris["data"][:, (2, 3)]
y = (iris["target"] == 2).astype(np.float64)
svm_clf = Pipeline([
("scaler", StandardScaler()),
#使用了铰链损失函数
("linear_svc", LinearSVC(C=1, loss="hinge", random_state=42)),
])
svm_clf.fit(X, y)
硬间隔的代码为,即C为无穷大:
from sklearn.svm import SVC
from sklearn import datasets
iris = datasets.load_iris()
X = iris["data"][:, (2, 3)]
y = iris["target"]
setosa_or_versicolor = (y == 0) | (y == 1)
X = X[setosa_or_versicolor]
y = y[setosa_or_versicolor]
# 这是SVM线性模型的另外一种表达:
svm_clf = SVC(kernel="linear", C=float("inf"))
svm_clf.fit(X, y)
当训练时有内存限制时或者在线训练时,可以考虑使用随机梯度下降,当损失函数选用铰链函数时,就等价于SVM。
SGDClassifier(loss="hinge",alpha=1/(m*C))
其中alpha是正则化参数,其值越大,正则化的效果越强。对应C值越小。
附:关于铰链损失函数hinge
铰链损失函数(hinge loss)的思想就是让那些未能正确分类的和正确分类的之间的距离要足够的远,如果相差达到一个阈值时,此时这个未正确分类的误差就可以认为是0,否则就要累积计算误差。
下图中假设真实值为正例,决策函数大于0预测为正例,小于0预测为负例。
图中黑色线为0,1损失,预测错时,损失为1,正确时没有损失。
铰链损失函数比0,1损失函数更细节化,决策函数大于0,在0至1之间时,虽然预测正确,也有损失,越接近1,损失越小,超过1时,损失为0;保证了正确值与错误值间的最大间隔,常用于SVM。
支持向量机分类器能够输出测试实例与决策边界之间的距离。如果创建SVM时,在Scikit-Learn中设置probability=True,那么训练完成后,算法将使用逻辑回归对训练数据额外进行5-折交叉验证的训练,从而得到概率值。这会给SVM添加predict_proba()和predict_log_proba()两种方法。