【问题标题】:Split time series with multiple records per day每天有多个记录的拆分时间序列
【发布时间】:2022-10-19 04:48:58
【问题描述】:

我有一个每日交易数据集,其中每天有多条记录。我需要将其拆分为不同的交叉验证折叠来训练 ML 模型,但是我不能使用 sklearn 中的 TimeSeriesSplit,因为每天有多个事务。你知道我怎么能在python中做到这一点吗?

【问题讨论】:

  • 如果记录是按时间戳排序的,原则上你仍然可以使用TimeSeriesSplit,在按时间戳排序后......你会在训练和测试中都有同一天的记录,但重要的是训练集中的记录的时间戳低于测试集中的记录。如果您想避免在训练和测试中出现同一天的记录,那么:如果每天的记录数不变,您仍然可以使用TimeSeriesSplit。如果它是可变的,你可以将天转换为元组,将一个元组列表传递给TimeSeriesSplit,然后再转换回来?
  • 谢谢回复。但是,我怎样才能控制测试大小呢?我想实现滚动窗口方法。因此,我需要将每天的交易彼此分开
  • 您能否提供一个输入数据和所需输出的小示例?这将有助于澄清您的问题并提出解决方案。
  • import numpy as np import pandas as pd data = np.array([['DAY_1','afds',5], ['DAY_1','rtws', 4], ['DAY_1','gtssd', 2], ['DAY_2','ititl', 4], ['DAY_2','uius', 7], ['DAY_3','hyaah', 6], ['DAY_4','apsaj', 9]]) df = pd.DataFrame(data,columns=['DATEDAY','TRANSACTION_ID','PRICE']) df
  • 因此,考虑到该示例,我需要使用 DAY_1 和 DAY_2 中的行进行训练,然后使用 DAY_3 进行测试。然后使用 DAY_1、DAY_2 和 DAY_3 进行训练,使用 DAY_4 进行测试。感谢您的帮助@JauA

标签: python machine-learning scikit-learn time-series cross-validation


【解决方案1】:

输入数据:

import numpy as np
import pandas as pd
data = np.array(
    [['DAY_1','afds',5],
     ['DAY_1','rtws', 4],
     ['DAY_1','gtssd', 2],
     ['DAY_2','ititl', 4],
     ['DAY_2','uius', 7],
     ['DAY_3','hyaah', 6],
     ['DAY_4','apsaj', 9]])
df = pd.DataFrame(data,columns=['DATEDAY','TRANSACTION_ID','PRICE'])

结果df:

        TRANSACTION_ID PRICE
DATEDAY
DAY_1             afds     5
DAY_1             rtws     4
DAY_1            gtssd     2
DAY_2            ititl     4
DAY_2             uius     7
DAY_3            hyaah     6
DAY_4            apsaj     9

解决方案:

from sklearn.model_selection import TimeSeriesSplit

tscv = TimeSeriesSplit(2)
for train_index, test_index in tscv.split(days):
    print ('------------------------------')
    train_days, test_days = days[train_index], days[test_index]
    X_train, X_test = df.loc[train_days], df.loc[test_days]
    print ('train:', X_train, '
')
    print ('test:', X_test, '
')

输出:

------------------------------
train:         TRANSACTION_ID PRICE
DATEDAY
DAY_1             afds     5
DAY_1             rtws     4
DAY_1            gtssd     2
DAY_2            ititl     4
DAY_2             uius     7

test:         TRANSACTION_ID PRICE
DATEDAY
DAY_3            hyaah     6

------------------------------
train:         TRANSACTION_ID PRICE
DATEDAY
DAY_1             afds     5
DAY_1             rtws     4
DAY_1            gtssd     2
DAY_2            ititl     4
DAY_2             uius     7
DAY_3            hyaah     6

test:         TRANSACTION_ID PRICE
DATEDAY
DAY_4            apsaj     9

注1:我们假设日期列可以排序。在此示例中,DAY_X 排序不好,例如,因为 DAY_11 会放在 DAY_2 之前。如果我们只知道当天的数字X,那么我们需要在列中输入X,而不是DAY_X,例如,我们可能会这样做:

df['DATEDAY'] = [int(x.split('_')[1]) for x in df['DATEDAY']]

注意2:如果我们想避免将DATEDAY作为数据帧的索引,我们可以简单地重置X_trainX_test的索引:

for train_index, test_index in tscv.split(days):
    print ('------------------------------')
    train_days, test_days = days[train_index], days[test_index]
    X_train, X_test = df.loc[train_days].reset_index(), df.loc[test_days].reset_index()
    print ('train:
', X_train, '
')
    print ('test:
', X_test, '
')

输出:

------------------------------
train:
   DATEDAY TRANSACTION_ID PRICE
0   DAY_1           afds     5
1   DAY_1           rtws     4
2   DAY_1          gtssd     2
3   DAY_2          ititl     4
4   DAY_2           uius     7

test:
   DATEDAY TRANSACTION_ID PRICE
0   DAY_3          hyaah     6

------------------------------
train:
   DATEDAY TRANSACTION_ID PRICE
0   DAY_1           afds     5
1   DAY_1           rtws     4
2   DAY_1          gtssd     2
3   DAY_2          ititl     4
4   DAY_2           uius     7
5   DAY_3          hyaah     6

test:
   DATEDAY TRANSACTION_ID PRICE
0   DAY_4          apsaj     9

【讨论】:

    猜你喜欢
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2016-09-07
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多