SVM实战注意点

  1. SVM可以执行线性非线性的分类、回归、异常值检测。适用于中小型复杂数据集
  2. SVM对特征缩放很敏感,可以在输入之前采用StandardScaler处理
  3. 如果SVM模型过拟合,可以通过降低C来进行正则化。
  4. LinearSVC灰度偏执正则化,需要减去平均值,StandardScaler会自动处理
  5. 处理非线性数据集的方法之一是添加更多的特征,比如多项式特征。
  6. 关于SVC(kernel = "linear")、LinearSVC、和SGDClassifier(loss="hinge",alph=1/(m*C))
    1. SVC(kernel = "linear")慢得多。基于libsvm库,该库支持核技巧,采用SMO(序列最小优化)。时间复杂度在(O(m^2*n)到O(m^3*n)之间)。完美适用于复杂但是中小型的数据集。可以良好的适应特征数量的增加,特别是稀松特征(每个实例仅有少量的非零特征。)
    2. SGDClassifier(loss="hinge",alph=1/(m*C))对于内存处理不了的大型数据集(核外训练)或是在线分类有效。不支持核技巧。
    3. LinearSVC基于liblinear库,该库为LinearSVC实现了以有优化算法,陈伟针对大型线性SVM的双坐标下降法。该库不支持核技巧,训练时间复杂度为O(m*n)
  7. 多项式核中,coef0控制的是模型受高阶多项式是还是低阶多项式影响的程度。
  8. 高斯rbf核函数中,gamma:增大会使得钟形曲线变窄,每个实例的影响范围变小,决策边界便的不规则,开始绕着单个实例绕弯。所以,gamma像一个正则化的超参数,模型过度拟合,就较小gamma,反之则增大。如下图示意SVM实战注意点_第1张图片
  9. 字符串函数常用于文档核DNA序列
  10. 关于核函数的选择
    1. 先从线性核函数开始。(LinearSVC快得多)
    2. 训练集不太大,尝试高斯核
    3. 考虑时间和计算能力,使用交叉验证和网格搜索。尝试那些专门针对你的数据集数据结构的核函数

代码实例:

  1. 算法使用:
  • LinearSVC
polynomial_svm_clf = Pipeline([
        ("poly_features",PolynomialFeatures(degree=3)),
        ("scaler",StandardScaler()),
        ("svm_clf",LinearSVC(C=10,loss="hinge"))
    ])
polynomial_svm_clf.fit(X,y)

加了多项式特征的线性核:

SVM实战注意点_第2张图片

  • 多项式核:
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下的分类效果如下:

SVM实战注意点_第3张图片

  • 高斯核
    rbf_svm_clf = Pipeline([
        ("scaler",StandardScaler()),
        ("svm_clf",SVC(kernel = "rbf",gamma=1,C=5))
    ])
    rbf_svm_clf.fit(X,y)

不同gamma 以及C下的分类效果如下:

SVM实战注意点_第4张图片

  • 画图函数。画出样本点,分类情况,决策平面等
import matplotlib.pyplot as plt
def plot_dataset(X,y,axes):
    plt.plot(X[:,0][y==0],X[:,1][y==0],'bs')
    plt.plot(X[:,0][y==1],X[:,1][y==1],'r^')
    plt.axis(axes)
    plt.grid(True,which = "both")
    plt.xlabel(r"$x_0$",fontsize = 20)
    plt.ylabel(r"$x_1$",fontsize = 20,rotation = 0)

plot_dataset(X,y,[-1.5,2.5,-1,1.5])
plt.show()

样本点:

SVM实战注意点_第5张图片

import numpy as np
def plot_prediction(clf,axes):
    x0s = np.linspace(axes[0],axes[1],100)
    x1s = np.linspace(axes[2],axes[3],100)
    x0,x1 = np.meshgrid(x0s,x1s)
    X = np.c_[x0.ravel(),x1.ravel()]
    y_pred = clf.predict(X).reshape(x0.shape)
    y_decision = clf.decision_function(X).reshape(x0.shape)
    plt.contourf(x0,x1,y_pred,cmap=plt.cm.brg,alpha=0.2)
    plt.contourf(x0,x1,y_decision,cmap=plt.cm.brg,alpha=0.1)

plot_prediction(polynomial_svm_clf,[-1.5,2.5,-1,1.5])
plot_dataset(X,y,[-1.5,2.5,-1,1.5])
plt.show()

分类结果和决策边界如下:

SVM实战注意点_第6张图片

 

你可能感兴趣的:(SVM实战注意点)