支持向量机(SVM)作为一种强大的监督学习算法,广泛应用于分类和回归分析中。其核心思想是通过找到一个超平面,将不同类别的样本分开,同时最大化边界距离(即间隔)。SVM的性能在很大程度上取决于核函数的选择和参数的调优。本文将详细探讨这两个核心优化点。
核函数是SVM将输入数据映射到高维空间的关键,不同的核函数决定了数据的表示方式和模型的复杂度。常见的核函数包括:
选择核函数时,应考虑以下几点:
SVM的参数调优是另一个影响模型性能的重要因素。对于RBF核,主要参数包括惩罚参数C和核参数γ(或σ²)。以下是一些常用的调优方法:
网格搜索通过遍历参数空间中的一系列候选值,找出最优参数组合。这种方法简单直接,但计算量大。
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
# 定义参数网格
param_grid = {'C': [0.1, 1, 10, 100], 'gamma': [1, 0.1, 0.01, 0.001]}
# 创建SVM模型
svc = SVC()
# 网格搜索
grid_search = GridSearchCV(svc, param_grid, refit=True, verbose=2)
grid_search.fit(X_train, y_train)
# 输出最优参数
print("Best parameters found: ", grid_search.best_params_)
随机搜索在参数空间中随机选择一系列候选值,相比网格搜索更加高效,尤其当参数空间很大时。
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import expon
# 定义参数分布
param_dist = {'C': expon(scale=100), 'gamma': expon(scale=0.1)}
# 创建SVM模型
svc = SVC()
# 随机搜索
random_search = RandomizedSearchCV(svc, param_distributions=param_dist, n_iter=100, refit=True, verbose=2)
random_search.fit(X_train, y_train)
# 输出最优参数
print("Best parameters found: ", random_search.best_params_)
贝叶斯优化利用概率模型来迭代地选择最有希望的参数值,通常比网格搜索和随机搜索更高效。
from bayes_opt import BayesianOptimization
# 定义目标函数
def svm_optimization(C, gamma):
svc = SVC(C=C, gamma=gamma)
svc.fit(X_train, y_train)
return 1 - svc.score(X_val, y_val) # 返回错误率
# 定义参数范围
pbounds = {'C': (0.1, 100), 'gamma': (0.001, 1)}
# 贝叶斯优化
optimizer = BayesianOptimization(svm_optimization, pbounds, random_state=1)
optimizer.maximize(init_points=10, n_iter=20)
# 输出最优参数
print("Best parameters found: ", optimizer.max['params'])
支持向量机的核函数选择和参数调优是提升其性能的关键。选择合适的核函数可以使模型更好地适应数据的特性,而精细的参数调优则能进一步提升模型的精度和泛化能力。通过综合运用网格搜索、随机搜索和贝叶斯优化等策略,可以有效地找到最优的SVM参数组合。