Определение конфликтующих модулей в Юлии - PullRequest
3 голосов
/ 30 сентября 2019

Я новичок в Юлии (используется с MATLAB). Я беру несколько наборов данных, очищаю их и кодирую категориальные переменные, используя инструменты, которые доступны в ScikitLearn, затем запускаю XGBoost чистых данных.

Однако я не могу сделать прогноз, используя обученную модель XGBoost, потому что и ScitkitLearn, и XGBoostесть функция с именем predict. См. Сообщение об ошибке ниже:

ПРЕДУПРЕЖДЕНИЕ: экспорт ScikitLearn и XGBoost "прогнозируют";его использование в модуле Main должно быть квалифицировано. ERROR: LoadError: UndefVarError: предикат не определен

Проблема в том, что я не могу определить функцию predict для XGBoost как XGBoost.predict, поскольку это неработать, и это, кажется, единственное решение, которое я знаю.

Кроме того, я не могу найти или понять, как я могу загрузить только определенные модули из ScikitLearn без загрузки функции предсказания. например, формат import MLDataUtils.splitobs работает для большинства пакетов, но ScikitLearn.preprocessing не работает.

1 Ответ

2 голосов
/ 30 сентября 2019

Вот MWE вашей проблемы (два модуля export с одинаковым именем):

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

Теперь рассмотрим ситуацию, когда вы using оба A и B ипопробуйте позвонить 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

Причина, по которой это не удается, заключается в том, что Джулия не знает, что вы имеете в виду под f;это A.f или B.f? Вы можете решить эту проблему, явно устраняя неоднозначность любого вызова f:

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
...