Как передать тип Julia в R-пакете JuliaConnectoR

Я пытаюсь использовать пакет 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

данные поезда в типе R double переводятся в тип Julia Float64. Но я не вижу double в вашем коде.

Shayan 02.01.2023 08:45

Я имею в виду, что данные поезда имеют тип double в R. Вопрос в том, как определить параметр типа T со значением Float64, чтобы сообщить evotrees, что данные находятся в Float64. Как я понимаю, тип сам по себе является типом в Julia(T) и я хотел бы задать его через juliaconnectoR. Спасибо!

Richi W 02.01.2023 09:04

Я понял тебя в самом начале. Но я подумал, что вы должны использовать функцию типа double для преобразования типа объекта (извините, я не знаком с R).

Shayan 02.01.2023 10:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, вы правы, по умолчанию предполагается тип 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 было решением :)

Richi W 02.01.2023 20:16

Другие вопросы по теме