【机器学习实战】 支持向量机

线性SVM分类

SVM分类器在类之间拟合可能的最宽街道
软间隔分类,超参数C越小,越容易欠拟合,间隔违例情况越多, 但泛化效果可能更好;C越大, 越容易过拟合, 间隔违例情况越少, 泛化效果更差。

# detect virginica iris
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)]                   # petal length, petal width
y = (iris["target"] == 2).astype(np.float64)  # Iris virginica

svm_clf = Pipeline([
    ("scaler", StandardScaler()),
    ("linear_svc", LinearSVC(C=1, loss="hinge")),
])
svm_clf.fit(X, y)

svm_clf.predict([[5.5, 1.7]])
# array([1.])

可以将SVC类与线性内核一起使用, 而不使用LinearSVC类。 创建SVC模型时, 编写 SVC(kernel=“linear”, C=1)。 或者可以将SGDClassifier类与SGDClassifier(loss=“hinge”, alpha=1/(m*C))一起使用。 这将使用常规的随机梯度下降训练SVM分类器, 收敛速度不如LinearSVC类, 但对处理在线分类任务或不适合内存的庞大数据集很有用。

 

非线性SVM分类

# Satellite datasets
from sklearn.datasets import make_moons
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures

X, y = make_moons(n_samples=100, noise=0.15)
polynomial_svm_clf = Pipeline([
    ("poly_features", PolynomialFeatures(degree=3)),
    ("scaler", StandardScaler()),
    ("svm_clf", LinearSVC(C=10, loss="hinge"))
])

polynomial_svm_clf.fit(X, y)

 

多项式内核

from sklearn.svm import SVC

poly_kernel_svm_clf = Pipeline([
    ("scaler", StandardScaler()),
    ("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5)),
])  
poly_kernel_svm_clf.fit(X, y)

coef0控制模型受高阶多项式还是低阶多项式的影响程度。
寻找正确超参数值的常用方法是网格搜索。

相似特征
解决非线性问题的另一种技术是添加相似特征, 这些特征经过相似函数计算得出, 相似函数可以测量每个实例与一个特定地标之间的相似度。

高斯RBF内核
用SVC类试试高斯RBF(径向基函数)核:

rbf_kernel_svm_clf = Pipeline([
    ("scaler", StandardScaler()),
    ("svm_clf", SVC(kernel="rbf", gamma=5, C=0.001))
])
rbf_kernel_svm_clf.fit(X, y)

超参数gamma增加,会使钟型曲线变窄, 每个实例影响范围随之减小:决策边界变得更不规则, 开始围着单个实例绕转; 反之, 减小gamma值使钟形曲线更宽,每个实例影响范围更大,决策边界更平坦。
所以gamma就如一个正则化的超参数:过拟合,就降低它的值, 欠拟合, 就提升它的值。

 

SVM回归

SVM回归尽可能使可能多的实例位于街道上, 同时限制间隔违例。 街道宽度用超参数epsilon控制。

from sklearn.svm import LinearSVR

svm_reg = LinearSVR(epsilon=1.5)
svm_reg.fit(X, y)

解决非线性回归任务, 可以采用核化的SVM模型

from sklearn.svm import SVR

svm_poly_reg = SVR(kernel="poly", degree=2, C=100, epsilon=0.1)
svm_poly_reg.fit(X,y.ravel())

 

上一篇:机器学习应用开发的典型步骤


下一篇:scikit基础与机器学习入门(3)机器学习任务的一般流程——以鸢尾花分类为例