【问题标题】:Stratified Cross validation of timeseries data时间序列数据的分层交叉验证
【发布时间】:2018-03-23 18:04:07
【问题描述】:

我想根据组(grp 列)进行时间序列交叉验证。在下面的示例数据中,温度是我的目标变量

import numpy as np
import pandas as pd
timeS=pd.date_range(start='1980-01-01 00:00:00', end='1980-01-01 00:00:05', 
freq='S')
df = pd.DataFrame(dict(time=timeS, grp=['A']*3 + ['B']*3, material=[1,2,3]*2,
temperature=['2.4','5','9.9']*2))


    grp material    temperature    time
0   A   1       2.4                1980-01-01 00:00:00
1   A   2       5                  1980-01-01 00:00:01
2   A   3       9.9                1980-01-01 00:00:02
3   B   1       2.4                1980-01-01 00:00:03
4   B   2       5                  1980-01-01 00:00:04
5   B   3       9.9                1980-01-01 00:00:05

我计划使用此代码添加一些基于 grp 的滞后功能。

df.groupby("grp")['temperature'].shift(-1)
0      5
1    9.9
2    NaN
3      5
4    9.9
5    NaN
Name: temperature, dtype: object

我现在遇到的问题是,当我进行交叉验证时,我可以使用 sklearn sklearn.model_selection.TimeSeriesSplit 中的这个函数,但它没有考虑到组效应。谁能告诉我如何按组进行 CV 拆分(如分层拆分)?如果有帮助,我将使用 xgboost.cv 作为 cv。

编辑:每组的时间变化。时间在组内均匀(每秒)增加

【问题讨论】:

  • 您是否找到了解决方案,因为我自己也在寻找一种方法?
  • 在按时间对组进行排序并采样最后几行进行验证后,我并不是真的手动循环遍历每个组。这是一个非常耗时的过程
  • 啊,所以您将数据放在拆分中以获得足够的比例?是的,如果您有大量数据,这将起作用。
  • 看起来在这个问题之后有人问了类似的问题,得到了一些答案:stackoverflow.com/q/51963713/7619676

标签: python pandas scikit-learn time-series cross-validation


【解决方案1】:

以下应该做到这一点:

    series = Series.from_csv('yourfile.csv', header=0)
    X = series.values
    n_train = 500
    n_records = len(X)
    for i in range(n_train, n_records):
        train, test = X[0:i], X[i:i+1]
        print('train=%d, test=%d' % (len(train), len(test)))

【讨论】:

  • 这是如何解释分层的?此解决方案甚至不查看组分区。
猜你喜欢
  • 2019-01-28
  • 1970-01-01
  • 2018-10-10
  • 2020-07-20
  • 2016-10-01
  • 2016-12-06
  • 2012-05-11
  • 2016-02-28
  • 1970-01-01
相关资源
最近更新 更多