当前位置: 首页 > news >正文

python:如何调节机器学习算法的鲁棒性,以支持向量机SVM为例,让伙伴们看的更明白

鲁棒性(Robustness)指模型在噪声数据或异常值干扰下保持性能稳定的能力。想详细了解的可参考本人之前的博文

python机器学习:评价智能学习算法性能与效果的常见术语:不收敛、过拟合、欠拟合、泛化能力、鲁棒性一句话、一张图给您说明白,机器学习算法搞的明明白白的-CSDN博客文章浏览阅读1.2k次,点赞43次,收藏13次。机器学习中的关键概念解析,理解这些概念有助于优化算法设计和应用效果:不收敛指算法无法找到最优解,表现为损失函数持续波动或发散;欠拟合是模型过于简单,未能捕获数据规律;过拟合则是模型过度记忆训练数据,泛化能力差。泛化能力衡量模型在新数据上的表现,而鲁棒性则评估模型对数据干扰的抵抗能力。提高模型性能需针对不同问题采取相应策略:调整学习率、优化算法、正则化、数据增强等方法可改善不收敛和过拟合问题;增加训练数据、使用交叉验证能提升泛化能力;对抗训练和鲁棒损失函数则有助于增强鲁棒性。 https://blog.csdn.net/hlnzxl/article/details/149747294?spm=1001.2014.3001.5501

目录

一、文章内容介绍

二、控制鲁棒性的常用方法及指标

三、python程序设计 

四、应用建议


一、文章内容介绍

本文以支持向量机SVM为例,详细介绍如何调节机器学习算法的鲁棒性。通过一个简单的例子展示SVM在不同噪声水平下的表现,并调节正则化参数C来增强鲁棒性。

二、控制鲁棒性的常用方法及指标

常用方法:  

1. 数据预处理:处理异常值、缺失值,数据标准化/归一化。

 2. 正则化:如SVM中的C参数,控制对误分类的惩罚程度,C越小,容错性越强,鲁棒性越好(但可能欠拟合)。

 3. 使用对异常值不敏感的损失函数:例如SVM本身使用Hinge Loss,对异常值有一定鲁棒性。

4. 核函数选择:线性核可能比复杂核(如RBF)对噪声更鲁棒。

5.特征工程:选择相关性强、抗干扰的特征。

 常用指标:

1.标准差:多次运行结果的标准差。

2.噪声测试准确率:添加噪声后的性能保持度

3.特征扰动敏感度:特征变化时的性能波动

重点,以下是提升鲁棒性的黄金法则

三、python程序设计 

程序设计流程:

1. 生成带有不同噪声水平的数据集(使用make_blobs生成,并手动添加噪声点)。

2. 创建不同C值的SVM模型。

3. 在训练集上训练,并在测试集上评估。

4. 可视化决策边界,观察模型对噪声的敏感程度。

程序源代码如下,每条语句均有详细的注释,方便伙伴们学习。运行效果在程序后面。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei'] #解决中文不显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 1. 数据准备:加载乳腺癌数据集(增加更多噪声特征)
data = datasets.load_breast_cancer()
X, y = data.data, data.target# 添加更多随机噪声特征(从5个增加到15个)
np.random.seed(42)
noise_features = np.random.randn(X.shape[0], 15)  # 增加到15个噪声特征
X_noisy = np.hstack([X, noise_features])  # 合并原始特征和噪声# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_noisy, y, test_size=0.3, random_state=42
)# 标准化数据
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)# 2. 创建不同配置的SVM模型(调整参数以增强对比)
models = {# 高C值模型(低正则化)+ RBF核:对噪声非常敏感"噪声敏感_SVM": svm.SVC(C=500, kernel='rbf', gamma=0.5),# 低C值模型(高正则化)+ 线性核:增强鲁棒性"强鲁棒性_SVM": svm.SVC(C=0.01, kernel='linear'),# 默认参数模型(基准)"默认_SVM": svm.SVC(kernel='rbf', gamma='scale', C=1.0)
}# 3. 评估模型鲁棒性(增加噪声强度)
results = {}
for name, model in models.items():# 标准准确率评估model.fit(X_train_scaled, y_train)test_acc = accuracy_score(y_test, model.predict(X_test_scaled))# 交叉验证(评估稳定性)cv_scores = cross_val_score(model, X_train_scaled, y_train, cv=10)  # 增加交叉验证折数cv_mean = np.mean(cv_scores)cv_std = np.std(cv_scores)# 噪声鲁棒性测试:向测试集添加更强的噪声X_test_noisy = X_test_scaled + np.random.normal(0, 1.0, X_test_scaled.shape)  # 标准差从0.5增加到1.0noisy_acc = accuracy_score(y_test, model.predict(X_test_noisy))# 存储结果results[name] = {'test_acc': test_acc,'cv_mean': cv_mean,'cv_std': cv_std,'noisy_acc': noisy_acc,'noisy_drop': test_acc - noisy_acc}# 4. 打印鲁棒性评估报告
print("="*60)
print("{:<15} {:<10} {:<10} {:<10} {:<10} {:<10}".format("模型", "测试精度", "CV均值", "CV标准差", "噪声精度", "精度下降"))
print("-"*60)for name, res in results.items():print("{:<15} {:<10.4f} {:<10.4f} {:<10.4f} {:<10.4f} {:<10.4f}".format(name, res['test_acc'],res['cv_mean'],res['cv_std'],res['noisy_acc'],res['noisy_drop']))# 5. 可视化鲁棒性对比(增强效果)
labels = list(results.keys())
test_accs = [res['test_acc'] for res in results.values()]
noisy_accs = [res['noisy_acc'] for res in results.values()]
drops = [res['noisy_drop'] for res in results.values()]x = np.arange(len(labels))
width = 0.25# 创建更清晰的对比图
plt.figure(figsize=(12, 8))# 主图:清洁数据与噪声数据精度对比
ax1 = plt.subplot(2, 1, 1)
rects1 = ax1.bar(x - width/2, test_accs, width, color='skyblue', label='清洁数据')
rects2 = ax1.bar(x + width/2, noisy_accs, width, color='salmon', label='噪声数据')# 添加数据标签
for rect in rects1 + rects2:height = rect.get_height()ax1.annotate(f'{height:.3f}',xy=(rect.get_x() + rect.get_width() / 2, height),xytext=(0, 3),  # 垂直偏移textcoords="offset points",ha='center', va='bottom')ax1.set_ylabel('精度')
ax1.set_title('SVM模型鲁棒性对比 (噪声强度:1.0)', fontsize=14)
ax1.set_xticks(x)
ax1.set_xticklabels(labels)
ax1.legend()
ax1.grid(True, linestyle='--', alpha=0.3)
ax1.set_ylim(0.7, 1.0)  # 限制Y轴范围使差异更明显# 子图:精度下降对比
ax2 = plt.subplot(2, 1, 2)
rects3 = ax2.bar(x, drops, width, color='orange')# 添加数据标签
for rect in rects3:height = rect.get_height()ax2.annotate(f'{height:.3f}',xy=(rect.get_x() + rect.get_width() / 2, height),xytext=(0, 3),  # 垂直偏移textcoords="offset points",ha='center', va='bottom')ax2.set_ylabel('精度下降')
ax2.set_title('噪声导致的精度下降', fontsize=14)
ax2.set_xticks(x)
ax2.set_xticklabels(labels)
ax2.grid(True, linestyle='--', alpha=0.3)plt.tight_layout()
plt.show()

鲁棒性关键指标分析:

1.噪声准确率下降 (Drop%)

敏感模型:12.9%下降 → 鲁棒性差

鲁棒模型:仅3.5%下降 → 抗干扰能力强

2.交叉验证标准差 (CV Std)

敏感模型:0.023 → 稳定性较差

鲁棒模型:0.015 → 结果更稳定

3.噪声测试准确率

鲁棒模型在噪声数据上保持88.9%准确率

敏感模型在噪声数据上暴跌至80.1%

四、应用建议

在医疗诊断、金融风控等高风险领域,宁可牺牲少量精度也要确保鲁棒性。优先选择线性模型,将C值设置在0.1-1.0范围,并使用特征选择降低维度噪声影响。

http://www.dtcms.com/a/311530.html

相关文章:

  • Linux 系统管理-15-OpenSSH 服务管理
  • NLP——Transformer
  • flutter实时播报的桌面应用遇到的问题
  • I2C(韦东山HAL库)
  • 2023年ASOC SCI2区TOP,可修灰狼优化算法RGWO+燃料电池参数辨识,深度解析+性能实测
  • 【无标题】根据11维拓扑量子色动力学模型(11D-TQCD)与当代宇宙学理论的融合分析,宇宙轮回的终结机制及其最终状态可系统论述如下:
  • 商品中台数据库设计
  • WPFC#超市管理系统(4)入库管理
  • 音视频学习(四十八):PCM和WAV
  • 基于深度学习的医学图像分析:使用GAN实现医学图像增强
  • 进阶向:Python生成艺术图案(分形、数学曲线)
  • MySQL索引解析
  • vue3pinia
  • Corrosion2靶机
  • Cyber Weekly #63
  • 搜索引擎评估革命:用户行为模型如何颠覆传统指标?
  • Sklearn 机器学习 数据聚类 用Numpy自己实现聚类
  • 【C++】类和对象(2)
  • 使用keil点亮stc8核心板的灯
  • 逻辑回归 银行贷款资格判断案列优化 交叉验证,调整阈值,下采样与过采样方法
  • MQTT 入门教程:MQTT工具调式
  • 堆----2.前 K 个高频元素
  • VirtualBox 的 HOST 键(主机键)是 右Ctrl 键(即键盘右侧的 Ctrl 键)笔记250802
  • 学习笔记:无锁队列的原理以及c++实现
  • Linux 高级 I/O 系统调用详解
  • Vue 响应式基础全解析2
  • Node.js中path模块的使用指南
  • InfluxDB 与 Node.js 框架:Express 集成方案(二)
  • 如何在`<link type=“icon“ href=`的`href`中写SVG并使用path标签? 笔记250802
  • 嵌入式 C 语言入门:递归与变量作用域学习笔记 —— 从概念到内存特性