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

深度学习中的离群值

文章目录

    • 深度学习中有离群值吗?
      • 深度学习中的离群值来源:
      • 处理离群值的策略:
        • 1. 数据预处理阶段:
        • 2. 数据增强和鲁棒模型:
        • 3. 模型训练阶段:
        • 4. 异常检测集成模型:
      • 如何处理对抗样本?
      • 总结:
    • 能够使用PyTorch检测离群值吗?
    • 1. 基于 Z-Score 的离群值检测
      • 原理:
      • 代码示例:
    • 2. 基于 IQR 的离群值检测
      • 原理:
      • 代码示例:
    • 3. 使用自动编码器(Autoencoder)检测离群值
      • 原理:
      • 代码示例:
    • 4. 使用 Isolation Forest 检测离群值(借助 sklearn)
      • 代码示例:
    • 5. 使用基于密度的算法(DBSCAN)检测离群值
      • 原理:
      • 代码示例:
    • 总结:
    • 相关阅读

深度学习中有离群值吗?

是的,和许多刚刚接触深度学习的工程师默认的不一样的是——深度学习中也会遇到离群值(Outliers)。这些异常值可能存在于输入数据或标签中,并对模型的训练和预测结果产生负面影响。


深度学习中的离群值来源:

  1. 输入特征异常:

    • 数据采集错误(例如传感器故障或录入错误)。
    • 数据预处理错误特征缩放问题。(这些错误甚至可能是模型训练者自己进行错误的数据增强造成的)
  2. 标签异常:

    • 手动标注错误(例如分类错误的标签,在一些有名的开源数据集中,偶尔也会存在这类问题)。在一篇新论文中,麻省理工 CSAIL 和亚马逊的研究者对 10 个主流机器学习数据集的测试集展开了研究,发现它们的平均错误率竟高达 3.4%。其中,最有名的 ImageNet 数据集的验证集中至少存在 2916 个错误,错误率为 6%;QuickDraw 数据集中至少存在 500 万个错误,错误率为 10%。论文链接:https://arxiv.org/pdf/2103.14749.pdf

    • 噪声或异常样本影响训练数据集。

  3. 特征空间偏差:

    • 特征分布存在长尾效应极端值
  4. 对抗样本:

    • 特意设计的输入,导致模型错误分类或输出异常结果(例如对抗攻击)。

处理离群值的策略:

1. 数据预处理阶段:

(a) 可视化分析

  • 绘制箱线图、散点图或直方图观察异常值分布。
  • 示例代码:
import matplotlib.pyplot as plt
plt.boxplot(data)
plt.show()

(b) 统计检测法

  • 使用 Z-Score 或 IQR 方法检测离群值(适合小规模数据)。

© 清洗数据

  • 删除离群值: 如果异常值是错误数据,可以直接移除。
  • 替代或修正: 替换为均值、中位数或插值估计值。

2. 数据增强和鲁棒模型:

(a) 数据增强(Data Augmentation):

  • 使用扩增技术生成更多样化的样本,减少异常值的影响(错误的数据增强也会产生离群值数据,要对数据增强产生的数据进行检测,以避免该问题)。

(b) 使用鲁棒模型:

  • 在训练深度学习模型时采用损失函数对离群值不敏感的方法,例如:

    • Huber Loss:兼顾均方误差和绝对误差。
    • Smooth L1 Loss:对离群值具有更高的鲁棒性。
    • 示例代码:
    import torch.nn as nn
    loss = nn.SmoothL1Loss()
    

3. 模型训练阶段:

(a) Early Stopping 和正则化:

  • 使用Early Stopping防止模型过拟合异常样本。
  • 使用L1/L2正则化约束权重,降低对极端值的敏感性。

(b) Dropout 技术:

  • 随机丢弃部分神经元,减少模型对异常值的依赖。

4. 异常检测集成模型:

(a) 使用孤立森林或 LOF 检测异常值:
在深度学习之前,可以结合机器学习算法先检测异常样本,再将清洗后的数据输入深度学习模型。

(b) 使用自动编码器(Autoencoder):
训练一个自编码器重建输入数据,计算重建误差来检测异常值。

from keras.models import Model, Sequential
from keras.layers import Dense, Input# 建立 Autoencoder
input_dim = X_train.shape[1]
model = Sequential([Dense(64, activation='relu', input_shape=(input_dim,)),Dense(32, activation='relu'),Dense(64, activation='relu'),Dense(input_dim, activation='sigmoid')
])
model.compile(optimizer='adam', loss='mse')# 使用重建误差检测异常值
reconstruction = model.predict(X_test)
mse = np.mean(np.power(X_test - reconstruction, 2), axis=1)
threshold = np.percentile(mse, 95)  # 取阈值
outliers = X_test[mse > threshold]

如何处理对抗样本?

  1. 对抗训练: 使用生成对抗样本增强模型鲁棒性。
  2. 正则化约束: 如 FGSM(Fast Gradient Sign Method)等方法提高模型的稳定性。
  3. 检测机制: 在输入层增加检测模块,过滤异常输入。

总结:

深度学习中的离群值可能来源于输入特征或标签的异常分布,对模型训练和预测精度产生负面影响。因此,可以通过数据预处理、鲁棒损失函数、正则化、数据增强和异常检测模型等方法降低其影响。同时,对于更复杂的问题如对抗样本,需要额外设计防御机制来保护模型安全性。

此外目前也有专门用于处理数据集标注错误的深度学习模型,有兴趣的朋友可以去自行了解一下。

关键字:置信学习。可参考阅读: 关于置信学习的文献综述(简易版)

能够使用PyTorch检测离群值吗?

首先回答,是的。不过方法大同小异。

PyTorch 中,可以使用多种方法来检测离群值。以下是几种常用的方法及代码示例:


1. 基于 Z-Score 的离群值检测

原理:

计算每个数据点的 Z-Score,如果其绝对值大于某个阈值(如 3),则认为是离群值。

代码示例:

import torch# 示例数据
data = torch.tensor([10, 12, 11, 13, 300, 14, 15], dtype=torch.float)# 计算均值和标准差
mean = torch.mean(data)
std = torch.std(data)# 计算 Z-Score
z_scores = (data - mean) / std# 筛选离群值
threshold = 3  # 设置阈值
outliers = data[torch.abs(z_scores) > threshold]
print("Outliers:", outliers)

2. 基于 IQR 的离群值检测

原理:

通过计算四分位数范围 (IQR),判断是否超出 1.5 倍 IQR 的范围。

代码示例:

import torch# 示例数据
data = torch.tensor([10, 12, 11, 13, 300, 14, 15], dtype=torch.float)# 计算四分位数
Q1 = torch.quantile(data, 0.25)
Q3 = torch.quantile(data, 0.75)
IQR = Q3 - Q1# 计算边界
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR# 筛选离群值
outliers = data[(data < lower_bound) | (data > upper_bound)]
print("Outliers:", outliers)

3. 使用自动编码器(Autoencoder)检测离群值

原理:

  • 训练一个自编码器将输入数据重建,如果重建误差较大,则认为是离群值。
  • 自编码器适合处理高维数据或复杂模式的离群检测。

代码示例:

import torch
import torch.nn as nn
import torch.optim as optim# 数据集
data = torch.tensor([[10.0], [12.0], [11.0], [13.0], [300.0], [14.0], [15.0]])# 定义 Autoencoder
class Autoencoder(nn.Module):def __init__(self):super(Autoencoder, self).__init__()self.encoder = nn.Sequential(nn.Linear(1, 4),nn.ReLU(),nn.Linear(4, 2),nn.ReLU())self.decoder = nn.Sequential(nn.Linear(2, 4),nn.ReLU(),nn.Linear(4, 1))def forward(self, x):x = self.encoder(x)x = self.decoder(x)return x# 初始化模型和参数
model = Autoencoder()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)# 训练模型
epochs = 100
for epoch in range(epochs):optimizer.zero_grad()outputs = model(data)loss = criterion(outputs, data)loss.backward()optimizer.step()# 检测异常值
with torch.no_grad():predictions = model(data)mse = torch.mean((data - predictions) ** 2, dim=1)threshold = torch.quantile(mse, 0.95)  # 设定阈值outliers = data[mse > threshold]print("Outliers:", outliers)

4. 使用 Isolation Forest 检测离群值(借助 sklearn)

虽然 PyTorch 没有直接支持 Isolation Forest,但可以结合 sklearn 的 Isolation Forest 提取异常值后处理。

代码示例:

from sklearn.ensemble import IsolationForest
import torch# 示例数据
data = torch.tensor([[10], [12], [11], [13], [300], [14], [15]], dtype=torch.float)# 使用 Isolation Forest 模型
clf = IsolationForest(contamination=0.1, random_state=42)
predictions = clf.fit_predict(data)# 筛选离群值
outliers = data[predictions == -1]
print("Outliers:", outliers)

5. 使用基于密度的算法(DBSCAN)检测离群值

原理:

DBSCAN 根据密度聚类检测密度较低的数据点,这些点可能是离群值。

代码示例:

from sklearn.cluster import DBSCAN
import torch# 示例数据
data = torch.tensor([[10], [12], [11], [13], [300], [14], [15]], dtype=torch.float)# 使用 DBSCAN 模型
dbscan = DBSCAN(eps=3, min_samples=2)
labels = dbscan.fit_predict(data)# 筛选离群值
outliers = data[labels == -1]
print("Outliers:", outliers)

总结:

深度学习中存在异常值,并且会产生负面影响。可以使用以下方法进行处理:

  1. 低维数据: 可以直接使用 Z-Score 或 IQR 等统计方法检测异常值。
  2. 高维或复杂数据: 使用 Autoencoder 或 Isolation Forest 检测异常值。
  3. 密度分析: DBSCAN 更适合非线性分布或簇状数据的离群检测。

这些方法可以根据具体任务需求灵活选择和组合使用。

相关阅读

  • 什么是离群值?如何检测?
  • 文本分类中的离群值特征
  • 关于置信学习的文献综述(简易版)

相关文章:

深度学习中的离群值

文章目录 深度学习中有离群值吗&#xff1f;深度学习中的离群值来源&#xff1a;处理离群值的策略&#xff1a;1. 数据预处理阶段&#xff1a;2. 数据增强和鲁棒模型&#xff1a;3. 模型训练阶段&#xff1a;4. 异常检测集成模型&#xff1a; 如何处理对抗样本&#xff1f;总结…...

如何利用Logo设计免费生成器创建专业级Logo

在当今的商业世界中&#xff0c;一个好的Logo是品牌身份的象征&#xff0c;它承载着公司的形象与理念。设计一个专业级的Logo不再需要花费大量的金钱和时间&#xff0c;尤其是当我们拥有Logo设计免费生成器这样的工具时。接下来&#xff0c;让我们深入探讨如何利用这些工具来创…...

Mysql SQL 超实用的7个日期算术运算实例(10k)

文章目录 前言1. 加上或减去若干天、若干月或若干年基本语法使用场景注意事项运用实例分析说明2. 确定两个日期相差多少天基本语法使用场景注意事项运用实例分析说明3. 确定两个日期之间有多少个工作日基本语法使用场景注意事项运用实例分析说明4. 确定两个日期相隔多少个月或多…...

运算指令(PLC)

加 ADD 减 SUB 乘 MUL 除 DIV 浮点运算 整数运算...

「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

本篇教程将带你实现一个数字填色小游戏&#xff0c;通过简单的交互逻辑&#xff0c;学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能&#xff1a; 数字选择&#xff1a;用户点击…...

机器学习经典算法——逻辑回归

目录 算法介绍 算法概念 算法的优缺点 LogisticRegression()函数理解 环境准备 算法练习 算法介绍 算法概念 逻辑回归&#xff08;Logistic Regression&#xff09;是一种广泛应用于分类问题的机器学习算法。 它基于线性回归的思想&#xff0c;但通过引入一个逻辑函数&…...

【数据仓库金典面试题】—— 包含详细解答

大家好&#xff0c;我是摇光~&#xff0c;用大白话讲解所有你难懂的知识点 该篇面试题主要针对面试涉及到数据仓库的数据岗位。 以下都是经典的关于数据仓库的问题&#xff0c;希望对大家面试有用~ 1、什么是数据仓库&#xff1f;它与传统数据库有何区别&#xff1f; 数据仓库…...

【UE5 C++课程系列笔记】19——通过GConfig读写.ini文件

步骤 1. 新建一个Actor类&#xff0c;这里命名为“INIActor” 2. 新建一个配置文件“Test.ini” 添加一个自定义配置项 3. 接下来我们在“INIActor”类中获取并修改“CustomInt”的值。这里定义一个方法“GetINIVariable” 方法实现如下&#xff0c;其中第16行代码用于构建配…...

JS 中 json数据 与 base64、ArrayBuffer之间转换

JS 中 json数据 与 base64、ArrayBuffer之间转换 json 字符串进行 base64 编码 function jsonToBase64(json) {return Buffer.from(json).toString(base64); }base64 字符串转为 json 字符串 function base64ToJson(base64) {try {const binaryString atob(base64);const js…...

USB 驱动开发 --- Gadget 驱动框架梳理

编译链接 #----》 linux_5.10/drivers/usb/gadget/Makefileobj-$(CONFIG_USB_LIBCOMPOSITE) libcomposite.o libcomposite-y : usbstring.o config.o epautoconf.o libcomposite-y composite.o functions.o configfs.o u_f.oobj-$(CONFIG_USB_GADG…...

细说STM32F407单片机中断方式CAN通信

目录 一、工程配置 1、时钟、DEBUG、USART6、GPIO、CodeGenerator 2、CAN1 3、NVIC 二、软件设计 1、KEYLED 2、can.h 3、can.c &#xff08;1&#xff09;CAN1中断初始化 &#xff08;2&#xff09;RNG初始化和随机数产生 &#xff08;3&#xff09; 筛选器组设置…...

Python应用指南:高德交通态势数据

在现代城市的脉络中&#xff0c;交通流量如同流动的血液&#xff0c;交通流量的动态变化对出行规划和城市管理提出了更高的要求。为了应对这一挑战&#xff0c;高德地图推出了交通态势查询API&#xff0c;旨在为开发者提供一个强大的工具&#xff0c;用于实时获取指定区域或道路…...

医学图像分析工具01:FreeSurfer || Recon -all 全流程MRI皮质表面重建

FreeSurfer是什么 FreeSurfer 是一个功能强大的神经影像学分析软件包&#xff0c;广泛用于处理和可视化大脑的横断面和纵向研究数据。该软件由马萨诸塞州总医院的Martinos生物医学成像中心的计算神经影像实验室开发&#xff0c;旨在为神经科学研究人员提供一个高效、精确的数据…...

.NET框架用C#实现PDF转HTML

HTML作为一种开放标准的网页标记语言&#xff0c;具有跨平台、易于浏览和搜索引擎友好的特性&#xff0c;使得内容能够在多种设备上轻松访问并优化了在线分享与互动。通过将PDF文件转换为HTML格式&#xff0c;我们可以更方便地在浏览器中展示PDF文档内容&#xff0c;同时也更容…...

mamba-ssm安装

注意1&#xff1a;mamba-ssm要与casual-conv1d一起安装。 注意2&#xff1a;mamba-ssm与cuda、pytorch版本要对应。需要看你下载的代码的requirements.txt causal-conv1d与mamba的whl包官网下载&#xff1a; https://github.com/Dao-AILab/causal-conv1d/releases?page3 htt…...

网络IP协议

IP&#xff08;Internet Protocol&#xff0c;网际协议&#xff09;是TCP/IP协议族中重要的协议&#xff0c;主要负责将数据包发送给目标主机。IP相当于OSI&#xff08;图1&#xff09;的第三层网络层。网络层的主要作用是失陷终端节点之间的通信。这种终端节点之间的通信也叫点…...

双指针算法详解

目录 一、双指针 二、双指针题目 1.移动零 解法&#xff1a; 代码&#xff1a; 2.复写零 ​编辑 解法&#xff1a; 代码&#xff1a; 边界情况处理: 3.快乐数 ​编辑 解法:快慢指针 代码&#xff1a; 4.盛水最多的容器 解法&#xff1a;&#xff08;对撞指针&#xff09;…...

MySQL的最左匹配原则是什么

最左匹配原则是应用于联合索引的规则。 对于以下表F&#xff1a;f1&#xff0c;f2&#xff0c;f3&#xff1b;建立了联合索引&#xff08;f2&#xff0c;f3&#xff09;&#xff0c;那么我们在查询的时候如果是&#xff1a; select * from F where f2 ? and f3 ?; 或 sele…...

LeetCode:106.从中序与后序遍历序列构造二叉树

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;106.从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder …...

22. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--切换主币种

这篇文章我们将结合主币种设置以及收支记录实现切换主币种后重新计算以前记录的转换后的金额。那么&#xff0c;为什么要在切换主币种后要重新计算转换后的金额呢&#xff1f;有以下两个原因&#xff1a; 统一的币种&#xff0c;方便我们统计数据方便用户按照当地的币种查看收…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...