【发布时间】: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