当前位置: 首页 > 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;方便我们统计数据方便用户按照当地的币种查看收…...

01.02周四F34-Day43打卡

文章目录 1. 地是湿的。昨晚估计下雨了。2. 你可能把包丢在餐厅里了吧?3. 她说他可能误了航班。4. 我本来应该早点来的,但路上特别堵。5. 约翰可能在那次事故中受了重伤。6. 这是一个情景对话7. 我本可以走另一条路的。8. 我准是瘦了不少,你看我这裤子现在多肥。9. 钱没了!会…...

行业商机信息付费小程序系统开发方案

行业商机信息付费小程序系统&#xff0c;主要是整合优质行业资源&#xff0c;实时更新的商机信息。在当今信息爆炸的时代&#xff0c;精准、高效地获取行业商机信息对于企业和个人创业者而言至关重要。 一、使用场景 日常浏览&#xff1a;用户在工作间隙或闲暇时间&#xff0c…...

cut-命令详解

一、命令 1.cut列截取命令 cut命令的默认分隔符是制表符 2.参数&#xff1a; -f 列号 #提取第几列-d 分隔符 #按照指定分隔符分割列-c 字符范围 #不依赖分隔符来区分列&#xff0c;而是通过字符范围&#xff08;行首为0&#xff09;来进行字段提取。“n-”表…...

Apache MINA 反序列化漏洞CVE-2024-52046

漏洞描述&#xff1a; Apache MINA 是一个功能强大、灵活且高性能的网络应用框架。它通过抽象网络层的复杂性&#xff0c;提供了事件驱动架构和灵活的 Filter 链机制&#xff0c;使得开发者可以更容易地开发各种类型的网络应用。 Apache MINA 框架的 ObjectSerializationDeco…...

二、AI知识(神经网络)

二、AI知识&#xff08;神经网络&#xff09; 1.常用算法 FNN CNN RNN LSTM DNN GRU 2.深度学习中概念及算法 1. 感知机 感知机&#xff08;Perceptron&#xff09;是一种最早的人工神经网络模型之一&#xff0c;通常用来解决二分类问题。它由弗兰克罗森布拉特&#…...

node.js之---子线程(child_process)模块

为什么需要子线程&#xff08;child_process&#xff09;模块 Worker Threads 的基本概念 如何使用 Worker Threads Worker Threads 的性能 Worker 线程的优势和限制 进阶用法&#xff1a;共享内存 为什么需要子线程&#xff08;child_process&#xff09;模块 在 Node.js…...

Json字符串解析失败

通过第三方服务&#xff0c;拿到响应体的data对象&#xff08;拿到的时候对象是有值的&#xff09; 通过JSON.parseObject方法&#xff0c;拿到的对象&#xff0c;值为null 通过查看对应的json字符串&#xff0c;发现命名不一样... JSONField SeriealizedName注解是用来解析j…...

LeetCode算法题——螺旋矩阵ll

题目描述 给你一个正整数n&#xff0c;生成一个包含1到n2所有元素&#xff0c;且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix 。 示例 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]题解 思路&#xff1a; 将整个过程分解为逐圈填充的过程&#xf…...

【开源社区openEuler实践】hpcrunner

title: 探索 Hpcrunner&#xff1a;高性能计算的得力助手 date: ‘2024-12-31’ category: blog tags: Hpcrunner高性能计算任务调度资源优化 sig: HPC archives: ‘2024-12’ author:way_back summary: Hpcrunner 作为高性能计算领域的一款实用工具&#xff0c;专注于优化任务…...

linux下安装达梦数据库v8详解

目录 操作系统、数据库 1、下载达梦数据库 2、安装前准备 2.1、建立数据库用户和组 2.2、修改文件打开最大数 2.3、挂载镜像 2.4、新建安装目录 3、数据库安装 4、配置环境变量 5、初始化数据库实例 6、注册服务 7、使用数据库 8、卸载数据库 9、多实例管理 10、…...