RBF核支持向量机的参数

RBF核支持向量机的参数

import numpy as np

import matplotlib.pyplot as plt

from matplotlib.colors import Normalize

from sklearn.svm import SVC

from sklearn.preprocessing import StandardScaler

from sklearn.datasets import load_iris

from sklearn.model_selection import StratifiedShuffleSplit

from sklearn.model_selection import GridSearchCV

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.rcParams['axes.unicode_minus'] = False

# 一个很实用的函数,可将颜色图的中点移动到感兴趣的值附近。

class MidpointNormalize(Normalize):

    def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):

        self.midpoint = midpoint

        Normalize.__init__(self, vmin, vmax, clip)

    def __call__(self, value, clip=None):

        x, y = [self.vmin, self.midpoint, self.vmax], [0, 0.5, 1]

        return np.ma.masked_array(np.interp(value, x, y))

# 导入并准备数据集

#

# 为网格搜索准备数据集

iris = load_iris()

X = iris.data

y = iris.target

# 用于决策功能可视化的数据集:我们仅将前两个特征保留在X中,并对数据集进行子采样,以仅保留2个类,并使其成为二分类问题。

X_2d = X[:, :2]

X_2d = X_2d[y > 0]

y_2d = y[y > 0]

y_2d -= 1

# 缩放数据以进行SVM训练通常是一个好主意。在此示例中,我们在缩放数据时有点"作弊",我们缩放了全部数据,而不是将转换器在训练集上拟合,然后缩放到测试集上。

scaler = StandardScaler()

X = scaler.fit_transform(X)

X_2d = scaler.fit_transform(X_2d)

# 训练分类器

#

# 对于初始搜索,以10为底的对数网格通常会很有帮助。使用2为基数,可以实现更精细的调整,但就算成本要高得多。

C_range = np.logspace(-2, 10, 13)

gamma_range = np.logspace(-9, 3, 13)

param_grid = dict(gamma=gamma_range, C=C_range)

cv = StratifiedShuffleSplit(n_splits=5, test_size=0.2, random_state=42)

grid = GridSearchCV(SVC(), param_grid=param_grid, cv=cv)

grid.fit(X, y)

print("The best parameters are %s with a score of %0.2f"

      % (grid.best_params_, grid.best_score_))

# 现在,我们需要为二维数据下的所有参数拟合一个分类器(我们在这里使用一小部分参数,因为训练需要一些时间)

C_2d_range = [1e-2, 1, 1e2]

gamma_2d_range = [1e-1, 1, 1e1]

classifiers = []

for C in C_2d_range:

    for gamma in gamma_2d_range:

        clf = SVC(C=C, gamma=gamma)

        clf.fit(X_2d, y_2d)

        classifiers.append((C, gamma, clf))

# 可视化

# 绘制参数效果

plt.figure(figsize=(8, 6))

xx, yy = np.meshgrid(np.linspace(-3, 3, 200), np.linspace(-3, 3, 200))

for (k, (C, gamma, clf)) in enumerate(classifiers):

    # 在网格中评估决策函数的值

    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])

    Z = Z.reshape(xx.shape)

    # 为这些参数可视化决策函数的值

    plt.subplot(len(C_2d_range), len(gamma_2d_range), k + 1)

    plt.title("gamma=10^%d, C=10^%d" % (np.log10(gamma), np.log10(C)),

              size='medium')

    # 可视化决策函数上的参数效果

    plt.pcolormesh(xx, yy, -Z, cmap=plt.cm.RdBu)

    plt.scatter(X_2d[:, 0], X_2d[:, 1], c=y_2d, cmap=plt.cm.RdBu_r,

                edgecolors='k')

    plt.xticks(())

    plt.yticks(())

    plt.axis('tight')

scores = grid.cv_results_['mean_test_score'].reshape(len(C_range),

                                                    len(gamma_range))

# 绘制验证准确率与gamma和C的函数关系的热力图

#

# 分数在热色图被编码为颜色,从深红色到亮黄色不等。由于最有趣的分数都位于0.92至0.97范围内,因此我们使用自定义规范化器将颜色条中点设置为0.92,以便更轻松地可视化有趣范围内分数值的微小变化,而不会残酷地将所有低分值变为相同的颜色。

plt.figure(figsize=(8, 6))

plt.subplots_adjust(left=.2, right=0.95, bottom=0.15, top=0.95)

plt.imshow(scores, interpolation='nearest', cmap=plt.cm.hot,

          norm=MidpointNormalize(vmin=0.2, midpoint=0.92))

plt.xlabel('gamma')

plt.ylabel('C')

plt.colorbar()

plt.xticks(np.arange(len(gamma_range)), gamma_range, rotation=45)

plt.yticks(np.arange(len(C_range)), C_range)

plt.title('验证准确性')

plt.show()


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容