【问题标题】:Predict failure for time series data预测时间序列数据的失败
【发布时间】:2018-05-01 23:23:08
【问题描述】:

我在 R 中有一个数据集(csv 文件),其中包含以下变量: - 日期(月/日/年) - 机器编号(例如“XTR004”) - 失败(二进制,0 或 1) - 属性 1(整数) - 属性 2(整数) - 属性 3 (int)

enter image description here

我有 6 个月的数据。每天都会创建一个日志(1 行),其中显示日期、机器编号、机器是否发生故障以及应该与故障相关的 3 个属性。当一台机器发生故障(failure = 1)时,第二天不会创建新的日志(行)。也就是说,第一个日期有很多行,最后一个日期有少量行

目标:我想使用这 3 个属性来预测失败(使用 Rstudio)。我想使用的模型是 1)逻辑回归,2)随机森林,3)神经网络。

问题:对于如何将数据拆分为训练和验证集(80/20 或交叉验证),然后针对此特定案例使用上述模型,是否有人有任何建议?日期和机器编号一起可以看作是“主键”。因此,我不确定是否: - 使用与这些机器相关的所有日志制作 2 组机器 - 使用特定日期创建 2 个组(这意味着某些长寿的机器是两个组的一部分)

我认为第一种策略更有意义,但我还没有找到拆分数据的方法(使用 80/20 一次性拆分或 5 或 10 折交叉验证)。我假设我必须根据其机器号对数据进行分组?有没有人有任何我可以看的例子或任何示例代码?

非常感谢!

【问题讨论】:

  • 您必须提供具有代表性的数据样本,或者您认为代表您的结构的虚假数据,以便我们为您提供帮助。此外,网上有很多关于如何将数据集拆分为训练/测试的示例。
  • @AntoniosK 感谢您的反馈。我附上了一个非常小的样本的屏幕截图。我找到了很多关于拆分数据的资源,但是如果数据集包含“日期”列,我没有找到任何关于如何做到这一点的信息。我发现的唯一资源是根据某个日期将数据集分成两部分(因此训练集在该日期之前,而验证集在该日期之后)。
  • 我个人会使用机器编号列拆分数据。这样,我的训练和测试数据将包含特定机器名称的所有日期。我不希望将特定机器的某些行(天)作为训练数据,而将其他数据作为测试数据。例如,如果机器XTR004 随机进入训练数据,那么它的所有行也将进入训练数据。这听起来合理吗?你知道怎么做吗?
  • 有道理!我同意。你有任何关于编码部分的额外资源吗?
  • 我确实有一些代码可以进行采样和拆分以训练和测试组,并且可能会将其作为一些 cmets 的答案发布。到目前为止你有没有尝试过?

标签: r machine-learning time-series random-forest cross-validation


【解决方案1】:

这是一个训练/测试拆分过程,基于您在原始数据集中拥有的(唯一)机器名称。

# example dataset
df = data.frame(Date = c(rep("03/20/2001", 4), rep("03/21/2001", 4)),
                Machine = rep(c("XTR003","XTR004","XTR005","XTR006"), 2),
                Attr1 = c(0,0,10,5,0,4,0,8),
                Failure = c(0,1,0,0,1,0,0,1),
                stringsAsFactors = F)

# check how it looks like
df

#         Date Machine Attr1 Failure
# 1 03/20/2001  XTR003     0       0
# 2 03/20/2001  XTR004     0       1
# 3 03/20/2001  XTR005    10       0
# 4 03/20/2001  XTR006     5       0
# 5 03/21/2001  XTR003     0       1
# 6 03/21/2001  XTR004     4       0
# 7 03/21/2001  XTR005     0       0
# 8 03/21/2001  XTR006     8       1

# create a vector of unique machine names
machine_vec = unique(df$Machine)

# calculate number of unique machines in your train dataset
# here we want 70% of machines to be in the train dataset
# (this is NOT the number of rows of your train dataset, but the number of unique machines)
N_train = round(length(machine_vec) * 0.7)

# randomly select which machine names will create your train dataset
train_machines = sample(machine_vec, N_train)

# select corresponding rows for your train and test dataset
# (all rows of the machines selected previously will form the train data)
df_train = df[df$Machine %in% train_machines,]
df_test = df[!df$Machine %in% train_machines,]

最后,您的训练数据集和测试数据集的行数应该等于原始数据集的行数,因为您执行了拆分而不会丢失任何信息。此外,一台机器应该只属于训练数据集,或者只属于测试数据集,因为这就是拆分背后的理念。

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 2021-02-16
    • 2015-12-06
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多