sklearn中随机测试数据:sklearn包中SVM算法库的使

2019-02-14  本文已影响33人  UnderStorm

目录

    1. SVM相关知识点回顾
      1.1. SVM与SVR
      1.2. 核函数
    1. sklearn中SVM相关库的简介
    • 2.1. 分类库与回归库
    • 2.2. 高斯核调参
      • 2.2.1. 需要调节的参数
      • 2.2.2. 调参方法:网格搜索
    1. 编程实现

这是《西瓜书带学训练营·实战任务》系列的第三篇笔记

1. SVM相关知识点回顾

1.1. SVM与SVR

1.2. 核函数

在scikit-learn中,内置的核函数一共有4种:

一般情况下,对非线性数据使用默认的高斯核函数会有比较好的效果,如果你不是SVM调参高手的话,建议使用高斯核来做数据分析。

2. sklearn中SVM相关库的简介

scikit-learn SVM算法库封装了libsvm 和 liblinear 的实现,仅仅重写了算法了接口部分

2.1. 分类库与回归库

2.2. 高斯核调参

2.2.1. 需要调节的参数

2.2.2. 调参方法:网格搜索

对于SVM的RBF核,我们主要的调参方法都是交叉验证。具体在scikit-learn中,主要是使用网格搜索,即GridSearchCV类

from sklearn.model_selection import GridSearchCV
grid = GridSearchCV(SVC(), param_grid={"C":[0.1, 1, 10], "gamma": [1, 0.1, 0.01]}, cv=4)
grid.fit(X, y)

将GridSearchCV类用于SVM RBF调参时要注意的参数有:

  1. estimator:即我们的模型,此处我们就是带高斯核的SVC或者SVR

  2. param_grid:即我们要调参的参数列表。 比如我们用SVC分类模型的话,那么param_grid可以定义为{"C":[0.1, 1, 10], "gamma": [0.1, 0.2, 0.3]},这样我们就会有9种超参数的组合来进行网格搜索,选择一个拟合分数最好的超平面系数

  3. cv:S折交叉验证的折数,即将训练集分成多少份来进行交叉验证。默认是3。如果样本较多的话,可以适度增大cv的值

3. 编程实现

  1. 生成测试数据

    from sklearn.datasets import make_circles
    from sklearn.preprocessing import StandardScaler
    
    # 生成一些随机数据用于后续分类
    X, y = make_circles(noise=0.2, factor=0.5, random_state=1) # 生成时加入了一些噪声
    X = StandardScaler().fit_transform(X) # 把数据归一化
    
    

    生成的随机数据可视化结果如下:

  1. 调参

    接着采用网格搜索的策略进行RBF核函数参数搜索

    from sklearn.model_selection import GridSearchCV
    grid = GridSearchCV(SVC(), param_grid={"C":[0.1, 1, 10], "gamma": [1, 0.1, 0.01]}, cv=4) # 总共有9种参数组合的搜索空间
    grid.fit(X, y)
    print("The best parameters are %s with a score of %0.2f"
          % (grid.best_params_, grid.best_score_))
    
    输出为:
    The best parameters are {'C': 10, 'gamma': 0.1} with a score of 0.91
    

    可以对9种参数组合训练的结果进行可视化,观察分类的效果:

    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max,0.02),
                         np.arange(y_min, y_max, 0.02))
    
    for i, C in enumerate((0.1, 1, 10)):
        for j, gamma in enumerate((1, 0.1, 0.01)):
            plt.subplot()       
            clf = SVC(C=C, gamma=gamma)
            clf.fit(X,y)
            Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    
            # Put the result into a color plot
            Z = Z.reshape(xx.shape)
            plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.8)
    
            # Plot also the training points
            plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm)
    
            plt.xlim(xx.min(), xx.max())
            plt.ylim(yy.min(), yy.max())
            plt.xticks(())
            plt.yticks(())
            plt.xlabel(" gamma=" + str(gamma) + " C=" + str(C))
            plt.show()
    
1.000 0.100 0.001
0.1
1
10

参考资料:

(1) 刘建平Pinard《scikit-learn 支持向量机算法库使用小结》

(2) 刘建平Pinard《支持向量机高斯核调参小结》

(3) loveliuzz《机器学习sklearn19.0——SVM算法》

上一篇下一篇

猜你喜欢

热点阅读