当我有太多但需要全部数据时,我该如何预处理我的数据



我刚从大学毕业几个月,就获得了CS BS,我的老板让我构建一个机器学习代理,在两个月内将数据从头开始分为23类。我上了一节人工智能入门课,我们甚至没有涉及神经网络。我想我已经掌握了基本知识,但我在准备数据以输入模型时遇到了困难。

请随意评论这(不)的可行性,但这是上下文信息,而不是我的问题。我拥有的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分钟到几个小时不等,我得到了3747行不同的行。这显然太多了,无法将模型作为一个样本来提供。如果电源板上的使用情况在1分钟到下一分钟之间没有变化,那么它将创建除时间戳之外完全相同的几行。当我删除时间戳时,我得到了333个不同的行。这似乎仍然是一个可怕的数字,而且它正在删除必要的时间数据。

我的问题是:这真的太多了吗?我从我的谷歌搜索中知道,我可以使用几行来实现它,但当我不知道有几行时,我能做到吗?也就是说,我可以说"看X行"而不是"看X分钟的行"作为一个样本吗?在这种情况下,一个经验丰富的开发人员(或数据科学家?Idek)会做什么?作为一种替代方法,我不想尝试使用时间框架(由我们正在做的数据/工作预先确定),我想我可以尝试使用一个超过[请告知]分钟的滑动窗口,从中获得输出,并将其用作输入,以获得时间框架的输出。这是个糟糕的主意吗?这样行吗?该模型需要能够检测由于一天中的时间、不同的人等原因造成的差异。

谢谢!

新答案

下面是一个如何在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))))

正如我在评论中所指出的,你真的应该在DB的上游这样做,以避免发送不必要的数据。

至于机器学习,我认为你已经超越了自己。从更简单的模型开始,如随机森林或GBM。然后,您可以使用XGBoost这样的增强方法。网络的可解释性要低得多,而且,既然你提到了你对概念的把握不牢,我会从小处开始;你不愿意被要求从一个你甚至还不完全理解的方法中解释一个几乎无法解释的模型的结果。:)

上一个答案

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

  • 时间戳(读取)
  • 位置元数据
  • 12个二进制"特性">
  • 分类作业

无论插头的方向如何,它们都会生成,因此有很多"重复项"。对于一个35分钟的样本,你得到了3747条记录——大约每秒1.78条记录。

首先,这根本不是太多的数据。通常情况下,数据越多越好,当然,这取决于您的计算能力。一台像样的笔记本电脑应该能处理数十万排而不流汗。也就是说,如果你的任何数据没有意义(或无效、格式错误等),那么就对其进行预处理。更确切地说,通过包括所有这些记录,你将模型偏向于有许多重复的周期,因为它们自然有更多的样本,因此对模型性能的影响更大。

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

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

如果您使用SQL,您可以使用上述逻辑创建一个视图,并像查询原始数据一样对其进行查询(使用您想要的任何窗口/过滤)。

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

  • 提供一个数据样本很有帮助,我不得不重读你的第二段几遍
  • 把上下文留到最后会让人们更快地了解你的问题,无论是回答者还是未来的读者
  • 同样,尽量简明扼要(你的问题可能有1/4的长度)
  • 在询问技术问题时,尽可能了解您的堆栈(在本例中是您使用的数据库/SQL方言)是很有帮助的

相关内容

  • 没有找到相关文章

最新更新