从分段时间序列创建 Scikit-learn 标记数据集

Scikit-learn labeled dataset creation from segmented time series

简介

我有一个 Pandas DataFrame,代表不同用户(即 user1 和 user2)的 分段 时间序列。我想用提到的 DataFrame 训练一个 scikit-learn 分类器,但我无法理解我必须创建的 scikit-learn 数据集的形状。 由于我的系列是分段的,因此我的 DataFrame 有一个 'segID' 列,其中包含特定分段的 ID。我将跳过分段的描述,因为它是由 an algorithm.

提供的

让我们举个例子,其中 user1user2 都有 2 个段:print df

        username  voltage        segID  
0       user1     -0.154732      0  
1       user1     -0.063169      0  
2       user1      0.554732      1  
3       user1     -0.641311      1  
4       user1     -0.653732      1  
5       user2      0.446469      0  
6       user2     -0.655732      0  
7       user2      0.646769      0  
8       user2     -0.646369      1  
9       user2      0.257732      1  
10      user2     -0.346369      1

问题:

scikit-learn dataset API 说要创建一个包含 datatarget 的字典,但是我该如何调整我的数据,因为它们是细分而不仅仅是列表?

我无法弄清楚我的片段是否适合 n_samples * n_features 结构。 我有两个想法:

1) 每个 data 样本是一个表示段的列表,另一方面,target 对于每个 data 条目都是不同的,因为它们是分组的。 target_names呢?这行得通吗?

{
    'data': array([
        [[-0.154732, -0.063169]],
        [[ 0.554732, -0.641311, -0.653732],
        [[ 0.446469, -0.655732, 0.646769]],
        [[-0.646369, 0.257732, -0.346369]]
        ]), 
    'target': 
        array([0, 1, 2, 3]),
    'target_names': array(['user1seg1', 'user1seg2', 'user2seg1', 'user2seg2'], dtype='|S10')

}

2) data 是(简单地)由 df.values 返回的 nparray。 target 包含每个用户不同的细分 ID.... 有意义吗?

{
    'data': array([
        [-0.154732],
        [-0.063169],
        [ 0.554732],
        [-0.641311],
        [-0.653732],
        [ 0.446469],
        [-0.655732],
        [ 0.646769],
        [-0.646369],
        [ 0.257732],
        [-0.346369]
        ]), 
    'target': 
        array([0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]),
    'target_names': array(['user1seg1', 'user1seg1', 'user1seg2', 'user1seg2', .....], dtype='|S10')
}

我认为主要问题是我不知道用什么作为标签...

编辑:

好的,很清楚...标签是由我的基本事实给出的,它们只是用户名。 elyase 的回答正是我要找的。 为了更好的说明问题,我在这里解释一下segID的含义。 在时间序列模式识别中,为了隔离有意义的片段,分割可能很有用。 在测试时,我想识别片段而不是整个系列,因为系列相当长,片段在我的上下文中应该是有意义的。

请查看来自 this implementation based on "An Online Algorithm for Segmenting Time Series 的以下示例。 我的 segID 只是一个代表块 ID 的列。

这不是微不足道的,可能有几种方法可以制定 ML 算法使用的问题。您应该尝试所有这些,然后找出如何获得最佳结果。

正如您已经发现的那样,您需要两个东西,一个形状为 n_samples * n_features 的矩阵 X 和一个长度为 'n_samples' 的列向量 y。让我们从目标 y.

开始

目标:

当您想从离散的用户名池中预测用户时,您遇到了分类问题,您的目标将是具有 np.unique(y) == ['user1', 'user2', ...]

的向量

特征

您的特征是您为每个 label/user/target 提供的 ML 算法的信息。不幸的是,大多数算法要求此信息具有固定长度,但可变长度时间序列不适合这种描述。所以如果你想坚持经典算法,你需要一些方法来将用户的时间序列信息压缩成一个固定长度的向量。一些可能性是平均值、最小值、最大值、总和、第一个值、最后一个值、直方图、光谱功率等。您需要想出对给定问题有意义的那些。

因此,如果您忽略 SegID 信息,您的 X 矩阵将如下所示:

y/features 
           min max ... sum 
user1      0.1 1.2 ... 1.1    # <-first time series for user 1
user1      0.0 1.3 ... 1.1    # <-second time series for user 1
user2      0.3 0.4 ... 13.0   # <-first time series for user 2

由于 SegID 本身是一个时间序列,您还需要将其编码为固定长度的信息,例如所有可能值的 histogram/counts,最常见的值等

在这种情况下,您将拥有:

y/features 
           min max ... sum segID_most_freq segID_min
user1      0.1 1.2 ... 1.1 1               1
user1      0.3 0.4 ... 13  2               1
user2      0.3 0.4 ... 13  5               3

该算法将查看此数据并将 "think":所以对于 user1,最小 segID 始终为 1 因此,如果我看到一个用户预测时间,其时间序列的最小 ID 为 1,那么它应该是user1。如果它在 3 左右,则可能是 user2,依此类推。

请记住,这只是一种可能的方法。有时问一问很有用,在预测时间我会有什么信息可以让我找到哪个用户是我看到的那个用户,为什么这个信息会导致给定的用户?