Julia MLJ 森林加载:错误:MethodError:没有与 BetaML.Bmlj.RandomForestRegressor() 匹配的方法

问题描述 投票:0回答:1

你好,

我在使用 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 框架下工作得很好。

machine-learning julia random-forest
1个回答
0
投票

我刚刚尝试过,使用最新版本的 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 也适用于标准数组,而不是数据帧。如果您需要更多帮助,请发布完全可复制(最小)的示例,否则我无法重现您的问题。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.