我想在MLJ.jl中训练3个模型:ARDRegressor,AdaBoostRegressor,BaggingRegressor

目前,例如,我一次训练他们1:

using Pkg; Pkg.activate("."); Pkg.instantiate();
using RDatasets, MLJ, Statistics, PrettyPrinting, GLM
X, y =  @load_boston; train, test = 1:406, 407:506

@load ARDRegressor
reg = ARDRegressor
m = machine(reg(), X, y);
fit!(m, rows=train);
ŷ = predict(m, rows=test)
os_ARDRegressor = rms(ŷ , y[test])


我想训练他们一个循环,例如:

modlist = [ARDRegressor; AdaBoostRegressor; BaggingRegressor]
score = []

for (i, mod) in enumerate(modlist)
@load mod;
reg = mod;
m = machine(reg(), X, y);
fit!(m, rows=train);
ŷ = predict(m, rows=test)
push!( score,  (i, mod, rms(ŷ , y[test]))  )
end

最佳答案

在运行最后一个代码块时存在一些问题。


循环for jj in eachindex(Models)遍历Models数组的索引,因此jj取值1、2、3。而是直接循环遍历Models数组。
@load ARDRegressor是宏调用;这意味着@load jj将转换为@load("jj"),因此请勿像您想要的变量那样使用jj
os_jj的值将在循环的每次迭代中被覆盖。您宁愿将分数保留在该索引处的数组中:os[jj] = ...
MLJ要求您在加载模型之前导入包含模型的软件包。提醒自己using ScikitLearn需要在当前环境中安装sklearn python软件包。


考虑以下工作代码示例:

using MLJ, RDatasets
X, y =  @load_boston; train, test = 1:406, 407:506
models = [@load ARDRegressor; @load AdaBoostRegressor; @load BaggingRegressor]
score = Array{Float64}(undef, 3)
for (i, model) in enumerate(models)
    m = machine(model, X, y)
    fit!(m, rows=train);
    ŷ = predict(m, rows=test)
    score[i] = rms(ŷ, y[test])
end
@show score


旁注:使用以下命令运行julia时,无需使用using Pkg; Pkg.activate(".")。但这取决于个人喜好

10-06 01:56