支撑向量机 SVM
分类算法中,一般用一条边界来决策分类。这条就是决策边界。但是决策边界在很多时候都可以是多条 。那一条比较合适呢?数学理论的基础下,当只有分类边界离最近的分类点最远的时候,这条边界是最优秀的。 如图,有三条边界,中间的一条是离两个分类结果最远的,也就是最合适的。而上边和下边这两条我们称为支撑向量。当margin值最大时,中间的决策边界泛化能力就最强,也就是最合适。
推出公式
d最大,也就是margin最大
Soft Margin SVM
当边界不明确时,或者分类元素有异常时,决策边界就很难定义,上面用的方法可能会定义出泛化能力非常差的决策边界。所以我们要在边界中加入一定的容错率,这个容错率就是Soft Margin SVM
可以给容错加上比例
Scikit-learn 线性SVM
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
X = X[y<2,:2]
y = y[y<2]
#使用标准化同一量纲
from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler()
standardScaler.fit(X)
X_standard = standardScaler.transform(X)
#使用线性SVM算法
from sklearn.svm import LinearSVC
#超参数C,容错比例
svc = LinearSVC(C=1e9)
svc.fit(X_standard, y)
svc.coef_
svc.intercept_
Scikit-learn 多项式
from sklearn.svm import SVC
def PolynomialKernelSVC(degree, C=1.0):
return Pipeline([
("std_scaler", StandardScaler()),
("kernelSVC", SVC(kernel="poly", degree=degree, C=C))#使用kernel="poly"核函数
])
poly_kernel_svc = PolynomialKernelSVC(degree=3)
poly_kernel_svc.fit(X, y)
Scikit-learn 高斯核函数
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
def RBFKernelSVC(gamma):
return Pipeline([
("std_scaler", StandardScaler()),
("svc", SVC(kernel="rbf", gamma=gamma))#rbf 高斯核函数,gamma值越大越容易过拟合
])
svc = RBFKernelSVC(gamma=1)
svc.fit(X, y)
Scikit-learn SVM解决回归问题
类似分类问题,但是,支撑向量机包含越多元素越好,然后取向量机中间的边界。epsilon是向量机和边界的距离
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
boston = datasets.load_boston()
X = boston.data
y = boston.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
from sklearn.svm import LinearSVR
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
def StandardLinearSVR(epsilon=0.1):
return Pipeline([
('std_scaler', StandardScaler()),
('linearSVR', LinearSVR(epsilon=epsilon))#
])
svr = StandardLinearSVR()
svr.fit(X_train, y_train)
svr.score(X_test, y_test)