深度学习中有离群值吗?
是的,和许多刚刚打仗深度学习的工程师默认的不一样的是——
深度学习中也会碰到
离群值(Outliers)。这些非常值大概存在于输入数据或标签中,并对模子的练习和推测结果产生负面影响。
深度学习中的离群值泉源:
- 输入特性非常:
- 数据收罗错误(比方传感器故障或录入错误)。
- 数据预处理处罚错误或特性缩放题目。(这些错误乃至大概是模子练习者本身举行错误的数据增强造成的)
- 标签非常:
- 手动标注错误(比方分类错误的标签,在一些著名的开源数据会集,偶尔也会存在这类题目)。在一篇新论文中,麻省理工 CSAIL 和亚马逊的研究者对 10 个主流呆板学习数据集的测试集睁开了研究,发现它们的匀称错误率竟高达 3.4%。此中,最著名的 ImageNet 数据集的验证会集至少存在 2916 个错误,错误率为 6%;QuickDraw 数据会集至少存在 500 万个错误,错误率为 10%。论文链接:https://arxiv.org/pdf/2103.14749.pdf
- 噪声或非常样本影响练习数据集。
- 特性空间毛病:
- 对抗样本:
- 特意计划的输入,导致模子错误分类或输出非常结果(比方对抗攻击)。
处理处罚离群值的计谋:
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]
怎样处理处罚对抗样本?
- 对抗练习: 使用天生对抗样本增强模子鲁棒性。
- 正则化束缚: 如 FGSM(Fast Gradient Sign Method)等方法进步模子的稳固性。
- 检测机制: 在输入层增长检测模块,过滤非常输入。
总结:
深度学习中的离群值大概泉源于输入特性或标签的非常分布,对模子练习和推测精度产生负面影响。因此,可以通过
数据预处理处罚、鲁棒丧失函数、正则化、数据增强和非常检测模子等方法低沉其影响。同时,对于更复杂的题目如
对抗样本,须要额外计划防御机制来掩护模子
安全性。
别的如今也有专门用于处理处罚数据集标注错误的深度学习模子,有爱好的朋侪可以去自行相识一下。
关键字:置信学习。可参考阅读: 关于置信学习的文献综述(浅易版)
可以或许使用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)
总结:
深度学习中存在非常值,而且会产生负面影响。可以使用以下方法举行处理处罚:
- 低维数据: 可以直接使用 Z-Score 或 IQR 等统计方法检测非常值。
- 高维或复杂数据: 使用 Autoencoder 或 Isolation Forest 检测非常值。
- 密度分析: DBSCAN 更恰当非线性分布或簇状数据的离群检测。
这些方法可以根据具体任务需求机动选择和组合使用。
相干阅读
- 什么是离群值?怎样检测?
- 文天职类中的离群值特性
- 关于置信学习的文献综述(浅易版)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。