深度学习中的离群值

文章目录

深度学习中有离群值吗?

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


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

  1. 输入特征异常:

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

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

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

  3. 特征空间偏差:

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

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

处理离群值的策略:

1. 数据预处理阶段:

(a) 可视化分析

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

(b) 统计检测法

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

© 清洗数据

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

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

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

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

(b) 使用鲁棒模型:

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

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

3. 模型训练阶段:

(a) Early Stopping 和正则化:

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

(b) Dropout 技术:

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

4. 异常检测集成模型:

(a) 使用孤立森林或 LOF 检测异常值:

在深度学习之前,可以结合机器学习算法先检测异常样本,再将清洗后的数据输入深度学习模型。

(b) 使用自动编码器(Autoencoder):

训练一个自编码器重建输入数据,计算重建误差来检测异常值。

python 复制代码
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),则认为是离群值。

代码示例:

python 复制代码
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 的范围。

代码示例:

python 复制代码
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)检测离群值

原理:

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

代码示例:

python 复制代码
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 提取异常值后处理。

代码示例:

python 复制代码
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 根据密度聚类检测密度较低的数据点,这些点可能是离群值。

代码示例:

python 复制代码
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 更适合非线性分布或簇状数据的离群检测。

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

相关阅读

相关推荐
计算机科研之友(Friend)35 分钟前
【图像处理】数据集合集!
图像处理·人工智能·机器学习·计算机视觉·数据挖掘·人机交互
AI探索家_星海算力42 分钟前
如何配置【Docker镜像】加速器+【Docker镜像】的使用
运维·人工智能·docker·容器·gpu算力
Kai HVZ1 小时前
《OpenCV》——模版匹配
人工智能·opencv·计算机视觉
Ava的硅谷新视界1 小时前
DeepSeek重新定义“Open“AI
人工智能·语言模型
深鱼~1 小时前
【多线程初阶篇¹】线程理解| 线程和进程的区别
java·开发语言·人工智能·深度学习·计算机视觉
Mr.Winter`1 小时前
无人船 | 图解推导三自由度USV的运动学和动力学建模
人工智能·机器人·ros·无人船
chian-ocean2 小时前
循环神经网络指南:构建强大序列模型的秘密
人工智能·rnn·深度学习
happybasic2 小时前
通过纯文字引导DeepSeek编写一个简单的中国象棋引擎~
人工智能·python·中国象棋·deepseek
夜幕龙3 小时前
Dexcap复现代码数据预处理全流程(四)——demo_clipping_3d.py
人工智能·python·机器人
电子基础知识5 小时前
NanoEdge AI Studio入门
人工智能·硬件工程