当我有太多但又需要所有数据时,如何预处理我的数据?

How do I preprocess my data when I have too much but need it all?

我刚从大学毕业几个月,获得了 CS 学士学位,我的老板要我构建一个机器学习代理,以便在两个月内由我自己从头开始 class 将数据分为 23 个类别。我只学习了 AI 简介 class,我们甚至没有介绍神经网络。我想我已经掌握了基础知识,但是我在准备数据以输入模型时遇到了问题。

请随意评论此问题的(不)可行性,但这是上下文信息,而不是我的问题所在。我拥有的 powerstrip 型设备的数据类型示例是 1 列 DeviceID(数字串,每个设备唯一),12 列各种整数,指示正在使用哪些插座以及正在拉动多少功率,以及一个与设备所在位置相关的整数。我有大量此类数据,我一直在想我可以使用带有 softmax 层的 RNN 来分类到我的类别中。这将是监督学习。提到的列将是输入,1-23 的整数将是输出。我需要模型查看时间范围并对其进行分类,其中包括不同数量的行,因为设备数量不同,并且每个设备每分钟创建两次行。例如,

ID      1   2   3   4   5   RSSI Temperature R_ID TimeStamp
43713   0   0   0   0   118 -82   97         45   2019-08-27 15:38:00.387
49945   0   0   5   0   0   -88   89         45   2019-08-27 15:38:00.493
43711   0   0   0   0   5   -65   120        45   2019-08-27 15:38:00.557
43685   12  4   0   0   0   -76   110        45   2019-08-27 15:38:01.807
44041   0   0   0   12  0   -80   104        45   2019-08-27 15:38:02.277

我的问题是:对于我从我们的 SQL 数据库中提取的一个 35 分钟的样本时间范围——时间范围可以从 1 分钟到几个小时不等——我得到了 3,747 个不同的行。这显然无法将模型作为 1 个样本提供。如果 powerstrip 上的使用从 1 分钟到下一分钟没有变化,它将创建几行相同的行,除了时间戳。当我删除时间戳时,我得到了 333 个不同的行。这看起来仍然很多,而且它正在删除必要的时间数据。

我的问题是:这真的太多了吗?我从谷歌搜索中知道我可以使用多行使其工作,但是当我不知道有多少行时我可以这样做吗?也就是说,不是说 "look at X rows" 我可以说 "look at X minutes of rows" 作为 1 个样本吗?在这种情况下,经验丰富的开发人员(或数据科学家?Idek)会怎么做?作为一种替代方法,而不是尝试使用时间范围(由我们正在做的 data/work 预先确定),我想我可以尝试在 [请告知] 分钟内使用滑动 window,得到从中输出并将它们用作输入以获得时间范围的输出。这是个糟糕的主意吗?那行得通吗?该模型需要能够检测由于一天中的时间、不同的人等引起的差异。

谢谢!

新答案

这是一个玩具示例,说明如何在 Python 中进行压缩:

import pandas as pd
import numpy as np

# Inputs
feature_cols = list(range(1, 13))
n_samples = 1000 

# Data prep
df = pd.DataFrame({col: np.random.choice([0, 1], size=n_samples, p=[0.99, 0.01]) for col in feature_cols})
df['ID'] = '1234'
df['TimeStamp'] = pd.date_range(end='2019-12-04', freq='30s', periods=n_samples)

# Compressed df
comp_df = df.loc[df.groupby('ID')[feature_cols].diff().sum(axis=1) != 0, :]

# Results
n_comp = len(df.index)-len(comp_df.index)
print('Data compressed by {} rows ({}%)'.format(str(n_comp), str(round(n_comp/len(df.index)*100, 2))))

正如我在评论中指出的那样,您确实应该在数据库的上游执行此操作,以避免传送不必要的数据。

关于机器学习,我认为您已经超前了。从更简单的模型开始,如随机森林或 GBM。然后,您可以使用 XGBoost 等增强方法。网络的可解释性要差得多,而且既然你提到你没有牢牢掌握我将从小处着手的概念;您不愿意被要求用您甚至还不完全理解的方法来解释几乎无法解释的模型的结果。 :)

上一个回答

好的,如果我理解正确的话,你的数据是:

  • 时间戳(阅读)
  • 位置元数据
  • 12 二进制 "features"
  • 分类分配

它们的生成与插头的方向无关,因此有很多 "duplicates"。对于 35 分钟的样本,您获得了 3747 条记录——大约每秒 1.78 条记录。

首先,这根本不是太多数据。通常,数据越多越好,当然会受到您的计算能力的限制。一台像样的笔记本电脑应该毫不费力地处理数十万行。也就是说,如果您的任何数据没有意义(或无效、格式错误等),则对其进行预处理。更确切地说,通过包含所有这些记录,您会使模型偏向具有许多重复项的时期,因为自然地,它们有更多的样本,因此对模型性能的影响更大。

好的,我们正在进行预处理,应该在哪里进行?对于不必要的数据(您的重复数据),理想情况下,这是尽可能在管道中完成的,这样您就不会传送无用的数据。答:从数据库中拉取时执行。确切的方法取决于你的 database/SQL 方言,但你想使用任何你必须的窗口功能来过滤掉那些重复项。一种解决方案:

  • 将 12 个特征压缩成一个字符串(例如“001000011100”)
  • 获取新列的滞后,按位置分区,按时间升序排序
  • 如果 lag_column = 列然后丢弃记录,否则保留它

如果您正在使用 SQL,您可以使用上述逻辑创建一个视图并查询它,就像您是原始数据一样(使用您想要的任何 windowing/filtering)。

此外,一些 Whosebug 提示,因为我还不能发表评论:

  • 提供数据样本很有帮助,我不得不重读你的第二段几次
  • 将上下文留到最后可以让人们更快地理解您的问题,对于回答者和未来的读者来说都是如此
  • 同样,尽量简明扼要(你的问题大概可以缩短1/4的长度)
  • 在询问技术问题时,尽可能了解您的技术栈(在本例中是您使用的 database/SQL 方言)