2017-11-18 273 views
-2

我在R中有一个数据集(csv文件),其中包含以下变量: - date(m/d/y) - 机器编号(例如“XTR004”) - Failure ,0或1) - 属性1(INT) - 属性2(INT) - 属性3(INT)预测时间序列数据的故障

enter image description here

我有6个月的数据。每天创建一个日志(1行),显示日期,机器编号,机器是否失败以及应与失败相关的3个属性。当机器发生故障(故障= 1)时,第二天不会创建新的日志(行)。换句话说,第一个日期有很多行,最后一个有很少的行

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

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

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

非常感谢!

+0

您必须提供您的数据的代表性样本,或者您认为代表您的结构的假数据,以便我们为您提供帮助。此外,还有很多关于如何将数据集分解为火车/测试的例子。 – AntoniosK

+0

@AntoniosK感谢您的反馈。我收录了一个很小的样本的截图。我发现了很多关于分割数据的资源,但是如果数据集包含'date'列,我没有发现如何做到这一点。我发现的唯一资源根据某个日期将数据集分为两部分(因此训练集在该日期之前,且验证集在该日期之后)。 – dhd

+0

就我个人而言,我会使用机器编号栏来分割数据。这样我的训练和测试数据将包含特定机器名称的所有日期。我不想将特定机器的某些行(天)作为培训,而将其他作为测试数据。例如,如果机器“XTR004”随机获得训练数据,则其所有行也将转到训练数据。这听起来合理吗?你知道该怎么做吗? – AntoniosK

回答

0

这是一个火车/测试拆分过程,它基于您原始数据集中的(唯一)机器名称。

# 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,] 

到底你的训练和测试数据集的行数应该等于你的原始数据集的行数,因为你不会丢失任何信息进行分割。另外,一台机器只能属于火车数据集,或者只属于测试数据集,因为这是拆分背后的哲学。