气体消耗异常值检测 - 神经网络项目。结果不好

数据挖掘 神经网络 离群值
2021-10-06 06:33:59

我试图检测一些荷兰建筑的能源消耗中的异常值,建立一个神经网络模型。我的结果很糟糕,但我找不到原因。

我不是专家,所以我想问你我可以改进什么以及我做错了什么。这是完整的描述:https ://github.com/denadai2/Gas-consumption-outliers 。

神经网络是具有反向传播的前馈网络。如此处所述我将数据集拆分为 41'000 行、9 个特征的“小”数据集,并尝试添加更多特征。

我训练了网络,但结果有 14.14 RMSE,所以它不能很好地预测气体消耗,连续我不能运行一个好的异常值检测机制。我在一些论文中看到,即使他们预测每天或每小时的电力消耗,他们也会有像 MSE = 0.01 这样的错误。

我可以改进什么?我究竟做错了什么?你能看看我的描述吗?

4个回答

只是一个想法 - 您的数据是高度季节性的:每天和每周的周期非常明显。所以首先,试着分解你的变量(燃气和电力消耗、温度和太阳辐射)。这是一个关于 R 时间序列分解的不错的教程。

在获得趋势和季节性成分之后,最有趣的部分开始了。这只是一个假设,但我认为,通过时间序列分析(例如, ARIMA 模型,天然气和电力消耗变量是可以预测的。从我的角度来看,这里最令人兴奋的部分是尝试使用可用数据(温度异常、太阳辐射、风速)来预测分解后的残差。我想,这些残差将是异常值,您正在寻找。希望,你会发现这很有用。

在你的训练笔记本中,你展示了 20 个 epoch 的训练结果。您是否尝试过改变该参数,看看它是否会影响您的性能?这是反向传播的一个重要参数。

正如用户 tomaskazemekas 指出的那样,为了估计您的模型参数,绘制学习曲线是一种非常好的方法。除此之外,您还可以使用模型参数(例如训练时期或隐藏层大小)与训练和验证错误创建图。这将使您了解偏差/方差的权衡,并帮助您为参数选择一个好的值。一些信息可以在这里找到自然,为(第三个)测试集保留一小部分数据是个好主意。

附带说明一下,增加模型中的神经元数量似乎对您的 RMSE 没有显着改善。这表明您也可以尝试使用更简单的模型,即使用更少的神经元并查看模型的行为。

事实上,我建议(如果您还没有这样做的话)首先尝试一个参数很少或没有参数的简单模型,例如线性回归,然后将您的结果与文献进行比较,就像一个健全性检查一样。

这里的主要问题是,即使在尝试应用异常检测算法之前,您也无法使用神经网络获得足够好的气体消耗预测。

如果这里的主要目标是达到可以使用异常检测算法的阶段,并且您声明您可以访问成功应用线性回归解决此问题的示例,那么这种方法可能会更有效率。机器学习成功应用的原则之一是,在根据结果进行最终选择之前,可以尝试几种不同的算法。

如果您选择调整您的神经网络性能,则可以使用学习曲线绘制不同超参数的变化对错误率的影响。可以修改的超参数有:

  • 特征数
  • 多项式的阶
  • 正则化参数
  • 网络中的层数

可以通过交叉验证集的性能来选择最佳设置。

在你的笔记本中,我没有看到你的神经网络模型,你能指出使用的是哪个库,你有多少层以及你使用的是什么类型的神经网络?

在您的笔记本中,您似乎正在使用嘈杂和异常值的数据集来训练神经网络,我认为您应该在没有任何异常值的数据集上训练神经网络,以便您可以看到与预测的观察距离神经网络来标记观察是否异常值。

我写几篇关于时间序列信号中异常值检测的文章,你的数据是高度季节性的,正如sobach提到的,你可以使用 FFT(上面的第一个链接)来获取信号的整体趋势。得到gas消耗中的频率成分后,可以查看高频成分来获取异常值。

此外,如果您想坚持使用神经网络来处理季节性数据,您可能需要检查循环神经网络,因为它们可以比普通神经网络更好地结合过去的观察结果,并且可以为您拥有的数据提供更好的结果.