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

2024-04-29 02:44:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我从大学毕业几个月,拿到了计算机学士学位,我的老板让我建立一个机器学习代理,让我自己在两个月内把数据从零开始分为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个不同的行。这显然是太多的饲料模型作为一个样本。如果powerstrip上的用法没有从1分钟更改到下一分钟,它将创建除时间戳之外的几个相同行。当我去掉时间戳时,我得到了333个不同的行。这似乎仍然是一个可怕的很多,它删除了必要的时间数据。你知道吗

我的问题是:这真的太多了吗?从我的google中我知道我可以用几行来实现它,但是当我不知道有多少行的时候我能做到吗?也就是说,作为一个示例,我可以说“查看X分钟的行”而不是说“查看X行”吗?一个有经验的开发人员(或数据科学家)会怎么做?在这种情况下你会怎么做?作为一种替代方法,我不想尝试使用时间框架(由我们正在做的数据/工作预先确定),我想我可以尝试使用滑动窗口(请建议)分钟,从中获取输出,并将其作为输入来获取时间框架的输出。那是个糟糕的主意吗?这样行吗?该模型需要能够检测到由于一天中的时间、不同的人等造成的差异

谢谢!你知道吗


Tags: 数据模型框架id示例数量计算机时间
1条回答
网友
1楼 · 发布于 2024-04-29 02:44:48

新答案

下面是一个如何在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方言)是很有帮助的

相关问题 更多 >