Scipy python 中的趋势

Scipy Detrend in python

我使用 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 模型在去除趋势的数据集上表现非常好。

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

有没有一种方法可以让我读取均值并重新归一化以获得我可以解释的 'meanful dataset'。例如,我的数据集有一个降雨量变量。所以每个月我都可以看到下了多少雨。但是当我去除趋势时,降雨量值不再是实际降雨量值。当我进行预测时,我希望能够说这个月下了 200 毫米的雨,但我的预测并没有告诉我这一点,因为数据已经被去趋势化了。

如有任何帮助,我们将不胜感激。

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

If type == 'constant', only the mean of data is subtracted.

源代码证实了这一点。检查输入后,整个计算在一行中完成 (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

您可以将平均值保存到文件中,或者用它做任何您想做的事。要"retrend",只需将均值加回去:

point = prediction + mean

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

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

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

point = prediction * max + mean

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