-3

我从大学毕业几个月就获得了 CS 学士学位,我的老板让我构建一个机器学习代理,在两个月内自己从头开始将数据分类为 23 个类别。我上了一堂人工智能入门课程,我们甚至没有涵盖神经网络。我想我已经弄清楚了基础知识,但是我在准备数据以输入模型时遇到了麻烦。

随意评论这个(不)可行性,但这是上下文信息,而不是我的问题。我拥有的配电盘类型设备的数据类型示例是 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 个样本提供。如果电源条上的使用情况从 1 分钟到下一分钟没有变化,它将创建几行相同的行,但时间戳除外。当我删除时间戳时,我得到了 333 个不同的行。这似乎仍然很多,而且它正在删除必要的时间数据。

我的问题是:这真的太多了吗?我从谷歌搜索中知道我可以使用多行使其工作,但是当我不知道有多少行时我可以这样做吗?即,不是说“看 X 行”,而是说“看 X 分钟的行”作为 1 个样本?在这种情况下,经验丰富的开发人员(或数据科学家?Idek)会怎么做?作为一种替代方法,而不是尝试使用时间框架(由我们正在做的数据/工作确定),我想我可以尝试在 [请告知] 分钟内使用滑动窗口,从中获取输出并使用那些作为输入以获取时间范围内的输出。这是一个可怕的想法吗?那还能用吗?该模型需要能够检测到由于一天中的时间、不同的人等造成的差异。

谢谢!

4

1 回答 1

0

新答案

这是一个关于如何在 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个二进制“特征”
  • 分类作业

它们的生成与插头的方向无关,因此有很多“重复”。对于 35 分钟的样本,您有 3747 条记录 - 大约每秒 1.78 条记录。

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

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

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

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

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

  • 提供数据样本很有帮助,我不得不重读你的第二段几次
  • 把上下文留到最后可以让人们更快地得到你的问题,无论是对于回答者还是未来的读者
  • 同样,尽量简洁(你的问题可能是长度的 1/4)
  • 在询问技术问题时,尽可能了解您的堆栈是有帮助的(在这种情况下,您正在使用的数据库/SQL 方言)
于 2019-12-02T22:14:03.733 回答