在机器学习领域,支持向量机(SVM)是一种常用的分类算法。SVM通过寻找一个最优的超平面来区分不同类别的数据点。在SVM中,径向基函数(RBF)核是一种常用的核函数,它能够处理非线性可分的数据。RBF核的两个关键参数是gamma和C,它们对模型的性能有着显著的影响。本文将详细探讨这两个参数的作用,并展示如何通过参数调优来优化SVM模型。
参数gamma定义了单个训练样本的影响范围。gamma值较低时,意味着影响范围较远,即支持向量的影响会扩散到更远的区域;而gamma值较高时,影响范围较近,即支持向量的影响主要集中在其周围。在实际应用中,gamma可以被视为支持向量影响半径的倒数。如果gamma设置得过大,支持向量的影响范围将仅限于其自身,这可能导致过拟合。相反,如果gamma设置得过小,模型将过于受限,无法捕捉数据的复杂性或“形状”,导致模型性能下降。
参数C用于平衡训练样本的正确分类与决策函数边界的最大化。C值较大时,模型更倾向于接受较小的边界,以确保所有训练点都能被正确分类。而C值较小时,模型会倾向于产生较大的边界,从而得到一个更简单的决策函数,但这可能会牺牲训练集的准确率。换句话说,C在SVM中充当了正则化参数的角色。
为了直观展示参数gamma和C对模型性能的影响,可以通过绘制决策函数的可视化图和交叉验证准确率的热力图来进行参数调优。在二维分类问题中,可以为不同的参数组合绘制决策边界。而在更复杂的问题中,可以通过热力图来展示不同参数组合下的交叉验证准确率。热力图使用颜色编码来表示准确率,颜色越“热”表示准确率越高。通过这种方式,可以快速识别出最佳的参数组合。
以下是一个使用Python和scikit-learn库实现的参数调优示例。首先,加载并准备数据集,然后使用网格搜索(GridSearchCV)来寻找最佳的gamma和C参数组合。最后,绘制决策函数的可视化图和交叉验证准确率的热力图。
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import GridSearchCV, StratifiedShuffleSplit
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
# 数据预处理
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 设置参数范围
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("最佳参数:%s,准确率:%0.2f" % (grid.best_params_, grid.best_score_))
# 绘制热力图
scores = grid.cv_results_["mean_test_score"].reshape(len(C_range), len(gamma_range))
plt.figure(figsize=(8, 6))
plt.imshow(scores, interpolation="nearest", cmap=plt.cm.hot)
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()