Scikit-从分段时间序列中学习标记的数据集创建

时间:2015-06-02 12:26:00

标签: python pandas dataset scikit-learn classification

INTRO

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

我们举个例子,其中 user1 user2 都有2个细分: 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

n_samples * n_features

问题:

scikit-learn dataset API说要创建一个包含数据目标的dict,但是我如何塑造我的数据,因为它们是细分而不仅仅是列表?

我无法弄清楚我的片段是否符合{ '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') } 结构。 我有两个想法:

1)每个数据样本都是一个代表某个细分的列表,另一方面, target 对于每个数据都不同条目,因为它们已分组。那么 target_names 呢?这可行吗?

df.values

2) 数据(简称){ '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') } 返回的nparray。 target 包含每个用户不同的细分ID ....这有意义吗?

segID

我认为主要的问题是我无法弄清楚要用作标签......

编辑:

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

根据“this implementation”查看An Online Algorithm for Segmenting Time Series中的以下示例。 我的$('#listItemCss>li').click(function() { var cid = $(this).find('.cssId').val(); console.log(cid); }); 只是一个代表块的id的列。

segmented time series

1 个答案:

答案 0 :(得分:2)

这不是微不足道的,可能有几种方法可以通过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,依此类推。

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