我觉得我的运行时间对我的数据集来说非常慢,这是代码:
library(caret)
library(data.table)
knnImputeValues <- preProcess(mainData[trainingRows, imputeColumns], method = c("zv", "knnImpute"))
knnTransformed <- predict(knnImputeValues, mainData[ 1:1000, imputeColumns])
将PreProcess转换为knnImputeValues运行得相当快,但是predict函数需要花费大量时间。当我在数据的子集上计算它时,结果是:
testtime <- system.time(knnTransformed <- predict(knnImputeValues, mainData[ 1:15000, imputeColumns
testtime
user 969.78
system 38.70
elapsed 1010.72
此外,需要注意的是,插入符号预处理使用"RANN"。
现在我的完整数据集是:
str(mainData[ , imputeColumns])
'data.frame': 1809032 obs. of 16 variables:
$ V1: int 3 5 5 4 4 4 3 4 3 3 ...
$ V2: Factor w/ 3 levels "1000000","1500000",..: 1 1 3 1 1 1 1 3 1 1 ...
$ V3: Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ V4: int 2 5 5 12 4 5 11 8 7 8 ...
$ V5: int 2 0 0 2 0 0 1 3 2 8 ...
$ V6: int 648 489 489 472 472 472 497 642 696 696 ...
$ V7: Factor w/ 4 levels "","N","U","Y": 4 1 1 1 1 1 1 1 1 1 ...
$ V8: int 0 0 0 0 0 0 0 1 1 1 ...
$ V9: num 0 0 0 0 0 ...
$ V10: Factor w/ 56 levels "1","2","3","4",..: 45 19 19 19 19 19 19 46 46 46 ...
$ V11: Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ V12: num 2 5 5 12 4 5 11 8 7 8 ...
$ V13: num 2 0 0 2 0 0 1 3 2 8 ...
$ V14: Factor w/ 4 levels "1","2","3","4": 2 2 2 2 2 2 2 2 3 3 ...
$ V15: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 2 2 ...
$ V16: num 657 756 756 756 756 ...
那么,我是不是做错了什么,或者这是运行这个程序需要多长时间的典型情况?如果你从信封后面推断(我知道这并不完全准确),你会得到33天?
而且看起来系统时间很低,用户时间很高,这正常吗?
我的电脑是一台笔记本电脑,采用英特尔(R)酷睿(TM)i5-6300U CPU@2.40Ghz处理器。
此外,这会改善预测函数的运行时间吗?
cl <- makeCluster(4)
registerDoParallel()
我试过了,除了我的任务管理器中所有的处理器看起来都更活跃之外,它似乎没有什么不同。
焦点问题:我正在使用Caret软件包对180万行进行KNN推测,我目前的操作方式需要一个多月的时间,我如何以更快的时间(如果可能的话)写这篇文章
感谢您提供的任何帮助。答案很可能是"这就是需要的时间,不要打扰",我只想排除任何可能的错误。
您可以通过imputation
包和使用可以从Github:安装的遮篷来加快速度
Sys.setenv("PKG_CXXFLAGS"="-std=c++0x")
devtools::install_github("alexwhitworth/imputation")
遮篷使用廉价的距离度量——在这种情况下是距离数据平均向量的距离——来获得近似的邻居。一般来说,我们希望将每个尺寸<100k,因此对于180万排,我们将使用20个雨棚:
library("imputation")
to_impute <- mainData[trainingRows, imputeColumns] ## OP undefined
imputed <- kNN_impute(to_impute, k= 10, q= 2, verbose= TRUE,
parallel= TRUE, n_canopies= 20)
注意:
插补包需要数字数据输入。str
输出中有几个因子变量。他们会导致这一切失败。
如果你有完整的缺失行,你也会得到一些平均向量插补。
# note this example data is too small for canopies to be useful
# meant solely to illustrate
set.seed(2143L)
x1 <- matrix(rnorm(1000), 100, 10)
x1[sample(1:1000, size= 50, replace= FALSE)] <- NA
x_imp <- kNN_impute(x1, k=5, q=2, n_canopies= 10)
sum(is.na(x_imp[[1]])) # 0
# with fully missing rows
x2 <- x1; x2[5,] <- NA
x_imp <- kNN_impute(x2, k=5, q=2, n_canopies= 10)
[1] "Computing canopies kNN solution provided within canopies"
[1] "Canopies complete... calculating kNN."
row(s) 1 are entirely missing.
These row(s)' values will be imputed to column means.
Warning message:
In FUN(X[[i]], ...) :
Rows with entirely missing values imputed to column means.