2017-11-18 159 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,] 

到底你的訓練和測試數據集的行數應該等於你的原始數據集的行數,因爲你不會丟失任何信息進行分割。另外,一臺機器只能屬於火車數據集,或者只屬於測試數據集,因爲這是拆分背後的哲學。