上一篇文章,我们介绍了SVM在不同数据集上的表现,本文以乳腺癌数据集为例,对比SVM不同核函数的效果,并通过调参,优化模型效果。

1、加载数据集

from sklearn.datasets import load_breast_cancer

cancer = load_breast_cancer()
x = cancer.data
y = cancer.target

2、PCA降维可视化数据

from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# x_dr = PCA(2).fit_transform(x)
# plt.scatter(x_dr[:,0], x_dr[:,1], c=y)
# plt.show()

3、直接用svm分类

测试发现,准确率顺序:linear > rbf > poly > sigmoid

from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

kernel = ['linear', 'poly', 'rbf', 'sigmoid']

x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0)

for k in kernel:
    clf = SVC(kernel=k, random_state=0).fit(x_train, y_train)
    print(k, clf.score(x_test, y_test))
    # linear 0.958041958041958
    # poly 0.9230769230769231
    # rbf 0.9370629370629371
    # sigmoid 0.45454545454545453

4、标准化

虽然线性核函数的准确率已经达到95%以上,但我们分析原数据会发现,数据的范围比较大,所以可以尝试先标准化,看是否能进一步提高模型准确率。

from sklearn.preprocessing import StandardScaler

x_std = StandardScaler().fit_transform(x)

kernel = ['linear', 'poly', 'rbf', 'sigmoid']

x_train, x_test, y_train, y_test = train_test_split(x_std, y, random_state=0)

for k in kernel:
    clf = SVC(kernel=k, random_state=0).fit(x_train, y_train)
    print(k, clf.score(x_test, y_test))
    # linear 0.972027972027972
    # poly 0.916083916083916
    # rbf 0.965034965034965
    # sigmoid 0.951048951048951

5、调参

经过上一步的数据标准化,模型在不同核函数下,准确率都有一定提升,但核函数还有一些超参数可以调整,以下我们以rbf为例,尝试调整其gamma参数,观察其准确率是否能进一步提升。

import numpy as np

gammas = np.linspace(0.0001, 0.25, 50)
scores = []
for g in gammas:
    clf = SVC(kernel='rbf', gamma=g, random_state=0).fit(x_train, y_train)
    score = clf.score(x_test, y_test)
    scores.append(score)

print('max score:', max(scores), 'gamma:', gammas[np.argmax(scores)])
# max score: 0.972027972027972 gamma: 0.051100000000000007

plt.plot(gammas, scores)
plt.show()

实验发现,在不调整参数的情况下,线性核就可以有很好的分类效果,rbf在调整参数后,也可以达到与其一样的准确率。

本文为 陈华 原创,欢迎转载,但请注明出处:http://ichenhua.cn/read/286