利用交叉验证寻找SVM最优惩罚因子和松弛因子

博客围绕SVM模型展开案例分析。先导入所需库、读取数据文件,将数据集划分为训练集和测试集,对训练集进行过采样处理。接着设置SVM模型参数范围,用交叉验证选择最佳参数,训练分类器并预测,最后输出分类器性能报告,评估模型在测试集上的表现。

 一、案例分析

1.导入所需的库:

import pandas as pd#用于处理数据表格
import numpy as np#处理数组
from sklearn.metrics import classification_report#score的summary
from sklearn.model_selection import cross_val_score,train_test_split
#用于交叉验证,分割数据集
from sklearn.svm import SVC#支持向量机算法
from imblearn.over_sampling import SMOTE#处理标签不平衡的过采样算法

2.读取数据文件:

data = pd.read_excel('data.xls')
X = data.iloc[:, :-1]
y = data.iloc[:, -1]

这段代码使用pandas库读取名为'data.xls'的Excel文件,并将输入特征X和目标变量y分别存储起来。

3.划分训练集和测试集:

x_train, x_test, y_train, y_test = \
    train_test_split(X, y, test_size=0.2, random_state=0)

使用train_test_split函数将数据集划分为训练集和测试集,其中测试集占总数据集的20%。

4.过采样处理:

oversampler = SMOTE(random_state=0)
os_train_x, os_train_y = oversampler.fit_resample(x_train, y_train)

使用SMOTE方法对训练集进行过采样处理,生成平衡的训练数据集os_train_x和对应的目标变量os_train_y

5.输出过采样后的样本数量:

print(len(os_train_y[os_train_y==1]))
print(len(os_train_y[os_train_y==0]))

输出经过过采样处理后的样本数量,显示少数类样本(类别为1)和多数类样本(类别为0)的数量。
 

6.设置SVM模型参数范围:

c_params_range = [0.01, 0.1, 1.0, 10, float('inf')]
g_params_range = [0.1, 1, 10, 'scale']

定义了C参数和gamma参数的取值范围,用于进行交叉验证选择最佳的超参数。

7.使用交叉验证选择最佳参数(详见:交叉验证svm参数):

scores = []
for i in c_params_range:
    for j in g_params_range:
        print(f'c为:{i},gamma为{j})', end='')
        svm = SVC(kernel='rbf', C=i, gamma=j, random_state=0)
        score = cross_val_score(svm, os_train_x, os_train_y, cv=10, scoring='recall')
        #10折交叉验证(k=cv=10)
        score_mean = sum(score) / len(score)
        print(score_mean)
        scores.append(score_mean)

通过嵌套循环遍历参数范围,构建SVC模型,使用交叉验证计算每组参数值的分类器性能(这里以召回率作为评估指标),并将召回率的平均值存储在scores列表中。选择最佳参数值

8.选择最佳参数值:

best_c = c_params_range[np.argmax(scores) // 4]
best_g = g_params_range[np.argmax(scores) % 4]
print(best_c, best_g)

选取召回率最大的组合对应的参数值,即best_cbest_g

9.使用最佳参数值训练分类器并进行预测:

svm = SVC(kernel='rbf', C=best_c, gamma=best_g, random_state=0)
svm.fit(x_test, y_test)
pred = svm.predict(x_test)

创建一个使用最佳参数值的SVC模型,对测试集进行训练,并进行预测。

10.输出分类器性能报告:

print(classification_report(y_test, pred))

输出测试集上的分类性能报告,包括准确率、召回率、F1值等指标。

二、代码结果:

三、总结

总体而言,这段代码使用SMOTE进行过采样处理,然后对过采样后的数据进行交叉验证选择最佳参数的SVM模型,在测试集上进行评估并输出分类性能报告。

在标准的支持向量机SVM)中,目标是找到具有最大几何间隔的超平面来划分正负类别,这适用于训练数据完全线性可分的情况。然而,在现实世界中,数据往往存在噪声或者不是完全线性可分的,此时就需要引入松弛变量惩罚参数来平衡间隔宽度分类错误惩罚松弛变量 $\xi_i$ 用于处理那些不能被正确分类的样本。对于每个样本 $(x_i, y_i)$,如果它被正确分类且在间隔边界之外,那么 $\xi_i = 0$;如果它在间隔边界之内但仍被正确分类,那么 $0 < \xi_i < 1$;如果它被错误分类,那么 $\xi_i > 1$。通过引入松弛变量,SVM 允许一定程度的分类错误,从而使得模型能够适应更复杂的数据分布。 惩罚参数 $C$ 则控制了对分类错误的容忍程度。$C$ 是一个正实数,它在目标函数中作为一个权重因子SVM 的目标函数在引入松弛变量后变为: $$ \min_{\mathbf{w}, b, \xi} \frac{1}{2} \|\mathbf{w}\|^2 + C \sum_{i=1}^{n} \xi_i $$ $$ \text{s.t. } y_i(\mathbf{w}^T \mathbf{x}_i + b) \geq 1 - \xi_i, \quad \xi_i \geq 0, \quad i = 1, \ldots, n $$ 其中,$\frac{1}{2} \|\mathbf{w}\|^2$ 项与间隔宽度相关,$\|\mathbf{w}\|$ 越小,间隔越宽。而 $C \sum_{i=1}^{n} \xi_i$ 项则是对分类错误的惩罚,$\xi_i$ 越大表示分类错误越严重,$C$ 越大则表示对分类错误的惩罚越重。 - 当 $C$ 取值较大时,模型会更倾向于减少分类错误,即尽量让所有样本都被正确分类。此时,模型会尝试缩小间隔宽度,以适应更多的样本,可能会导致过拟合。 - 当 $C$ 取值较小时,模型对分类错误的惩罚较轻,更注重保持较大的间隔宽度。这可能会导致模型对一些样本的分类错误,但可以提高模型的泛化能力,减少过拟合的风险。 通过调整惩罚参数 $C$ 的值,SVM 可以在间隔宽度分类错误惩罚之间找到一个合适的平衡点,从而得到一个在训练数据新数据上都表现良好的模型。 ```python from sklearn import svm import numpy as np # 生成一些示例数据 X = np.array([[0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5]]) y = np.array([0, 0, 0, 1, 1, 1]) # 不同的惩罚参数 C C_values = [0.1, 1, 10] for C in C_values: clf = svm.SVC(C=C, kernel='linear') clf.fit(X, y) print(f"For C = {C}, coefficients: {clf.coef_}, intercept: {clf.intercept_}") ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值