你好,
我在使用 MLJ 的任何类型的决策树模型时都遇到困难。我已经尝试了 MLJ、DecisionTree、Scikit 的 3 个软件包,现在又尝试了这个 BetaML。仅当我尝试训练某种决策树时才会发生这种情况。我与其他 MLJLinearModel 和 XGBoost 配合得很好。我总是遇到同样的错误。错误来自以下函数:
function machine_train_predict(df::DataFrame, df_train::DataFrame, model_name::String; args...)
models = Dict(
"xgb_reg"=> ["XGBoost" => "XGBoostRegressor"],
"ridge_reg"=> ["MLJLinearModels" => "RidgeRegressor"],
"lasso_reg"=> ["MLJLinearModels" => "LassoRegressor"],
"rf_reg" => ["BetaML" => "RandomForestRegressor"],
"lin_reg" => ["MLJLinearModels" => "LinearRegressor"],
"log_class" => ["MLJLinearModels" => "LogisticClassifier"],
"rf_class" => ["DecisionTree" => "RandomForestClassifier"],
"xgb_class" => ["XGBoost" => "XGBoostClassifier"]
)
y, X = machine_input(df_train; rng=123)
y = coerce(y, Continuous)
mod = models[model_name][1]
p = mod[1]
m = mod[2]
mname = model_name
Model = @eval @load $(m) pkg=$(p) verbosity=0
model = Model()
# train machine and get parameters
m1 = machine(model, X, y) |> fit!
# prepare test set for machine predictions
y, X = machine_input(df)
y = coerce(y, Continuous)
# predict
yhat = MLJ.predict_mode(m1, X)
return yhat
end
错误:
Training. Dataset: global. Iteration N: 1ERROR: LoadError: MethodError: no method matching BetaML.Bmlj.RandomForestRegressor()
The applicable method may be too new: running in world age 33750, while current world is 33793.
Closest candidates are:
BetaML.Bmlj.RandomForestRegressor(; n_trees, max_depth, min_gain, min_records, max_features, splitting_criterion, β, rng) (method too new to be called from this world context.)
@ BetaML ~/.julia/packages/BetaML/8WVUG/src/Bmlj/Trees_mlj.jl:219
BetaML.Bmlj.RandomForestRegressor(::Int64, ::Int64, ::Float64, ::Int64, ::Int64, ::Function, ::Float64, ::Random.AbstractRNG) (method too new to be called from this world context.)
@ BetaML ~/.julia/packages/BetaML/8WVUG/src/Bmlj/Trees_mlj.jl:193
BetaML.Bmlj.RandomForestRegressor(::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any, ::Any) (method too new to be called from this world context.)
@ BetaML ~/.julia/packages/BetaML/8WVUG/src/Bmlj/Trees_mlj.jl:193
Stacktrace:
[1] (::var"#machine_train_predict#38"{var"#machine_train_predict#11#39"})(df::DataFrame, df_train::DataFrame, model_name::String; args::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
@ Main ~/exports/10fold_ml_model-nocache-by-iter.jl:250
[2] (::var"#machine_train_predict#38"{var"#machine_train_predict#11#39"})(df::DataFrame, df_train::DataFrame, model_name::String)
@ Main ~/exports/10fold_ml_model-nocache-by-iter.jl:230
[3] (::var"#train_rescore#36"{var"#train_rescore#10#37"})(df::DataFrame, df_train::DataFrame, model_name::String; args::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
@ Main ~/exports/10fold_ml_model-nocache-by-iter.jl:223
[4] (::var"#train_rescore#36"{var"#train_rescore#10#37"})(df::DataFrame, df_train::DataFrame, model_name::String)
@ Main ~/exports/10fold_ml_model-nocache-by-iter.jl:219
[5] (::var"#proto_train#32"{var"#proto_train#7#33"})(df::DataFrame, df_t::DataFrame, model_name::String; nflds::Int64, args::Base.Pairs{Symbol, Int64, Tuple{Symbol}, NamedTuple{(:nfolds,), Tuple{Int64}}})
@ Main ~/exports/10fold_ml_model-nocache-by-iter.jl:211
[6] (::var"#evaluate_model#42"{var"#evaluate_model#13#43"})(paths::String, output::String, dss::String, niter::Int64, model_name::String; nfolds::Int64, args::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
@ Main ~/exports/10fold_ml_model-nocache-by-iter.jl:284
[7] (::var"#global_evaluate#40"{var"#global_evaluate#12#41"})(paths::String, output::String, ds::Vector{String}, itern::Int64, model_name::String; nfolds::Int64, args::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
@ Main ~/exports/10fold_ml_model-nocache-by-iter.jl:270
[8] global_evaluate
@ ~/exports/10fold_ml_model-nocache-by-iter.jl:267 [inlined]
[9] main(args::Vector{String})
@ Main ~/exports/10fold_ml_model-nocache-by-iter.jl:475
[10] top-level scope
@ ~/exports/10fold_ml_model-nocache-by-iter.jl:479
该错误始终与世界年龄以及所使用模型对应的MLJInterface有关。
请帮忙。我这几天一直在寻找解决方案。
我正在尝试做出预测。有问题的函数对应于我的脚本的训练和预测步骤。我没想到会出错,因为以前的回归器模型(线性、套索、岭、xgboost)在 MLJ 框架下工作得很好。
我刚刚尝试过,使用最新版本的 MLJ(v0.20.5)可以正常工作。
在空目录中的脚本
Foo.jl
上键入此内容:
using Pkg
Pkg.activate(@__DIR__) # Activate the environment on the directory of this script. The first time that the environment is "created" in this directory will appear 2 files, Project.toml and Manifest.toml
Pkg.add("MLJ")
using MLJ
X = rand(100,5)
y = [r[2]+r[3]^2-r[5] for r in eachrow(X)]
modelType = @load RandomForestRegressor pkg = "BetaML" # this automatically import BetaML. It may take some time on the first run
model = modelType()
mach = machine(model, X, y);
fit!(mach);
ŷ = predict(mach, X);
hcat(y,ŷ)
Pkg.status()
正如我在评论中所写,最好在专用环境中启动项目。 BetaML 也适用于标准数组,而不是数据帧。如果您需要更多帮助,请发布完全可复制(最小)的示例,否则我无法重现您的问题。