我是 Julia 的新手(与 MATLAB 一起使用)。我正在获取一些数据集,使用 ScikitLearn 中可用的工具对其进行清理和编码分类变量,然后运行干净数据的 XGBoost。

但是,我无法使用经过训练的 XGBoost 模型进行预测,因为 ScitkitLearn 和 XGBoost 都有一个名为 predict 的函数。请参阅以下错误消息:



问题是我无法将 XGBoost 的 predict 函数定义为 XGBoost.predict 因为这不起作用,而且它似乎是我所知道的唯一解决方案。

此外,我无法找到或理解如何在不加载 predict 函数的情况下仅从 ScikitLearn 加载特定模块。例如,格式 import MLDataUtils.splitobs 适用于大多数软件包,但 ScikitLearn.preprocessing 不起作用。

最佳答案

这是您的问题的 MWE(两个模块 export 同名):

module A
    export f
    f() = println("f from A")
end
module B
    export f
    f() = println("f from B")
end

现在,考虑您 usingA 并尝试调用 B 的情况:
julia> using .A, .B

julia> f()
WARNING: both B and A export "f"; uses of it in module Main must be qualified
ERROR: UndefVarError: f not defined

失败的原因是 Julia 不知道你对 f 的意思;是 f 还是 A.f ?您可以通过明确消除对 B.f 的 any 调用来解决此问题:
julia> using .A, .B

julia> A.f()
f from A

julia> B.f()
f from B

如果您希望能够仅通过名称 ( f ) 调用其中一个函数,那么您(用户)必须选择 f 应该指向的内容。您可以通过将其明确定义为导入语句的一部分来实现:
julia> using .A, .B

julia> using .B: f # explicitly choosing f to be B.f

julia> f() # no error
f from B

julia> A.f()
f from A

julia> B.f()
f from B

另一种选择是在您的命名空间中明确定义您自己的名称 f :
julia> using .A, .B

julia> const f = B.f # defining a new name in this namespace pointing to B.f
f (generic function with 1 method)

julia> f() # no error
f from B

julia> A.f()
f from A

julia> B.f()
f from B

关于scikit-learn - 在 Julia 中定义冲突模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58159369/

10-12 23:07