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类, 但对处理在线分类任务或不适合内存的庞大数据集很有用。
# 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回归尽可能使可能多的实例位于街道上, 同时限制间隔违例。 街道宽度用超参数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())