【问题标题】:Scipy Detrend in pythonpython中的Scipy Detrend
【发布时间】:2020-05-03 12:33:23
【问题描述】:

我使用 scipy.signal.detrend

中的以下代码在 python 中去除了我的数据
detrended =signal.detrend(feature, axis=-1, type='constant', bp=0, overwrite_data=True)
np.savetxt('constant detrend.csv', detrended, delimiter=',', fmt='%s')

最后一行将数据保存到 csv 文件中,然后我重新加载这些数据以运行一些模型。我发现我的 RandomForest 模型在去趋势数据集上表现得非常好。

接下来将使用此模型进行预测。但是,我有点不确定如何从去趋势数据集转移到我可以理解的更有意义的数据集。据我了解,去趋势消除了平均值并使数据标准化。但是,如果我做我的预测,我需要能够看到我的预测的实际数字,而不是去趋势的数字。

有没有办法我可以读取平均值并重新规范化以获得我可以解释的“有意义的数据集”。例如,我的数据集有一个降雨变量。所以每个月我都能看到下了多少雨。但是当我去趋势时,降雨值不再是实际降雨值。当我做出预测时,我想能够说这个月下雨了 200 毫米,但我的预测并没有告诉我这一点,因为数据已被去趋势化。

我们将不胜感激。

【问题讨论】:

  • 您能分享一下您想象的“重新趋势”数据会是什么样子吗?我最关心的是输入数据的形状样本以及您将做出的预测。

标签: python scipy forecasting


【解决方案1】:

根据文档,detrend 只是从数据中删除最小二乘线拟合。当您使用type='constant' 时,它会更简单,因为它只是消除了平均值:

如果type == 'constant',只减去data的平均值。

源代码证明了这一点。检查输入后,整个计算在一行中完成(scipy/signal/signaltools.py, line 3261):

 ret = data - np.expand_dims(np.mean(data, axis), axis)

考虑到它的简单程度,获得减法平均值的最简单方法是手动执行计算。

mean = np.mean(feature, axis=-1, keepdims=True)
detrended = feature - mean

您可以将平均值保存到文件中,或者对它进行任何其他操作。要“退缩”,只需将均值加回来:

point = prediction + mean

如果你有其他一些你关心的操作,比如标准化到最大值,你可以用同样的方式处理它。

max = np.amax(detrended, axis=-1, keepdims=True)
detrended /= max

在这种情况下,您必须在抵消重新趋势之前乘以:

point = prediction * max + mean

像这样的简单操作很容易手工复制。更复杂的函数可能难以可靠地重现,但也更有可能返回它使用的参数,至少是可选的。

【讨论】:

  • 感谢@Mad Physicist。但是mean = np.mean(feature, axis=-1, keepdims=True) detrended = feature - mean 行是按行而不是按列删除平均值。每列都是一个不同的特征,所以我需要它根据列的平均值而不是行的平均值来删除平均值
  • 我采用行均值还是列均值有区别吗?
  • @Tamarie 在所有情况下您都应该使用axis=<whatever you need>。如果您的列表示,请设置axis=0-1 只取最后一个轴,留下行。在此处查看示例:ideone.com/XOEVpe
  • @Tamarie。这取决于你在做什么。您当前的示例显示axis=-1。你的评论说你想要axis=0。你想做什么完全取决于你。当然,你如何做会有所不同,但只有你知道你的数据最终意味着什么。
  • @Tamarie。我很高兴它对你有用。数据分析可以是真正的 PITA
猜你喜欢
  • 1970-01-01
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 2011-12-29
  • 1970-01-01
相关资源
最近更新 更多