Scikit Learn中的RBF SVM参数

2023年 8月 16日 35.1k 0

Scikit Learn 是 Python 中流行的机器学习库,它通过径向基函数 (RBF) 内核提供了支持向量机 (SVM) 的强大实现。RBF 核是 SVM 的热门选择,因为它可以处理非线性决策边界,使其适用于广泛的分类任务。

在 Scikit Learn 中使用 RBF SVM 时,可以调整几个重要参数来优化模型的性能。最重要的参数是 C 和 gamma。C 参数控制实现低训练误差和低测试误差之间的权衡,C 值较高表示优先选择低训练误差而不是低测试误差。gamma 参数控制决策边界的形状,gamma 值较高会导致边界更加复杂和波动。

其他重要参数包括内核、度和 coef0。核参数决定了 SVM 使用的核函数类型,RBF 是默认选择。度参数在核设置为多项式时使用,它控制多项式函数的次数。coef0 参数在核设置为多项式或 sigmoid 时使用,它控制核函数中的独立项。

为了找到这些参数的最佳值,可以在一系列值上执行网格搜索或随机搜索。交叉验证还可用于评估不同参数值的模型性能。值得注意的是,选择正确的参数组合是使用 RBF 核构建准确且稳健的 SVM 模型的关键步骤。

与SVM相关的概念:

  • 支持向量机 (SVM):  SVM 是用于分类和回归任务的监督机器学习模型。它们由于能够处理高维数据和非线性可分离数据集而被广泛使用。
  • 径向基函数 (RBF) 核:  RBF 核是 SVM 中常用的核函数。它用于将输入数据变换到高维空间,以找到分隔数据点的超平面。
  • C 参数:  SVM 中的 C 参数是一个超参数,决定实现低训练误差和低测试误差之间的权衡。它控制训练数据集中可以容忍的错误分类水平。
  • Gamma 参数:  SVM 中的 gamma 参数是控制决策边界形状的超参数。它决定了模型的灵活性以及训练数据的过拟合或欠拟合程度。
  • 正则化: 正则化是一种用于防止机器学习模型过度拟合的技术。它涉及向目标函数添加惩罚项,这会阻止模型拟合训练数据中的噪声。
  • GridSearchCV:  GridSearchCV 是一种用于寻找机器学习模型最佳超参数的技术。它涉及详尽地搜索预定义的超参数值范围,以找到提供最佳性能的组合。
  • RandomizedSearchCV:  RandomizedSearchCV 是一种用于寻找机器学习模型最佳超参数的技术。它涉及从预定义的值范围中随机选择超参数并评估其性能以找到最佳组合。

径向基函数

RBF(径向基函数)核函数是 SVM(支持向量机)分类算法中常用的核函数。它因其能够通过将数据映射到更高维度来处理非线性可分离数据而被广泛使用。

RBF核函数定义为:

K(x, x i ) = exp(-gamma * ||x – x i || 2 )

其中 x 和 x i是输入向量, ||x – x i || 2是两个向量之间的欧氏距离平方,gamma 是核参数。gamma参数决定了每个训练样例对决策边界的影响。较小的 gamma 值将导致决策边界的曲线更宽,而较大的 gamma 值将导致曲线更窄并且更集中于各个数据点。

RBF 核函数有几个优点。它是一个通用内核,这意味着在给定足够数据的情况下,它可以将任何连续函数近似到任意精度。它的计算效率也很高,因为它可以仅使用内积来实现,并且使用起来相对简单,因为它只需要选择单个参数 gamma。

然而,RBF 核函数可能对 gamma 的选择很敏感。如果 gamma 太小,模型可能会欠拟合数据,而如果 gamma 太大,模型可能会过度拟合数据。因此,根据具体数据集和当前问题仔细选择 gamma 值非常重要。

意义:在支持向量机(SVM)中,核函数在数据分类中起着至关重要的作用。核函数将原始输入数据映射到更高维的特征空间,在该空间中使用线性决策边界将数据分类为不同的类别变得更容易。这称为内核技巧。

核函数的重要性在于,它允许 SVM 通过将非线性可分离数据映射到更高维空间(在该空间中数据变为线性可分离)来对非线性可分离数据进行分类。SVM 的工作原理是找到将数据分为不同类别的最大间隔超平面。核函数有助于将数据投影到更高维度的空间,其中可以使用线性分类器找到最大边缘超平面。

SVM 中有不同类型的核函数,例如线性、多项式、S 形和径向基函数 (RBF)。每个核函数都有自己的特点,用于不同类型的数据。RBF 核特别受欢迎,因为它可以处理复杂的数据分布,并且可以有效地对非线性决策边界进行建模。

总体而言,SVM中的核函数是一个强大的工具,可以让SVM对复杂的数据分布进行分类并获得较高的分类精度。它帮助SVM克服线性分类器的局限性,有效处理非线性可分离数据。

以下是在 Scikit Learn 中调整 RBF SVM 参数所需的一般步骤:

步骤1: 导入必要的库:首先导入所需的库,包括Scikit Learn、Numpy和Pandas。

步骤 2: 加载并预处理数据:加载要用于训练和测试 SVM 模型的数据集。根据需要对数据进行预处理,包括特征缩放、特征选择和数据标准化。

步骤3: 将数据分为训练集和测试集:将数据分为两个集:训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。

步骤 4: 定义参数网格:定义要搜索的超参数值网格。指定 C 和 gamma 参数的值范围以及生成参数组合的方法。

步骤5: 执行网格搜索或随机搜索:使用GridSearchCV或RandomizedSearchCV函数执行超参数调整。这些函数将 SVM 模型拟合到网格中每个超参数组合的训练数据上,然后使用交叉验证来评估模型的性能。

步骤 6:如有必要,请重复:如果模型的性能不令人满意,请使用不同的超参数值重复调整过程,直到获得所需的性能水平。

总体而言,调整 RBF SVM 参数涉及通过系统搜索过程为 C 和 gamma 参数选择适当的值。这可以使用各种技术(例如 GridSearchCV 或 RandomizedSearchCV)来实现,并且涉及在单独的测试集上评估模型的性能。

实施

# 导入必要的库
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score
import seaborn as sns

# 加载并预处理数据
data = load_iris()
X = data.data
y = data.target

# 缩放数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 定义参数网格
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000],
			'gamma':[0.0001, 0.001, 0.01, 1, 10, 100, 1000]}

# 执行网格搜索
svm = SVC(kernel='rbf')
grid_search = GridSearchCV(svm,
						param_grid,
						cv=3,
						n_jobs=-1)
grid_search.fit(X_scaled, y)

print(
	"最佳参数是 {} n得分 : {}%".format(
		grid_search.best_params_, grid_search.best_score_*100)
)

# 热图的重塑
scores = grid_search.cv_results_["mean_test_score"].reshape(
	len(param_grid['gamma']),
	len(param_grid['C']))

# 热图
sns.heatmap(scores,
			cmap = plt.cm.hot,
			annot= True,
			cbar= True,
			square=True)

plt.xlabel("gamma")
plt.ylabel("C")
plt.xticks(np.arange(len(param_grid['gamma'])), param_grid['gamma'], rotation=45)
plt.yticks(np.arange(len(param_grid['C'])), param_grid['C'], rotation=0)

plt.title("Accuracy for different parameters")
plt.show()

## 绘图精度与C参数
plt.figure(figsize=(10, 6))
plt.title("Accuracy vs C parameter")
plt.xlabel("C")
plt.ylabel("Accuracy")
n = len(param_grid['C'])
for i in range(n):
	plt.plot(param_grid['C'],
			scores[:,i],
			'o-', label='gamma='+str(param_grid['gamma'][i]))

plt.legend()
plt.xscale('log')
plt.show()

输出:

最佳参数是 {'C': 100, 'gamma': 0.001}
得分:98.0%

C 与 Gamma 精度对比

精度 VS C 参数

生成的热图将显示当我们改变 C 和 gamma 值时分类精度如何变化。我们可以使用此可视化来确定 SVM 模型的最佳超参数。

循环遍历参数值并为每个组合训练 SVM

# 将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled,
													y, test_size=0.2,
													random_state=23)
# 定义参数网格
param_grid = {'C': [0.01, 1, 10, 100],
			'gamma': [0.001, 0.01, 0.1, 10]}


# 创建图形以绘制结果
fig, axs = plt.subplots(len(param_grid['C']),
						len(param_grid['gamma']),
						figsize=(16,16),
						sharey=True)

# 遍历参数值,并为每个组合训练SVM
for i, C in enumerate(param_grid['C']):
	for j, gamma in enumerate(param_grid['gamma']):
		clf = SVC(kernel='rbf', C=C, gamma=gamma)
		clf.fit(X_train, y_train)
		y_pred = clf.predict(X_test)
		accuracy = accuracy_score(y_test, y_pred)
		axs[i,j].scatter(X_test[:,0], X_test[:,1], c=y_pred)
		axs[i,j].set_xticks(())
		axs[i,j].set_yticks(())
		axs[i,j].set_title('C = {}, gamma = {}nAccuracy = {:.2f}'.format(
			C, gamma, accuracy))

plt.show()

输出:

不同 C 和伽玛的准确度 

注意: 由于随机训练/测试分割和随机网格搜索,准确性可能会略有不同,但总体趋势应保持不变。

此代码执行网格搜索,以在虹膜数据集上找到具有 RBF 内核的 SVM 模型的最佳参数组合(C 和 gamma)。然后,它根据 C 和 gamma 的不同值绘制模型的准确性,以显示参数如何影响结果。该图显示了对于不同的 gamma 值,精度如何随 C 变化。

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论