【问题标题】:Defining Conflicting Modules in Julia在 Julia 中定义冲突模块
【发布时间】:2020-01-29 05:53:10
【问题描述】:

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

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

警告:ScikitLearn 和 XGBoost 都导出“预测”;在模块 Main 中使用它必须是合格的 错误:LoadError:UndefVarError:预测未定义

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

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

【问题讨论】:

  • 我相信你可以做到import name_of_package: name_of_function_you_want, 2nd_function_you_want。有人检查我这个。
  • @logankilpatrick,你可以,但是发布的错误不应该发生。 @ForzaRS,你能给出堆栈跟踪吗?据我所知,您当前的工作模块中似乎定义了一个函数,它使用了predict
  • 嗨@AnshulSinghvi 感谢您的回复。这是堆栈跟踪错误:LoadError: UndefVarError: predict not defined Stacktrace: [1] top-level scope at none:0 in expression started at /Users/sinkala/Documents/MATLAB/Dream Challenge Breast Cancer Network/rescaleScript.jl:92
  • 谢谢@logankilpatrick 我已经尝试过 "import ScikitLearn:Preprocessing,LabelEncoder" ,但我收到以下错误警告:无法将 ScikitLearn.LabelEncoder 导入 Julia 中的 Main,下面的代码使用 ScikitLearn 可以正常工作:适合变换!此外,我发现您建议的格式几乎适用于除 LabelEncoder 之外的任何其他内容。即,使用 ScikitLearn:LabelEncoder 导入 ScikitLearn:LabelEncoder 不起作用。 :( 我错过了什么?

标签: scikit-learn julia xgboost


【解决方案1】:

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

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

现在,考虑一下你 usingAB 并尝试调用 f 的情况:

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 的意思;是A.f 还是B.f?您可以通过明确消除对 f 的任何调用的歧义来解决此问题:

julia> using .A, .B

julia> A.f()
f from A

julia> B.f()
f from B

如果您希望能够仅通过名称调用其中一个函数 (f),那么您(用户)必须选择 f 应该指向的内容。您可以通过将其明确定义为 import 语句的一部分来做到这一点:

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

【讨论】:

  • 谢谢。我试图在另一轮做事。只从 ScikitLearn 导入我需要的东西。目前似乎有一些错误。因此,我只是按照您的示例指定了 predict 函数:using XGBoost using XGBoost:predict 它解决了我所有的 ScikitLearn 问题
猜你喜欢
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多