Módulo Executar Script R

Este artigo descreve como usar o módulo Executar Script R para executar o código R em seu pipeline do Azure Machine Learning Designer.

Com o R, você pode realizar tarefas que não são suportadas por módulos existentes, como:

  • Criar transformações de dados personalizadas
  • Usar suas próprias métricas para avaliar previsões
  • Criar modelos usando algoritmos que não são implementados como módulos independentes no designer

Suporte à versão R

O Azure Machine Learning Designer usa a distribuição CRAN (Rede Abrangente de Arquivos R) do R. A versão usada no momento é a CRAN 3.5.1.

Pacotes do R com suporte

O ambiente do R é pré-instalado com mais de 100 pacotes. Para ver uma lista completa, confira a seção Pacotes do R pré-instalados.

Você também pode adicionar o código a seguir a qualquer módulo Executar Script R para ver os pacotes instalados.

azureml_main <- function(dataframe1, dataframe2){
  print("R script run.")
  dataframe1 <- data.frame(installed.packages())
  return(list(dataset1=dataframe1, dataset2=dataframe2))
}

Observação

Se o pipeline contiver vários módulos Executar Script R que precisem de pacotes que não estejam na lista pré-instalada, instale os pacotes em cada módulo.

Instalando pacotes R

Nesse caso, para instalar pacotes do R adicionais, use o método install.packages(). Os pacotes são instalados para cada módulo Executar Script R. Eles não são compartilhados entre outros módulos Executar Script R.

Observação

NÃO é recomendável instalar o pacote do R do pacote de script. É recomendável instalar pacotes diretamente no editor de scripts. Especifique o repositório CRAN ao instalar pacotes, como install.packages("zoo",repos = "https://cloud.r-project.org").

Aviso

O módulo Executar Script R não dá suporte à instalação de pacotes que exijam compilação nativa, como o pacote qdap que requer JAVA e o pacote drc que requer C++. Isso porque esse módulo é executado em um ambiente pré-instalado com permissão não administrativa. Não instale pacotes pré-criados no/para Windows, pois os módulos de designer estão em execução no Ubuntu. Para verificar se um pacote é pré-compilado no Windows, você pode ir até CRAN e pesquisar seu pacote, baixar um arquivo binário de acordo com seu sistema operacional e verificar a parte de Compilação: no arquivo de DESCRIÇÃO. Veja a seguir um exemplo: Descrição do pacote do R

Este exemplo mostra como instalar o Zoo:

# R version: 3.5.1
# The script MUST contain a function named azureml_main,
# which is the entry point for this module.

# Note that functions dependent on the X11 library,
# such as "View," are not supported because the X11 library
# is not preinstalled.

# The entry point function MUST have two input arguments.
# If the input port is not connected, the corresponding
# dataframe argument will be null.
#   Param<dataframe1>: a R DataFrame
#   Param<dataframe2>: a R DataFrame
azureml_main <- function(dataframe1, dataframe2){
  print("R script run.")
  
  if(!require(zoo)) install.packages("zoo",repos = "https://cloud.r-project.org")
  library(zoo)
  # Return datasets as a Named List
  return(list(dataset1=dataframe1, dataset2=dataframe2))
}

Observação

Antes de instalar um pacote, verifique se ele já existe, para que você não repita uma instalação. As instalações repetidas podem fazer com que as solicitações de serviço Web atinjam o tempo limite.

Acesso ao conjunto de dados registrado

Você pode conferir o seguinte código de exemplo para acessar os conjuntos de dados registrados no seu workspace:

azureml_main <- function(dataframe1, dataframe2){
  print("R script run.")
  run = get_current_run()
  ws = run$experiment$workspace
  dataset = azureml$core$dataset$Dataset$get_by_name(ws, "YOUR DATASET NAME")
  dataframe2 <- dataset$to_pandas_dataframe()
  # Return datasets as a Named List
  return(list(dataset1=dataframe1, dataset2=dataframe2))
}

Como configurar o módulo Executar Script R

O módulo Executar Script R contém um código de exemplo como ponto de partida.

Diagrama de entradas para um módulo R

Os conjuntos de dados armazenados no designer são convertidos automaticamente em um quadro de dados do R quando carregados com esse módulo.

  1. Adicione o módulo Executar Script R ao seu pipeline.

  2. Conecte as entradas que o script precisa. As entradas são opcionais e podem incluir dados e código R adicional.

    • DataSet1: referência à primeira entrada como dataframe1. O conjunto de dados de entrada deve ser formatado como um arquivo CSV, TSV ou ARFF. Ou você pode conectar um conjunto de dados do Azure Machine Learning.

    • Dataset2: referência à segunda entrada como dataframe2. Esse conjuntos de dados também deve ser formatado como um arquivo CSV, TSV ou ARFF ou como um conjunto de dados do Azure Machine Learning.

    • Pacote de Script: a terceira entrada aceita arquivos .zip. Um arquivo compactado .zip pode conter vários arquivos e vários tipos de arquivo.

  3. Na caixa de texto Script R digite ou cole um script R válido.

    Observação

    Tenha cuidado ao escrever o seu script. Verifique se não há erros de sintaxe, como o uso de variáveis não declaradas ou módulos ou funções não importadas. Preste uma atenção extra à lista de pacotes pré-instalados no final deste artigo. Para usar pacotes que não estejam listados, instale-os em seu script. Um exemplo é install.packages("zoo",repos = "https://cloud.r-project.org").

    Para ajudá-lo a iniciar, a caixa de texto Script R é preenchida previamente com o código de exemplo, que você pode editar ou substituir.

    # R version: 3.5.1
    # The script MUST contain a function named azureml_main,
    # which is the entry point for this module.
    
    # Note that functions dependent on the X11 library,
    # such as "View," are not supported because the X11 library
    # is not preinstalled.
    
    # The entry point function MUST have two input arguments.
    # If the input port is not connected, the corresponding
    # dataframe argument will be null.
    #   Param<dataframe1>: a R DataFrame
    #   Param<dataframe2>: a R DataFrame
    azureml_main <- function(dataframe1, dataframe2){
    print("R script run.")
    
    # If a .zip file is connected to the third input port, it's
    # unzipped under "./Script Bundle". This directory is added
    # to sys.path.
    
    # Return datasets as a Named List
    return(list(dataset1=dataframe1, dataset2=dataframe2))
    }
    

    A função de ponto de entrada precisa ter os argumentos de entrada Param<dataframe1> e Param<dataframe2>, mesmo quando esses argumentos não sejam usados no seu script.

    Observação

    Os dados passados para o módulo Executar Script R são referenciados como dataframe1 e dataframe2, que é diferente do Azure Machine Learning Designer(a referência do designer como dataset1, dataset2). Certifique-se de que os dados de entrada são referenciados corretamente em seu script.

    Observação

    O código R existente pode precisar de pequenas alterações para ser executado em um pipeline do designer. Por exemplo, os dados de entrada que você fornece no formato CSV devem ser explicitamente convertidos para um conjunto de dados antes de você poder usá-los em seu código. Os tipos de dados e colunas usados na linguagem R também apresentam algumas diferenças dos tipos de dados e colunas usados no designer.

  4. Se o seu script tiver mais de 16 KB, use a porta de Pacote de Script para evitar erros como CommandLine excede o limite de 16597 caracteres.

    1. Agrupe o script e outros recursos personalizados em um arquivo zip.
    2. Carregue o arquivo zip como um Conjunto de Dados de Arquivo para o estúdio.
    3. Arraste o módulo do conjunto de dados na lista Conjuntos de dados no painel do módulo à esquerda na página criação do designer.
    4. Conecte o módulo do conjunto de dados na porta Pacote de Script do módulo Executar Script R.

    Veja a seguir o código de exemplo para consumir o script no pacote de script:

    azureml_main <- function(dataframe1, dataframe2){
    # Source the custom R script: my_script.R
    source("./Script Bundle/my_script.R")
    
    # Use the function that defined in my_script.R
    dataframe1 <- my_func(dataframe1)
    
    sample <- readLines("./Script Bundle/my_sample.txt")
    return (list(dataset1=dataframe1, dataset2=data.frame("Sample"=sample)))
    }
    
  5. Para Semente Aleatória, insira um valor a ser usado dentro do ambiente de R como o valor de semente aleatória. Este parâmetro é equivalente a chamar set.seed(value) no código de R.

  6. Enviar o pipeline.

Resultados

Os módulos Executar Script R podem retornar várias saídas, mas elas devem ser fornecidas como quadros de dados do R. O designer converte automaticamente os quadros de dados em conjuntos de dados para obter compatibilidade com outros módulos.

As mensagens e os erros padrões do R são retornados para o log do módulo.

Se você precisar imprimir resultados no script R, poderá encontrar os resultados impressos em 70_driver_log na guia Saídas + logs no painel direito do módulo.

Scripts de exemplo

Há várias maneiras de estender seu pipeline usando scripts R personalizados. Esta seção fornece um código de exemplo para tarefas comuns.

Adicionar um script R como uma entrada

O módulo Executar Script R dá suporte a arquivos de script R arbitrários como entradas. Para usá-los, você deve carregá-los em seu espaço de trabalho como parte do arquivo. zip.

  1. Para carregar um arquivo. zip que contenha o código R para seu espaço de trabalho, vá para a página de ativos do Conjuntos de dados. Selecione Criar conjunto de dados e, em seguida, selecione Do arquivo local e a opção de tipo de conjunto de dados Arquivo.

  2. Verifique se o arquivo compactado .zip aparece em Meus conjuntos de dados na categoria conjuntos de dados na árvore de módulos à esquerda.

  3. Conecte o conjunto de dados à porta de entrada do Pacote De Script.

  4. Todos os arquivos no arquivo. zip estão disponíveis durante o tempo de execução do pipeline.

    Se o arquivo do pacote de script contiver uma estrutura de diretório, a estrutura será preservada. Mas você deve alterar seu código para preceder o diretório ./Pacote de Script para o caminho.

Processar dados

O exemplo a seguir mostra como dimensionar e normalizar dados de entrada:

# R version: 3.5.1
# The script MUST contain a function named azureml_main,
# which is the entry point for this module.

# Note that functions dependent on the X11 library,
# such as "View," are not supported because the X11 library
# is not preinstalled.

# The entry point function MUST have two input arguments.
# If the input port is not connected, the corresponding
# dataframe argument will be null.
#   Param<dataframe1>: a R DataFrame
#   Param<dataframe2>: a R DataFrame
azureml_main <- function(dataframe1, dataframe2){
  print("R script run.")
  # If a .zip file is connected to the third input port, it's
  # unzipped under "./Script Bundle". This directory is added
  # to sys.path.
  series <- dataframe1$width
  # Find the maximum and minimum values of the width column in dataframe1
  max_v <- max(series)
  min_v <- min(series)
  # Calculate the scale and bias
  scale <- max_v - min_v
  bias <- min_v / dis
  # Apply min-max normalizing
  dataframe1$width <- dataframe1$width / scale - bias
  dataframe2$width <- dataframe2$width / scale - bias
  # Return datasets as a Named List
  return(list(dataset1=dataframe1, dataset2=dataframe2))
}

Ler um arquivo .zip como entrada

Este exemplo mostra como usar um conjuntos de dados em um arquivo .zip como uma entrada para o módulo Executar Script R.

  1. Crie o arquivo de dados no formato CSV e nomeie-o como mydatafile.csv.
  2. Crie um arquivo .zip e adicione o arquivo CSV ao arquivo.
  3. Carregue o arquivo .zip no workspace do Azure Machine Learning.
  4. Conecte o conjunto de dados resultante para a entrada ScriptBundle do seu módulo Executar Script R.
  5. Use o código a seguir para ler os dados CSV do arquivo .zip.
azureml_main <- function(dataframe1, dataframe2){
  print("R script run.")
  mydataset<-read.csv("./Script Bundle/mydatafile.csv",encoding="UTF-8");  
  # Return datasets as a Named List
  return(list(dataset1=mydataset, dataset2=dataframe2))
}

Replicar linhas

Este exemplo mostra como replicar registros positivos em um conjuntos de dados para equilibrar o exemplo:

azureml_main <- function(dataframe1, dataframe2){
  data.set <- dataframe1[dataframe1[,1]==-1,]  
  # positions of the positive samples
  pos <- dataframe1[dataframe1[,1]==1,]
  # replicate the positive samples to balance the sample  
  for (i in 1:20) data.set <- rbind(data.set,pos)  
  row.names(data.set) <- NULL
  # Return datasets as a Named List
  return(list(dataset1=data.set, dataset2=dataframe2))
}

Passando objetos R entre módulos Executar Script R

Você pode passar objetos R entre instâncias do módulo Executar Script R usando o mecanismo de serialização interna. Este exemplo pressupõe que você deseja mover o objeto R chamado A entre dois módulos Executar Script R.

  1. Adicione o módulo Executar Script R ao seu pipeline. Em seguida, insira o seguinte código na caixa de texto Script R para criar um objeto serializado A como uma coluna na tabela de dados de saída do módulo:

    azureml_main <- function(dataframe1, dataframe2){
      print("R script run.")
      # some codes generated A
    
      serialized <- as.integer(serialize(A,NULL))  
      data.set <- data.frame(serialized,stringsAsFactors=FALSE)
    
      return(list(dataset1=data.set, dataset2=dataframe2))
    }
    

    A conversão explícita do tipo inteiro é feita porque a função de serialização gera dados de saída no formato R Raw, que não é suportado pelo designer.

  2. Adicione uma segunda instância do módulo Executar Script R e conecte-a à porta de saída do módulo anterior.

  3. Digite o seguinte código na caixa de texto Script R para extrair o objeto A da tabela de dados de entrada.

    azureml_main <- function(dataframe1, dataframe2){
      print("R script run.")
      A <- unserialize(as.raw(dataframe1$serialized))  
      # Return datasets as a Named List
      return(list(dataset1=dataframe1, dataset2=dataframe2))
    }
    

Pacotes do R pré-instalados

Os seguintes pacotes do R pré-instalados estão disponíveis no momento:

Pacote Versão
askpass 1,1
assertthat 0.2.1
backports 1.1.4
base 3.5.1
base64enc 0.1-3
BH 1.69.0-1
bindr 0.1.1
bindrcpp 0.2.2
bitops 1.0-6
boot 1.3-22
broom 0.5.2
callr 3.2.0
sinal de interpolação 6.0-84
caTools 1.17.1.2
cellranger 1.1.0
classe 7.3-15
cli 1.1.0
clipr 0.6.0
cluster 2.0.7-1
codetools 0.2-16
colorspace 1.4-1
compiler 3.5.1
crayon 1.3.4
curl 3.3
data.table 1.12.2
conjuntos de dados 3.5.1
DBI 1.0.0
dbplyr 1.4.1
digest 0.6.19
dplyr 0.7.6
e1071 1.7-2
evaluate 0,14
fansi 0.4.0
forcats 0.3.0
foreach 1.4.4
foreign 0.8-71
fs 1.3.1
gdata 2.18.0
Genéricos 0.0.2
ggplot2 3.2.0
glmnet 2.0-18
glue 1.3.1
gower 0.2.1
gplots 3.0.1.1
elemento gráfico 3.5.1
grDevices 3.5.1
grade 3.5.1
gtable 0.3.0
gtools 3.8.1
haven 2.1.0
highr 0,8
hms 0.4.2
htmltools 0.3.6
httr 1.4.0
ipred 0.9-9
iterators 1.0.10
jsonlite 1.6
KernSmooth 2.23-15
knitr 1.23
labeling 0.3
lattice 0.20-38
lava 1.6.5
lazyeval 0.2.2
lubridate 1.7.4
magrittr 1.5
markdown 1
MASS 7.3-51.4
Matriz 1.2-17
methods 3.5.1
mgcv 1.8-28
mime 0,7
ModelMetrics 1.2.2
modelr 0.1.4
munsell 0.5.0
nlme 3.1-140
nnet 7.3-12
numDeriv 2016.8-1.1
openssl 1.4
parallel 3.5.1
pillar 1.4.1
pkgconfig 2.0.2
plogr 0.2.0
plyr 1.8.4
prettyunits 1.0.2
processx 3.3.1
prodlim 2018.04.18
progress 1.2.2
ps 1.3.0
purrr 0.3.2
quadprog 1.5-7
quantmod 0.4-15
R6 2.4.0
randomForest 4.6-14
RColorBrewer 1.1-2
Rcpp 1.0.1
RcppRoll 0.3.0
readr 1.3.1
readxl 1.3.1
recipes 0.1.5
rematch 1.0.1
reprex 0.3.0
reshape2 1.4.3
reticulate 1.12
rlang 0.4.0
rmarkdown 1.13
ROCR 1.0-7
rpart 4.1-15
rstudioapi 0,1
rvest 0.3.4
scales 1.0.0
selectr 0.4-1
spatial 7.3-11
splines 3.5.1
SQUAREM 2017.10-1
stats 3.5.1
stats4 3.5.1
stringi 1.4.3
stringr 1.3.1
survival 2.44-1.1
sys 3.2
tcltk 3.5.1
tibble 2.1.3
tidyr 0.8.3
tidyselect 0.2.5
tidyverse 1.2.1
timeDate 3043.102
tinytex 0.13
tools 3.5.1
tseries 0.10-47
TTR 0.23-4
utf8 1.1.4
utils 3.5.1
vctrs 0.1.0
viridisLite 0.3.0
whisker 0.3-2
withr 2.1.2
xfun 0,8
xml2 1.2.0
xts 0.11-2
yaml 2.2.0
zeallot 0.1.0
zoo 1.8-6

Próximas etapas

Confira o conjunto de módulos disponíveis no Azure Machine Learning.