Я пытаюсь использовать пакет R JuliaConnectoR
для работы с пакетом Julia EvoTrees
.
Я вижу, как я могу передать числовые параметры, определенные в R, в Julia (например, двойное значение преобразуется в Float64), но я не понимаю, как я могу определить в R параметр, описывающий тип в Julia.
Ниже приведен пример:
n_obs = 100
n_features = 100
nrounds = 10L
set.seed(20221224)
x_train = matrix(ncol= n_features, rnorm(n_obs*n_features))
y_train = rnorm(n_obs)
library(JuliaConnectoR)
evoTrees = juliaImport("EvoTrees")
params_evo = evoTrees$EvoTreeRegressor(nrounds=nrounds , loss = as.symbol("linear"), alpha=0.5,lambda=0.0,gamma=0.0)
evoTrees_model = evoTrees$fit_evotree(params_evo, x_train, y_train, print_every_n = 50L)
Вызов evoTrees$EvoTreeRegressor
работает нормально, например, я могу передать символ юлии :linear
с помощью as.symbol("linear")
, и передача числовых параметров, таких как nrounds
, тоже ясна. Однако я получаю следующее сообщение об ошибке для вызова подгонки evoTrees$fit_evotree
:
Ошибка: оценка в Юлии не удалась. Исходное сообщение об ошибке Джулии: MethodError: нет соответствия метода fit_evotree(::EvoTrees.EvoTreeRegressor{EvoTrees.Linear, Float32}, ::Matrix{Float64}, ::Vector{Float64}; print_every_n=50) Ближайший кандидатами являются: fit_evotree(::Union{EvoTrees.EvoTreeClassifier{L, T}, EvoTrees.EvoTreeCount{L, T}, EvoTrees.EvoTreeGaussian{L, T}, EvoTrees.EvoTreeMLE{L, T}, EvoTrees.EvoTreeRegressor{L, T}}; х_поезд, y_train, w_train, offset_train, x_eval, y_eval, w_eval, offset_eval, метрика, Early_stopping_rounds, print_every_n, подробность, fnames, return_logger), где {L, T} в C:\Users\rwarn.julia\packages\EvoTrees\ayRL8\src\fit.jl:309 Stacktrace: [1] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::Base.Pairs{Символ, Int64, Кортеж{Символ}, NamedTuple{(:print_every_n,), Tuple{Int64}}}) @ Base .\essentials.jl:731 [2] оценить!(call::Main.RConnector.Call, коммуникатор::Main.RConnector.CommunicatoR{Sockets.TCPSocket}) @ Main.RConnector C:\Users\rwarn\Documents\R\win-l
Я интерпретирую эту ошибку следующим образом: без передачи типа через параметр Julia T
предполагаются типы данных Float32. Однако данные поезда в типе R double переводятся в тип Julia Float64.
Я думаю, что решением было бы передать Float64 типа Julia в evoTrees$EvoTreeRegressor
. Как мне это сделать? Спасибо!
Информация: ЮлияКоннектор: v1.1.1 Эводеревья v0.14.2
sessionInfo() R версия 4.1.1 (10 августа 2021 г.) Платформа: x86_64-w64-mingw32/x64 (64-разрядная версия) Работает под: Windows 10 x64 (сборка 22621)
Матричные продукты: по умолчанию
локаль: [1] LC_COLLATE=немецкий_Австрия.1252 LC_CTYPE=Немецкая_Австрия.1252 LC_MONETARY=Немецкая_Австрия.1252 [4] LC_NUMERIC=C LC_TIME=немецкий_Австрия.1252
прикрепленные базовые пакеты: [1] stats graphics grDevices utils
база методов наборов данныхдругие прикрепленные пакеты: [1] JuliaConnectoR_1.1.1
загружается через пространство имен (и не прикрепляется): [1]compiler_4.1.1 tictoc_1.0.1 инструменты_4.1.1
Я имею в виду, что данные поезда имеют тип double в R. Вопрос в том, как определить параметр типа T со значением Float64, чтобы сообщить evotrees, что данные находятся в Float64. Как я понимаю, тип сам по себе является типом в Julia(T) и я хотел бы задать его через juliaconnectoR. Спасибо!
Я понял тебя в самом начале. Но я подумал, что вы должны использовать функцию типа double
для преобразования типа объекта (извините, я не знаком с R).
Да, вы правы, по умолчанию предполагается тип Float32
. Его можно увидеть в коде здесь.
Конструктор также принимает аргумент ключевого слова T
для определения типа.
Если вы хотите передать тип Julia Float64
в качестве значения для этого аргумента, вы можете сделать это, как показано ниже:
params_evo = evoTrees$EvoTreeRegressor(T = juliaExpr("Float64"),
rounds=nrounds, loss = as.symbol("linear"), alpha=0.5, lambda=0.0, gamma=0.0)
Функция juliaExpr
класса JuliaConnectoR
позволяет использовать произвольные выражения Джулии в вызовах из R.
Выражения оцениваются в Julia, и полученные значения используются здесь.
Это полезно в подобных ситуациях, когда аргумент функции не может быть правильно выражен в R.
Альтернативой этому является использование функции juliaEval
, которая даст тот же результат, что и juliaExpr
в этом случае, но перед вызовом функции совершит круговой путь от Джулии к R.
Созданный объект EvoTreeRegressor
теперь использует тип Julia Float64
:
> params_evo
<Julia object of type EvoTrees.EvoTreeRegressor{EvoTrees.Linear, Float64}>
EvoTrees.EvoTreeRegressor{EvoTrees.Linear, Float64}(10, 0.0, 0.0, 0.1, 5, 1.0, 1.0, 1.0, 32, 0.5, Dict{Int64, Int64}(), Random.TaskLocalRNG(), "cpu")
Спасибо, juliaExpr
было решением :)
данные поезда в типе R double переводятся в тип Julia Float64. Но я не вижу
double
в вашем коде.