SKlearn SVM二分类主要代码及参数解释

SVC参数详解与应用
本文深入解析SVC(支持向量分类)的参数配置,包括C、kernel、degree等关键参数的作用及如何影响分类效果。同时,介绍了fit()和predict()方法的使用,以及如何评估模型在测试集上的准确率。
from sklearn.svm import SVC
clf = SVC(kernel='rbf')#调参
clf.fit(X, y)#训练
print(clf.fit(X, y))#输出参数设置
p = 1#正确分类的个数
for i in range(len(test_dataset)):#循环检测测试数据分类成功的个数

    if clf.predict(np.array([test_dataset[i]])) == test_labels[i][0]:
        p += 1

print(p / len(test_labels))#输出测试集准确率

'''
SVC参数解释
(1)C: 目标函数的惩罚系数C,用来平衡分类间隔margin和错分样本的,default C = 1.0;
(2)kernel:参数选择有RBF, Linear, Poly, Sigmoid, 默认的是"RBF";
(3)degree:if you choose 'Poly' in param 2, this is effective, degree决定了多项式的最高次幂;
(4)gamma:核函数的系数('Poly', 'RBF' and 'Sigmoid'), 默认是gamma = 1 / n_features;
(5)coef0:核函数中的独立项,'RBF' and 'Poly'有效;
(6)probablity: 可能性估计是否使用(true or false);是否启用概率估计。 这必须在调用fit()之前启用,并且会fit()方法速度变慢
(7)shrinking:是否进行启发式;
(8)tol(default = 1e - 3): svm停止训练的误差精度;
(9)cache_size: 制定训练所需要的内存(以MB为单位);默认为200MB。
(10)class_weight: 给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面参数指出的参数C.如果给定参数‘balanced’,则使用y的值自动调整与输入数据中的类频率成反比的权重。缺省的话自适应;
(11)verbose: 是否启用详细输出。 此设置利用libsvm中的每个进程运行时设置,如果启用,可能无法在多线程上下文中正常工作。一般情况都设为False,不用管它。
(12)max_iter: 最大迭代次数,default = 1, if max_iter = -1, no limited;
(13)decision_function_shape : ‘ovo’ 一对一, ‘ovr’ 多对多  or None 无, default=None
(14)random_state :用于概率估计的数据重排时的伪随机数生成器的种子。
 ps:7,8,9一般不考虑。
 主要调节的参数有:C、kernel、degree、gamma、coef0。
 ★fit()方法:用于训练SVM,具体参数已经在定义SVC对象的时候给出了,这时候只需要给出数据集X和X对应的标签y即可。
 ★predict()方法:基于以上的训练,对预测样本T进行类别预测,因此只需要接收一个测试集T,该函数返回一个数组表示个测试样本的类别。
'''

<think>我们首先需要理解用户的问题:用户希望了解sklearn.svm模块的参数说明,以及如何导出训练好的SVM模型的参数数据。 根据引用[1]和引用[2],我们可以知道sklearn.svm模块提供了多种SVM模型,其中SVC是最常用的分类器。我们将重点介绍SVC参数,并说明如何导出模型的关键参数。 步骤: 1. 介绍SVC主要参数及其含义。 2. 说明如何获取训练好的SVM模型的参数,包括支持向量、系数、截距等。 3. 提供代码示例展示如何训练一个SVM模型并导出参数。 注意:由于用户之前的问题是关于多分类多特征SVM可视化,我们也可以适当关联,比如在导出参数后,如何利用这些参数进行可视化(例如决策边界)。 具体回答结构如下: ### 一、`sklearn.svm.SVC` 主要参数说明 SVC是用于分类的支持向量机,其主要参数包括: 1. **`C`** : 正则化参数,默认为1.0。C值越大,对误分类的惩罚越大,容易过拟合;C值越小,容错能力越强,容易欠拟合。 2. **`kernel`** : 核函数类型,默认为`'rbf'`(径向基函数)。可选值包括: - `'linear'` : 线性核 - `'poly'` : 多项式核 - `'rbf'` : 高斯核 - `'sigmoid'` : sigmoid核 - `'precomputed'` : 预计算核(需要提供核矩阵) 3. **`degree`** : 多项式核的阶数,默认为3。仅当`kernel='poly'`时有效。 4. **`gamma`** : 核函数的系数,默认为`'scale'`(即1/(n_features * X.var()))。也可设置为`'auto'`(1/n_features)。该参数影响模型的复杂度,值越大模型越复杂。 5. **`coef0`** : 核函数中的独立项,仅在`kernel='poly'`或`'sigmoid'`时有效。 6. **`shrinking`** : 是否使用启发式收缩,默认为`True`。 7. **`probability`** : 是否启用概率估计,默认为`False`。开启后会降低训练速度。 8. **`tol`** : 停止训练的误差精度,默认为1e-3。 9. **`cache_size`** : 核函数缓存大小(MB),默认为200。 10. **`class_weight`** : 类别权重,可设置为`'balanced'`或自定义字典。用于处理不平衡数据。 11. **`verbose`** : 是否详细输出,默认为`False`。 12. **`max_iter`** : 最大迭代次数,默认为-1(无限制)。 13. **`decision_function_shape`** : 多分类策略,默认为`'ovr'`(一对多),可选`'ovo'`(一对一)[^1][^2]。 14. **`break_ties`** : 当`decision_function_shape='ovr'`且类别数大于2时,如果为True,则根据决策函数值打破平局;否则返回第一个类别。默认为`False`。 ### 二、导出训练好的SVM模型参数 训练完成后,可以通过以下属性获取模型的关键参数: 1. **支持向量**: - `model.support_vectors_`:支持向量的坐标(数组,每行一个支持向量) 2. **支持向量的索引**: - `model.support_`:支持向量在训练样本中的索引 3. **每个类别的支持向量数量**: - `model.n_support_`:每个类别的支持向量数量(数组) 4. **决策函数系数**: - `model.dual_coef_`:对偶问题的解(即拉格朗日乘子乘以类别标签),形状为(n_classes-1, n_sv) - 注意:对于多分类,系数可能较为复杂(取决于OVO或OVR策略) 5. **截距**: - `model.intercept_`:决策函数中的常数项(截距),形状为(n_classes*(n_classes-1)//2)(对于OVO)或(n_classes)(对于OVR) 6. **核函数相关参数**: - 如果使用线性核,可以通过`model.coef_`获取特征权重(即w向量),形状为(n_classes, n_features)(对于OVR)或(n_classes*(n_classes-1)//2, n_features)(对于OVO) 注意:对于非线性核,`coef_`不可用,因为特征被映射到高维空间,无法直接获取权重向量。 ### 三、示例代码:训练SVM并导出参数 以下示例使用鸢尾花数据集训练一个SVM分类器,并导出关键参数: ```python from sklearn.svm import SVC from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载数据 iris = load_iris() X, y = iris.data, iris.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 训练模型(使用RBF核) model = SVC(kernel='rbf', C=1.0, gamma='scale', decision_function_shape='ovr', probability=True) model.fit(X_train, y_train) # 导出模型参数 print("支持向量索引:", model.support_) print("每个类别的支持向量数量:", model.n_support_) print("支持向量坐标:\n", model.support_vectors_) print("对偶系数(拉格朗日乘子乘以标签):\n", model.dual_coef_) print("截距(决策函数常数):\n", model.intercept_) # 对于线性核,我们可以获取权重向量 linear_model = SVC(kernel='linear', C=1.0, decision_function_shape='ovr') linear_model.fit(X_train, y_train) print("线性核的权重向量(每个分类器的系数):\n", linear_model.coef_) print("线性核的截距:\n", linear_model.intercept_) # 保存模型(可选,使用joblib) import joblib joblib.dump(model, 'svm_model.pkl') ``` ### 四、注意事项 1. **多分类参数结构**:在多分类情况下,`dual_coef_`和`intercept_`的结构取决于`decision_function_shape`参数: - OVR:每个二分类器对应一组系数和截距(共n_classes组) - OVO:每两个类别之间有一个分类器,共$\binom{n\_classes}{2}$组系数和截距 2. **核函数限制**:非线性核无法直接获取权重向量`coef_`(仅线性核有效) 3. **概率估计**:当`probability=True`时,模型会额外进行概率校准,但不会影响决策函数的核心参数[^1]。 §§ 相关问题 §§ 1. 如何解释SVM模型中的对偶系数? 2. 在多分类SVM中,OVR和OVO策略导出的参数有何不同? 3. 如何利用导出的SVM参数手动计算决策函数值? 4. 对于非线性SVM,有哪些方法可以近似解释模型?</think>### sklearn.svm 模块核心参数详解与模型参数导出方法 #### 一、sklearn.svm 核心参数说明 以下参数适用于 `SVC`, `NuSVC`, `LinearSVC` 等分类模型: 1. **基础参数** - `C` : 正则化参数(默认=1.0) $C$ 值越大,分类边界越严格,可能过拟合;$C$ 值越小,容错性越强 - `kernel` : 核函数类型(默认='rbf') - `linear` : 线性核 $K(\mathbf{x}_i, \mathbf{x}_j) = \mathbf{x}_i \cdot \mathbf{x}_j$ - `poly` : 多项式核 $K(\mathbf{x}_i, \mathbf{x}_j) = (\gamma \mathbf{x}_i \cdot \mathbf{x}_j + r)^d$ -
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值