鲁棒性(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.pswp.cn/bicheng/91982.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91982.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/91982.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

号源加锁升级思路(解决高并发问题)

原先逻辑链接&#xff1a;号源预约加锁思路_java 预约 接口加锁-CSDN博客 一、进行治疗项目和号源数据缓存 1.新建一个定时任务&#xff0c;主要在凌晨时缓存治疗项目和号源数据 1.1.类中使用redission获取锁&#xff08;用于分布式系统获取数据&#xff0c;保证原子性&…

MCP革命:AI世界的“USB-C”接口如何重塑智能体与外部工具的连接

> 一条标准化的数据通道,让AI从“对话专家”蜕变为“行动专家”,背后是一场由协议驱动的工具连接革命。 2024年11月,Anthropic公司开源了**Model Context Protocol(MCP)**。在短短9个月内,这项技术彻底改变了AI与外部世界的交互方式。截至2025年8月,MCP服务数量**从…

启用“安全登录”组合键(Ctrl+Alt+Delete)解锁

文章目录背景目标功能操作步骤效果背景 在日常工作中&#xff0c;我们有时需要让电脑长期开机运行&#xff08;如处理长任务、作为服务器等&#xff09;。然而&#xff0c;这其中存在一个潜在风险&#xff1a;当电脑处于锁屏或登录界面时&#xff0c;如果有人无意中触碰键盘比…

【08】C++实战篇——C++ 生成动态库.dll 及 C++调用DLL,及实际项目中的使用技巧

文章目录一、创建动态库dll (方法一)1 生成C 动态库dll1.1 创建项目MyDLL1.2 编写.h 和 .cpp文件1.3 设置 及 生成 DLL2 调用 C 动态库dll2.1 创建C 空项目DLLtest2.2 动态库配置 及代码调用测试3 实际项目中的使用技巧3.1 设置dll输出路径3.2 设置头文件引入路径3.3 改进后 测…

kettle插件-kettle http client plus插件,轻松解决https接口无法调用文件流下载问题

场景&#xff1a;小伙伴在使用kettle调用https接口过程中无法正常调用&#xff0c;程序出错问题&#xff0c;今天演示下用自研插件轻松解决这个问题。1、使用openssl 生成自签名证书openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 3652、使用…

C#中的除法

在C#中&#xff0c;除法操作可以通过使用 / 运算符执行。这个运算符可以进行整数除法或浮点除法&#xff0c;这取决于操作数的类型。整数除法当两个整数相除时&#xff0c;结果将自动向下取整到最接近的整数。这意味着结果是一个整数&#xff0c;而不是小数。int a 10; int b …

PPT文件密码解密工具推荐:Tenorshare PassFab for PPT绿色免安装一键解除密码限制,附详细教程和下载地址

前段时间&#xff0c;我帮朋友做一个商业演示的 PPT&#xff0c;为了防止文件被误操作或者内容泄露&#xff0c;我给 PPT 设置了密码。结果等朋友来拿文件的时候&#xff0c;我居然把密码忘得干干净净&#xff0c;这下可把我俩都急坏了。朋友那边马上就要用这个 PPT 去参加重要…

【数据结构】二叉树接口实现指南:递归方法的高效运用 (附经典算法OJ)

文章目录 1、前置说明 1、定义二叉树结点结构 2、创建新节点 3、手动创建二叉树 2、二叉树的遍历 1、前序&#xff0c;中序和后序遍历 1.1、二叉树前序遍历 1.2、二叉树中序遍历 1.3、二叉树后序遍历 2、二叉树层序遍历 3、二叉树的基础操作 1、二叉树节点总数 2、…

自动驾驶控制算法——LQR控制算法

自动驾驶控制算法——LQR控制算法 文章目录自动驾驶控制算法——LQR控制算法**一、LQR 是什么&#xff1f;**二、LQR 原理2.1 线性状态空间模型 (State–Space Model)2.2 二次型性能指标 JJJ2.3 代数黎卡提方程 (ARE)2.4 特点总结2.5 一句话总结 LQR 原理&#xff1a;2.5.1 场景…

Jotai:React轻量级原子化状态管理,告别重渲染困扰

简介 Jotai 是一个为 React 提供的原子化状态管理库&#xff0c;采用自下而上的方法来进行状态管理。Jotai 受 Recoil 启发&#xff0c;通过组合原子来构建状态&#xff0c;并且渲染基于原子依赖性进行优化。这解决了 React 上下文的额外重新渲染问题&#xff0c;并消除了对 m…

C语言数据结构(7)贪吃蛇项目2.贪吃蛇项目实现

8. 核心逻辑实现分析 8.1 游戏主逻辑 程序开始就设置程序支持本地模式&#xff0c;然后进入程序的主逻辑。 主逻辑分为3个过程&#xff1a; • 游戏开始&#xff08;GameStart&#xff09;完成游戏的初始化。 • 游戏运行&#xff08;GameRun&#xff09;完成游戏运行逻辑的…

知识蒸馏 - 最小化KL散度与最小化交叉熵是完全等价的

知识蒸馏 - 最小化KL散度与最小化交叉熵是完全等价的 flyfish KL散度与交叉熵的数学关系 对于两个概率分布 PPP&#xff08;真实分布&#xff09;和 QQQ&#xff08;模型预测分布&#xff09;&#xff0c;KL散度的定义是&#xff1a; DKL(P∥Q)∑xP(x)log⁡(P(x)Q(x)) D_{KL}(P…

设计心得——网络包的处理

一、介绍 在程序的开发中&#xff0c;网络开发是一个重要的应用场景。毕竟这些年IT行业之所以火&#xff0c;主要还是互联网&#xff08;移动互联网&#xff09;带来的。网络开发&#xff0c;有各种平台、框架以及系统和库提供的API&#xff0c;如果说网络开发是一个特别复杂和…

sqli-labs通关笔记-第30关GET字符注入(WAF绕过 双引号闭合 手工注入+脚本注入两种方法)

目录 一、源码分析 1、index.php代码审计 2、login.php代码审计 3、java_implimentation函数 4、whitelist函数 5、SQL安全性分析 二、渗透实战 1、进入靶场 2、WAF探测 &#xff08;1&#xff09;触发WAF &#xff08;2&#xff09;绕过WAF 3、手工注入 &#xf…

【openlayers框架学习】九:openlayers中的交互类(select和draw)

文章目录openlayers进阶28 openlayers中的事件29 openlayers中select交互类的使用30 openlayers中select常见的配置选项31 openlayers中绘制交互类&#xff08;Draw&#xff09;openlayers进阶 28 openlayers中的事件 常用进行事件交互的对象&#xff1a;map\view\source29 o…

Java企业级应用性能优化实战

在企业级Java应用开发中,性能优化是确保系统稳定运行的关键因素。本文将从多个维度深入分析Java应用性能瓶颈,并提供实战优化方案。 🎯 性能优化核心领域 1. 对象操作性能优化 在企业应用中,对象拷贝是一个高频操作,特别是在分层架构中的DO、DTO、VO转换。选择合适的拷…

LLM Prompt与开源模型资源(3)如何写一个好的 Prompt

学习材料&#xff1a;https://www.hiascend.com/developer/courses/detail/1935520434893606913 &#xff08;3.5&#xff09;学习时长&#xff1a; 预计 60 分钟学习目的&#xff1a; 了解提示工程的定义与作用熟悉提示工程的关键技术相关概念掌握基于昇腾适配的大模型提示工程…

日志管理工具 ——ELK Stack

一、ELK Stack 概述1.1 核心组件ELK Stack&#xff08;现更名为 Elastic Stack&#xff09;是一套开源的日志收集、存储、分析和可视化平台&#xff0c;由三个核心组件构成&#xff1a;Elasticsearch&#xff1a;分布式搜索引擎&#xff0c;负责日志数据的存储、索引和快速查询…

SpringAI:AI工程应用框架新选择

Spring AI 是一个用于 AI 工程的应用框架 Spring AI 是一个用于 AI 工程的应用框架。其目标是将可移植性和模块化设计等 Spring 生态系统设计原则应用于 AI 领域,并推广使用 POJO 作为应用程序的构建块到 AI 领域。 Spring AI 的核心是解决 AI 集成的基本挑战:将企业数据和…

Kettle 开源ETL数据迁移工具从入门到实战

ETL&#xff08;Extract, Transform, Load&#xff09;工具是用于数据抽取、转换和加载的软件工具&#xff0c;用于支持数据仓库和数据集成过程。Kettle作为传统的ETL工具是纯 java 开发的开源的 ETL工具&#xff0c;用于数据库间的数据迁移 。可以在 Linux、windows、unix 中运…