我想使用来自插入符号模型的折叠预测来训练包含一些原始预测变量的第二阶段模型.我可以收集如下的折叠预测:
#Load Data
set.seed(1)
library(caret)
library(mlbench)
data(BostonHousing)
#Build Model (see ?train)
rpartFit <- train(medv ~ . + rm:lstat, data = BostonHousing, method="rpart",
trControl=trainControl(method='cv', number=folds,
savePredictions=TRUE))
#Collect out-of-fold predictions
out_of_fold <- rpartFit$pred
bestCP <- rpartFit$bestTune[,'.cp']
out_of_fold <- out_of_fold[out_of_fold$.cp==bestCP,]
Run Code Online (Sandbox Code Playgroud)
这很好,但它们的顺序错误:
> all.equal(out_of_fold$obs, BostonHousing$medv)
[1] "Mean relative difference: 0.4521906"
Run Code Online (Sandbox Code Playgroud)
我知道该train对象返回一个列表,其中列出了用于训练每个折叠的索引:
> str(rpartFit$control$index)
List of 10
$ Fold01: int [1:457] 1 2 3 4 5 6 7 8 9 10 ...
$ Fold02: int [1:454] 2 3 4 8 10 11 12 …Run Code Online (Sandbox Code Playgroud) 我爱do.call.我喜欢能够将函数参数存储在列表中,然后将它们映射到给定的函数.
例如,我经常发现自己使用这种模式来拟合不同预测模型的列表,每个模型都有一些共享和一些独特的参数:
library(caret)
global_args <- list(
x=iris[,1:3],
y=iris[,4],
trControl=trainControl(
method='cv',
number=2,
returnResamp='final',
)
)
global_args$trControl$index <- createFolds(
global_args$y,
global_args$trControl$number
)
model_specific_args <- list(
'lm' = list(method='lm', tuneLength=1),
'nn' = list(method='nnet', tuneLength=3, trace=FALSE),
'gbm' = list(
method='gbm',
verbose=FALSE,
tuneGrid=expand.grid(
n.trees=1:100,
interaction.depth=c(2, 3),
shrinkage=c(.1, .01)
)
)
)
list_of_models <- lapply(model_specific_args, function(args){
return(do.call(train, c(global_args, args), quote=TRUE))
})
resamps <- resamples(list_of_models)
dotplot(resamps, metric='RMSE')
Run Code Online (Sandbox Code Playgroud)
global_args包含对所有模型都相同的参数,并model_specific_args包含特定于模型的参数列表.我循环model_specific_args,连接每个元素global_args,然后用于do.call将最终参数列表传递给模型拟合函数.
虽然这段代码在视觉上很优雅,但它的性能非常糟糕:do.call将整个x数据集按字面序列化为文本,然后将其传递给模型拟合函数.如果x是几GB的数据,则使用疯狂的RAM并且通常会失败.
print(list_of_models[[1]]$call)
Run Code Online (Sandbox Code Playgroud)
有没有办法将参数列表传递给R中的函数,而不使用do.call或call …
首先,可能需要将其移至超级用户.我无法确定哪个场地更好.
我正在尝试编写一个将在启动/重新启动时运行的R脚本,并将该计算机添加到doRedis工作池中.(doRedis是一个foreach后端).
这是我的R脚本,"〜/ Rworker.R"
#Define Parameters
require(multicore)
Host <- 'ip_of_doRedis_Server'
cores <- multicore:::detectCores()
TO <- 24*3600
#Start Workers
require('doRedis')
startLocalWorkers(cores,'jobs',host=Host,port=6379, timeout = TO)
Run Code Online (Sandbox Code Playgroud)
我可以使用命令从命令行运行此脚本
sudo R CMD BATCH ~/Rworker.R ~/RLog.
接下来,我编写了一个shell脚本来运行R脚本,标题为"/etc/init.d/StartWorkers.sh"
#!/bin/sh
sudo echo "Starting R workers"
sudo R CMD BATCH ~/Rworker.R ~/RLog
Run Code Online (Sandbox Code Playgroud)
我使用了这个shell脚本可执行文件chmod +x StartWorkers.sh.当我运行时,./StartWorkers.sh一切运行良好,R会话启动,工作人员被添加到池中.
现在,我需要在启动/重启机器时运行这个shell脚本,所以我输入
update-rc.d StartWorkers.sh defaults.此命令似乎有效,但我收到以下警告:'update-rc.d:warning:/etc/init.d/StartWorkers.sh缺少LSB信息'
但是,使用rcconf检查确认"StartWorkers.R"在启动列表中.
但是,当我重新启动计算机时,脚本无法运行.我究竟做错了什么?shell脚本从命令行运行良好,但在我尝试在启动时运行它时失败.
/编辑:好的,根据Dirk的回答,我安装了更小的,并将'StartWorkers.sh'更改为以下内容:
#! /usr/bin/r
#Define Parameters
require(multicore)
Host <- 'zachec2.dyndns.org'
cores <- multicore:::detectCores()
TO <- 24*3600
#Start Workers
require('doRedis') …Run Code Online (Sandbox Code Playgroud) 我在Windows上的R中尝试了以下代码:
library(RCurl)
postForm("https://www.google.com/accounts/ClientLogin/",
"email" = "me@gmail.com",
"Passwd" = "abcd",
"service" = "finance",
"source" = "Test-1"
)
Run Code Online (Sandbox Code Playgroud)
但是出现以下错误:
Error in postForm()
SL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Run Code Online (Sandbox Code Playgroud)
如何设置RCurl以允许使用HTTP?
所以每种成分都有4种效果 http://www.uesp.net/wiki/Skyrim:Ingredients
如果我结合两种成分.魔药将具有两组相交的奖励效果.我不能两次使用相同的成分.为了生成所有2种成分的可能性,我只列出了成分对的成分列表.我取了列表的头部,并将其与列表中每个元素的其余部分进行比较,每次迭代都删除头部.这避免了欺骗.
我被困了.我不知道如何在没有欺骗的情况下生成3种成分组合.有什么建议?
我在R中有一个因子,具有NA水平.
set.seed(1)
x <- sample(c(1, 2, NA), 25, replace=TRUE)
x <- factor(x, exclude = NULL)
> x
[1] 1 2 2 <NA> 1 <NA> <NA> 2 2 1 1
[12] 1 <NA> 2 <NA> 2 <NA> <NA> 2 <NA> <NA> 1
[23] 2 1 1
Levels: 1 2 <NA>
Run Code Online (Sandbox Code Playgroud)
如何按<NA>级别对该因子进行子集化?我试过的两种方法都行不通.
> x[is.na(x)]
factor(0)
Levels: 1 2 <NA>
> x[x=='<NA>']
factor(0)
Levels: 1 2 <NA>
Run Code Online (Sandbox Code Playgroud) 的dbWriteTable在功能上RPostgreSQL似乎忽略的列名,并试图自R将数据推到PostgreSQL原样.当附加到现有表时,这是有问题的,特别是如果在R对象中未指定的列应该给出默认值.
RMySQL通过添加列名来非常优雅地处理这种情况LOAD DATA LOCAL INFILE.如何强制RPostgreSQL在dbWriteTable何时将默认值分配给未指定的列append=TRUE?
这是一个例子:
CREATE TABLE test (
column_a varchar(255) not null default 'hello',
column_b integer not null
);
insert into test values (DEFAULT, 1);
Run Code Online (Sandbox Code Playgroud)
产生下表:
select * from test;
column_a | column_b
----------+----------
hello | 1
(1 row)
Run Code Online (Sandbox Code Playgroud)
我想从R中向该表插入一些新数据:
require('RPostgreSQL')
driver <- PostgreSQL()
con <- dbConnect(driver, host='localhost', dbname='development')
set.seed(42)
x <- data.frame(column_b=sample(1:100, 10))
dbWriteTable(con, name='test', value=x, append=TRUE, row.names=FALSE)
dbDisconnect(con)
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
Error in postgresqlgetResult(new.con) :
RS-DBI driver: (could …Run Code Online (Sandbox Code Playgroud) 我们试图将一些单元测试添加到由travis运行的插入符包中,但不是在CRAN上.这样可以节省CRAN上的构建时间,并减少必须安装的依赖项数量来检查我们的软件包,同时让我们在travis上运行更完整的测试套件.
我想我可以使用travis.yml文件中的r_packages:行简单地安装测试要求:
r_packages:
- ROSE
- DMwR
Run Code Online (Sandbox Code Playgroud)
但是,我的NOT_CRAN=TRUE构建仍然失败.(NOT_CRAN = FALSE运行正常,因为跳过有问题的测试)
这真的很奇怪,因为当我查看构建日志时,我看到travis成功安装了我需要的所有软件包:
* installing *source* package ‘ROSE’ ...
** package ‘ROSE’ successfully unpacked and MD5 sums checked
** R
** data
** inst
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
* DONE (ROSE)
Run Code Online (Sandbox Code Playgroud)
但是当我的测试运行依赖于那些包时,R无法找到它们:
> library(testthat)
> library(caret)
Loading required package: lattice …Run Code Online (Sandbox Code Playgroud) 我想选择n时间序列的最后一项.我可以使用[运算符,但是我丢失了数据的时间序列属性:
data <- ts(1:10, frequency = 4, start = c(1959, 2))
data[(length(data)-4):length(data)]
Run Code Online (Sandbox Code Playgroud)
我已经编写了一个包装函数来重新应用时间序列属性,但我想知道是否有更优雅的方法来做到这一点?
lastN <- function(data,n) {
out <- data[(length(data)-n+1):length(data)]
ts(out, end=end(data), frequency=frequency(data))
}
data
lastN(data,5)
Run Code Online (Sandbox Code Playgroud)
为什么[操作员不返回时间序列对象?
我有一个大矩阵:
set.seed(1)
a <- matrix(runif(9e+07),ncol=300)
Run Code Online (Sandbox Code Playgroud)
我想对矩阵中的每一行进行排序:
> system.time(sorted <- t(apply(a,1,sort)))
user system elapsed
42.48 3.40 45.88
Run Code Online (Sandbox Code Playgroud)
我有很多RAM可以使用,但我想要一种更快的方法来执行此操作.
r ×9
subset ×2
autostart ×1
combinations ×1
dataset ×1
do.call ×1
matrix ×1
missing-data ×1
multicore ×1
na ×1
packages ×1
postgresql ×1
r-caret ×1
r-factor ×1
rcurl ×1
redis ×1
row ×1
rpostgresql ×1
sorting ×1
time-series ×1
travis-ci ×1
ubuntu ×1