上一篇文章,我们介绍了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://edu.ichenhua.cn/read/286
- 下一篇:
- 机器学习混淆矩阵及模型评估指标