2016-07-27 75 views
1

我試圖使用SMOTE超級採樣我的數據集,並且一直運行到此錯誤。SMOTE'dimnames'的長度[2]不等於數組範圍

trainSM <- SMOTE(conversion ~ ., train,perc.over = 1000,perc.under = 200) 

錯誤矩陣(不公開(值,遞歸= FALSE,use.names = FALSE), nrow = NR,: 'dimnames' 的長度[2]不等於陣列程度

我的數據集如下:。

  conversion horizon length_of_stay guests rooms price comp_price 
      (dbl) (int)   (int) (int) (int) (int)  (int) 
    1   1  193    2  2  1 199  210 
    2   1  263    2  2  1 171   88 
    3   1  300    3  2  1 164  164 
    4   1  70    4  2  1 76   80 
    5   1  65    6  2  2 260  260 
    6   1  50    3  2  1 171  176 
    7   1  4    3  2  1 158  167 
    8   1  29    3  2  1 171  171 
    9   0  130    1  2  1 161  160 
    10   0  26    2  2  1 110  110 

我試圖只與數值預測,甚至分類預測工作,但既沒有運氣

任何幫助/指導,非常感謝。

回答

2

將一個數據幀傳給DMwR::SMOTE()會拋出這個錯誤。你可以解決它通過使用as.data.frame(your_train_data)爲「未tibble」你data.frame:

trainSM <- SMOTE(conversion ~ ., as.data.frame(train), perc.over = 1000, perc.under = 200) 

的問題是,SMOTE()使用單支架子集。 Tibbles(即數據框架變成了tibble::data_frame)對於返回值要嚴格得多:單個括號子集總是返回一個數據幀(即使結果只是一個單獨的向量或甚至單個值)。

這裏的SMOTE()源代碼的問題部分:

# The idea here is to determine which level of the response variable appears least. 
# Unfortunately, if data is a tibble, then data[,tgt] returns a data frame, 
# which of course, doesn't have any levels, so the value of minCL is always NULL 
minCl <- levels(data[, tgt])[which.min(table(data[, tgt]))] 

# this is where the error is thrown--you're testing a data frame against NULL 
minExs <- which(data[, tgt] == minCl) 
相關問題