我有一个包含18列和大约12000行的数据框。我想找到前17列的异常值,并将结果与第18列进行比较。第18列是一个因子,包含可用作异常值指标的数据。
我的数据框是不明确的,我删除了第18列,如下所示:
ufo2 <- ufo[,1:17]
然后将3个非数字列转换为数值:
ufo2$Weight <- as.numeric(ufo2$Weight)
ufo2$InvoiceValue <- as.numeric(ufo2$InvoiceValue)
ufo2$Score <- as.numeric(ufo2$Score)
然后使用以下命令进行异常值检测:
outlier.scores <- lofactor(ufo2, k=5)
但是outlier.scores的所有元素都是NA !!!
我在这段代码中有任何错误吗?
是否有另一种方法可以找到这种数据框的异常值?
我的所有代码:
setwd(datadirectory)
library(doMC)
registerDoMC(cores=8)
library(DMwR)
# load data
load("data_9802-f2.RData")
ufo2 <- ufo[,2:17]
ufo2$Weight <- as.numeric(ufo2$Weight)
ufo2$InvoiceValue <- as.numeric(ufo2$InvoiceValue)
ufo2$Score <- as.numeric(ufo2$Score)
outlier.scores <- lofactor(ufo2, k=5)
dput(head(ufo2))的输出为:
structure(list(Origin = c(2L, 2L, 2L, 2L, 2L, 2L), IO = c(2L,
2L, 2L, 2L, 2L, 2L), Lot = c(1003L, 1003L, 1003L, 1012L, 1012L,
1013L), DocNumber = c(10069L, 10069L, 10087L, 10355L, 10355L,
10382L), OperatorID = c(5698L, 5698L, 2015L, 246L, 246L, 4135L
), Month = c(1L, 1L, 1L, 1L, 1L, 1L), LineNo = c(1L, 2L, 1L,
1L, 2L, 1L), Country = c(1L, 1L, 1L, 1L, 11L, 1L), ProduceCode = c(63456227L,
63455714L, 33687427L, 32686627L, 32686627L, 791614L), Weight = c(900,
850, 483, 110000, 5900, 1000), InvoiceValue = c(637, 775, 2896,
48812, 1459, 77), InvoiceValueWeight = c(707L, 912L, 5995L, 444L,
247L, 77L), AvgWeightMonth = c(1194.53, 1175.53, 7607.17, 311.667,
311.667, 363.526), SDWeightMonth = c(864.931, 780.247, 3442.93,
93.5818, 93.5818, 326.238), Score = c(0.56366535234262, 0.33775439984787,
0.46825476121676, 1.414092583904, 0.69101737288291, 0.87827342721894
), TransactionNo = c(47L, 47L, 6L, 3L, 3L, 57L)), .Names = c("Origin",
"IO", "Lot", "DocNumber", "OperatorID", "Month", "LineNo", "Country",
"ProduceCode", "Weight", "InvoiceValue", "InvoiceValueWeight",
"AvgWeightMonth", "SDWeightMonth", "Score", "TransactionNo"), row.names = c(NA,
6L), class = "data.frame")
答案 0 :(得分:1)
首先,您需要花费更多时间预处理您的数据。 您的轴具有完全不同的含义和比例。不注意,异常值检测结果将毫无意义,因为它们基于无意义的距离。
例如produceCode
。您确定,这应该是相似性的一部分吗?
另请注意,我发现R lofactor
包的DMwR
实现非常慢。而且,它似乎与欧几里德的距离很难接触!
相反,我建议使用ELKI进行异常值检测。首先,它提供了更广泛的算法选择,其次它比R快得多,第三,它非常模块化和灵活。对于您的用例,您可能需要实现自定义距离函数,而不是使用欧几里德距离。
以下是implementing a custom distance function上ELKI教程的链接。