机器学习sklearn----支持向量机SVC重要参数核函数kernel如何选择

Posted iostreamzl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习sklearn----支持向量机SVC重要参数核函数kernel如何选择相关的知识,希望对你有一定的参考价值。

前言

前面的SVC求解可视化一文中已经知道了SVC对于线性和非线性的数据有不同的核函数,线性只有一个,而非线性有三个,实际生活中我们遇到的数据大多数是非线性的,那么这些核函数具体应该怎么选择呢?

SVM的核函数:

  • linear:线性核函数,只能解决线性问题
  • ploy:多项式核函数,解决非线性问题和线性问题,但是偏线性
  • sigmoid:双曲正切核函数,解决线性和非线性问题
  • rbf:高斯径向基核函数,解决线性和非线性问题,偏非线性

核函数可以理解为将低维数据变换到高维数据,方便找到决策边界的这样一个数学过程
核函数的数学原理很复杂,这里不探究了,主要关注核函数在不同数据集上的选择

本文中使用到的第三方库

from sklearn.svm import SVC
from sklearn.datasets import make_blobs, make_moons, make_circles, make_classification
from sklearn.model_selection import cross_val_score # 交叉验证
import numpy as np
import matplotlib.pyplot as plt
import warnings

%matplotlib inline
warnings.filterwarnings("ignore")

不同核函数对比分析

创建原始数据

# 创建数据集
n_samples = 200
n_features = 2
datas = [
    make_blobs(n_samples=n_samples, n_features=n_features, centers=2, cluster_std=8, random_state=1),
    make_moons(n_samples=n_samples, noise=0.2, random_state=1),
    make_circles(n_samples=n_samples, factor=0.6, noise=0.2, random_state=1),
    make_classification(n_samples=n_samples, n_features=n_features, n_informative=2, n_redundant=0, random_state=2)
]
# datas的格式如下:[(X, y), (X, y)]

# 展示原始数据集
fig, axes = plt.subplots(1, 4)
fig.set_size_inches(20, 6)

for i in range(len(datas)) :
    X, y = datas[i]
    ax = axes[i]
    ax.set_xticks([])
    ax.set_yticks([])
    ax.scatter(X[:, 0], X[:, 1], c=y)

plt.tight_layout() # 让图片显示更加的紧密
plt.show()

不同核函数表现可视化

# 画出不同的核函数在不同分布的数据上的表现以及决策边界
# 需要一张5X4的画布,第一列是原始数据,后面依次是每个核函数在数据集上的表现
# 在图的最上方显示核函数类型,在每张图上显示对应核函数的得分
kernels = ['linear', 'poly', 'sigmoid', 'rbf']

fig, charts = plt.subplots(4, 5) # charts.shape=(4, 5)
fig.set_size_inches(20, 16)

for row, line_plots in enumerate(charts) :
    # row: 每一个子图的行号
    # line_plots: 每一行对应的子图
    
    # 获得特征标签数据集
    X, y = datas[row]
    row_data_ax = charts[row][0]
    row_data_ax.scatter(X[:, 0], X[:, 1], c=y)
    
    # 不显示坐标轴数字
    row_data_ax.set_xticks([])
    row_data_ax.set_yticks([])
    
    if row == 0 :
        row_data_ax.set_title("row data")
    
    for col, ax in enumerate(line_plots[1:]) :
        # col:每一行每个子图对应的列索引
        # ax:每一行中的每个子图对象
        
        # 获得核函数
        kernel = kernels[col]
        
        # 在第一行显示核函数的名称
        if row == 0 :
            ax.set_title(kernel)
        
        # 不显示坐标轴数字
        ax.set_xticks([])
        ax.set_yticks([])
        
        # 实例化模型
        svc = SVC(kernel=kernel).fit(X, y)
        
        # 交叉验证取均值作为模型得分
        score = round(cross_val_score(svc, X, y, cv=5).mean(), 2)
        
        # 画决策边界
        xmin, xmax = X[:, 0].min() - 1, X[:, 0].max() + 1
        ymin, ymax = X[:, 1].min() - 1, X[:, 1].max() + 1
        
        # 取出大量的网格坐标点,作为特征矩阵
        xloc, yloc = np.meshgrid(np.linspace(xmin, xmax, 100),
                   np.linspace(ymin, ymax, 100))
        coo = np.vstack((xloc.ravel(), yloc.ravel())).T
                        
        # 计算每个特征点到决策边界的距离,作为等高线的高度
        dis = svc.decision_function(coo).reshape(xloc.shape)
        
        # 将等高线途中决策边界两边填充为不同的颜色
        ax.pcolormesh(xloc, yloc, dis>0, cmap=plt.cm.Paired)
        
        # 画等高线
        ax.contour(xloc, yloc, dis, levels=[-1, 0, 1])
        
        # 在图上显示模型得分, 相对于坐标轴在右下方显示,需要参数transform来定位
        ax.text(0.9, 0.1, str(score), horizontalalignment='right', size=40,
               transform=ax.transAxes)
        
        # 画原始数据散点图
        ax.scatter(X[:, 0], X[:, 1], c=y)

plt.tight_layout()        
plt.show()

总结

从上面的结果来看,rbf在几个不同分类的数据集上的表现都比较好,索引日常使用中我们可以优先考虑rbf,然后再使用其他的核函数。一般来说rbf表现不佳,其他的核函数对结果的提升效果也不会很高了

以上是关于机器学习sklearn----支持向量机SVC重要参数核函数kernel如何选择的主要内容,如果未能解决你的问题,请参考以下文章

机器学习sklearn----支持向量机SVC重要参数核函数kernel如何选择

机器学习sklearn----支持向量机SVC模型评估指标

机器学习sklearn----支持向量机SVC模型评估指标

机器学习sklearn----支持向量机SVC模型评估指标

机器学习sklearn----支持向量机SVC模型评估指标

机器学习sklearn----支持向量机分类器SVC求解过程可视化