【问题标题】:Scikit-learn labeled dataset creation from segmented time series从分段时间序列创建 Scikit-learn 标记数据集
【发布时间】:2015-08-16 05:50:17
【问题描述】:

简介

我有一个代表不同用户(即 user1 和 user2)的分段时间序列的 Pandas DataFrame。我想用提到的 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 的 dict,但是由于它们是段而不只是列表,我该如何塑造我的数据呢?

我无法确定我的段是否适合 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的意思。 在时间序列模式识别中,为了隔离有意义的片段,分割可能很有用。 在测试时,我想识别片段而不是整个系列,因为系列相当长,片段在我的上下文中应该是有意义的。

请看基于“An Online Algorithm for Segmenting Time Series”的this implementation 中的以下示例。 我的 segID 只是一个代表块 id 的列。

【问题讨论】:

  • 您到底想预测什么?是segIDusername 还是两者兼而有之?
  • 我想做username预测
  • 好的,那么您是否希望将segID 用作功能(与voltage 一起)?
  • 我不确定...我需要segID,因为我会尝试模式匹配给定的voltage 数组。所以我必须考虑(最终不完整)segmentsvoltage 值数组)

标签: python pandas dataset scikit-learn classification


【解决方案1】:

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

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

目标:

当你想从一个离散的用户名池中预测一个用户时,你有一个分类问题,你的目标将是一个带有np.unique(y) == ['user1', 'user2', ...]的向量

特点

您的特征是您为每个标签/用户/目标提供 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 本身是一个时间序列,您还需要将其编码为固定长度信息,例如所有可能值的直方图/计数、最常见值等

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

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

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

请记住,这只是一种可能的方法。有时问一下很有用,在预测时我将获得哪些信息,以便我找到我正在查看的用户,以及为什么这些信息会导致给定用户?

【讨论】:

  • 这个答案真的很全面
猜你喜欢
  • 1970-01-01
  • 2019-11-12
  • 2016-10-01
  • 2018-12-06
  • 2015-06-22
  • 2015-04-14
  • 2016-07-13
  • 2014-04-20
  • 2017-07-14
相关资源
最近更新 更多