使用sklearn简单进行SVM参数优选

SVM简单回顾

支持向量机(SVM)方法建立在统计学VC维和结构风险最小化原则上,试图寻找到一个具有最大分类间隔的超平面,支持向量(Support Vector)是支持向量机训练的结果,在进行分类或者回归时也只依赖支持向量。因此SVM具有良好的鲁棒性,对未知数据拥有很强的泛化能力,特别是在数据量较少的情况下,相较其他传统机器学习算法具有更优的性能。
对于样本数据线性不可分的情况,通常采用核方法,将原始空间中的样本数据映射到一个更高维的特征空间,在该高维空间中样本数据线性可分。常用的核函数有线性核函数(Linear Kernel)、多项式核函数(Polynomial Kernel)、高斯核函数(RBF Kernel)和Sigmoid核函数(Sigmoid Kernel)。

名称表达式参数
线性核 k ( u , v ) = u T v + c k(u,v)=u^Tv+c k(u,v)=uTv+c
多项式核 k ( u , v ) = ( r ∗ u T v + c ) d k(u,v)=(r*u^Tv+c)^d k(u,v)=(ruTv+c)dc, d ≥ 1 d\geq1 d1为多项式次数
高斯核$k(u,v)=exp(-\frac{
Sigmoid核 k ( u , v ) = t a n h ( r ∗ u T v + c ) k(u,v)=tanh(r*u^Tv+c) k(u,v)=tanh(ruTv+c)tanh为双曲正切函数

使用SVM作为模型时,通常采用如下流程:

  1. 对样本数据进行归一化
  2. 应用核函数对样本进行映射
  3. 用cross-validation和grid-search对超参数进行优选
  4. 用最优参数训练得到模型
  5. 测试

在第二步中最长采用和核函数是RBF核函数和线性核函数,在样本线性可分时,线性核函数效果要比RBF核函数好,有如下指导规则:

  1. 如果Feature的数量很大,甚至和样本数量差不多时,往往线性可分,这时选用LR或者线性核SVM;
  2. 如果Feature的数量很小,样本数量正常,不算多也不算少,这时选用RBF核SVM;
  3. 如果Feature的数量很小,而样本的数量很大,这时手动添加一些Feature,使得线性可分,然后选用LR或者线性核SVM。

Libsvm参数

Libsvm是一个简单的、容易使用的、高效的实现了SVM分类和回归的工具包。Libsvm可以从该链接获取
当使用svm-train时,主要涉及以下参数:
-s svm_type : set type of SVM (default 0)
0 – C-SVC (multi-class classification)
1 – nu-SVC (multi-class classification)
2 – one-class SVM
3 – epsilon-SVR (regression)
4 – nu-SVR (regression)

-t kernel_type : set type of kernel function (default 2)
0 – linear: u’v
1 – polynomial: (gamma
u’v + coef0)^degree
2 – radial basis function: exp(-gamma
|u-v|^2)
3 – sigmoid: tanh(gamma*u’*v + coef0)

-d degree : set degree in kernel function (default 3),设置多项式核的degree值
-g gamma : set gamma in kernel function (default 1/num_features),多项式/RBF/Sigmoid核的gamma值
-r coef0 : set coef0 in kernel function (default 0),设置多项式/Sigmoid核的coef0值
-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1),设置惩罚函数的力度
-n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5),设置nu-SVC/one-class SVM/nu-SVR的nu值
-p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1),设置epsilon-SVR的损失函数中epsilon值
-m cachesize : set cache memory size in MB (default 100),设置cache内存的大小,单位MB
-e epsilon : set tolerance of termination criterion (default 0.001),设置终止的判据
-h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1),是否允许使用启发式
-b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0),是否进行概率估计
-wi weight : set the parameter C of class i to weightC, for C-SVC (default 1),设置C-SVC中第i类的参数C为weightC
-v n: n-fold cross validation mode,设置交叉检验
-q : quiet mode (no outputs)

对于RBF核函数,其中比较重要的参数有c,g。其中c表示对误差的惩罚程度,c越大,表示对误差的惩罚程度越大,模型对样本数据的学习更精确,也因此容易过拟合;反之,c越小,对误差的惩罚程度越小,可能欠拟合。g对应RBF核中的gamma值,gamma越大, σ \sigma σ越小,使得高斯分布又高又瘦,造成模型只能作用于支持向量附近,也就是过拟合;反之,gamma越小, σ \sigma σ越大,高斯分布会过于平滑,在训练集上分类效果不佳,也就是欠拟合。
最佳c,g组合的确定可以采用最简单的网格搜索方法,sklearn中提供了相应的方法GridSearchCV:

class sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True, refit=True, cv=None, verbose=0, pre_dispatch='2*n_jobs', error_score='raise', return_train_score=True)

比较重要的参数有:
estimator:使用的模型
param_grid:参数列表,如下展示了分别使用RBF核函数与线性核函数时参数选择

parameters = [
	{
		'C': [1, 3, 5, 7, 9, 11, 13, 15, 17, 19],
	    'gamma': [0.00001, 0.0001, 0.001, 0.1, 1, 10, 100, 1000],
	    'kernel': ['rbf']
	},
	{
		'C': [1, 3, 5, 7, 9, 11, 13, 15, 17, 19],
	    'kernel': ['linear']
	}
]

scoring:评价指标,默认采用estimator的score函数
cv:交叉验证参数,默认为3,使用3折交叉验证
n_jobs:并行数

之后调用GridSearchCV对象的fit()方法在训练数据集上运行网格搜索,选出最优参数,然后在测试集上测试模型。GridSearchCV对象还包括如下常用属性:
grid.scores:给出不同参数组合下的评价结果
grid.best_params_:最佳结果的参数组合
grid.best_score_:最佳评价得分
grid.best_estimator_:最佳模型
完整的例子如下:

from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV

svc = SVC()
parameters = [
	{
		'C': [1, 3, 5, 7, 9, 11, 13, 15, 17, 19],
	    'gamma': [0.00001, 0.0001, 0.001, 0.1, 1, 10, 100, 1000],
	    'kernel': ['rbf']
	},
	{
		'C': [1, 3, 5, 7, 9, 11, 13, 15, 17, 19],
	    'kernel': ['linear']
	}
]
clf = GridSearchCV(svc, parameters, cv=5, n_jobs=8)
clf.fit(train_data, train_data_tag)
print(clf.best_params_)
best_model = clf.best_estimator_
best_model.predict(test_data)

当然随着数据量的增大,GridSearchCV的效率将变得非常低,可以采用一些其他更加高级的调优方法。

使用scikit-learn库中的支持向量机(SVM)分类鸢尾花数据集的步骤如下: 1. **导入必要的库**: - `numpy` 和 `pandas` 用于数据处理。 - `matplotlib` 和 `seaborn` 用于数据可视化。 - `sklearn` 中的 `svm` 用于支持向量机分类,`datasets` 用于加载鸢尾花数据集,`train_test_split` 用于分割数据集,`accuracy_score` 用于评估模型性能。 2. **加载数据集**: 使用 `sklearn.datasets` 中的 `load_iris` 函数加载鸢尾花数据集。 3. **分割数据集**: 使用 `train_test_split` 将数据集分割为训练集和测试集。 4. **训练SVM模型**: 使用 `svm.SVC` 创建一个支持向量机分类器,并在训练集上进行训练。 5. **评估模型**: 使用测试集评估模型的性能,并输出准确率。 6. **可视化结果**: 使用 `matplotlib` 和 `seaborn` 进行数据可视化,展示分类结果。 以下是完整的代码示例: ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn import svm from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 加载鸢尾花数据集 iris = datasets.load_iris() X = iris.data y = iris.target # 分割数据集为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 创建SVM分类器 clf = svm.SVC(kernel='linear') # 训练模型 clf.fit(X_train, y_train) # 预测测试集 y_pred = clf.predict(X_test) # 评估模型 accuracy = accuracy_score(y_test, y_pred) print(f"模型准确率: {accuracy * 100:.2f}%") # 可视化结果 sns.scatterplot(x=X_test[:, 0], y=X_test[:, 1], hue=y_pred, palette='Set1') plt.title('SVM Classification of Iris Dataset') plt.xlabel(iris.feature_names[0]) plt.ylabel(iris.feature_names[1]) plt.show() ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值