Article image
André Barbosa
André Barbosa09/04/2024 12:43
Compartilhe

Bike rental statistics - Azure AI Fundamentals - ML Studio

  • #Azure Machine Learning
  • #Python
  • #API Rest

Bike rental statistics

criado, feito no

Azure AI Fundamentals - ML Studio

ūüöÄūü§Įūü§© Adorei, quebrei a cabe√ßa, solucionei os problemas.

‚úÖ Deu tudo certo!

Criei o projeto "Bike rental statistics" no Azure AI | Microsoft Learning Studio, um projeto de aprendizado de m√°quina que usa dados hist√≥ricos de aluguel de bicicletas para fazer previs√Ķes de estat√≠stica de demanda sobre futuros alugu√©is.

Criei um endpoint que é um serviço de pontuação (scoring) que foi publicado a partir do modelo de aprendizado de máquina treinado.

Este servi√ßo de pontua√ß√£o √© uma API RESTful que pode receber dados de entrada, pass√°-los pelo modelo de aprendizado de m√°quina e retornar as previs√Ķes do modelo.

A partir daí o arquivo `swagger.json` foi criado e é uma descrição deste serviço de pontuação.

Ele define os endpoints da API, os tipos de solicita√ß√Ķes HTTP que eles aceitam (por exemplo, GET, POST), os formatos de dados de entrada que eles esperam, e os formatos de dados de sa√≠da que eles retornam.

Os usu√°rios podem enviar solicita√ß√Ķes para este servi√ßo de pontua√ß√£o para obter previs√Ķes em tempo real do modelo de aprendizado de m√°quina.

Por exemplo, eles podem enviar dados sobre as condi√ß√Ķes clim√°ticas e a hora do dia, e o servi√ßo de pontua√ß√£o retornar√° uma previs√£o do n√ļmero de alugu√©is de bicicletas que s√£o esperados sob essas condi√ß√Ķes.

Veja bem, que esta é uma descrição genérica do projeto que tem características e funcionalidades adicionais.

No, come√ßo a gente bate cabe√ßa. ūü§Į

Me perguntei várias vezes como é possível criar um arquivo JSON?

Após idas e vindas no StackOverFlow, no JSON (JavaScript Object Notation) e outros tantos.

Sim, eu vi que é possível ler um arquivo JSON em várias linguagens de programação.

Abaixo um exemplo de como pode ser feito em Python:

```python

import json


# Abra o arquivo json
with open('path_to_your_file.json') as f:
  data = json.load(f)


# Agora a vari√°vel data cont√©m o conte√ļdo do arquivo json como um dicion√°rio Python
print(data)

Lembrando de substituir 'path_to_your_file.json' pelo caminho para o arquivo JSON que você deseja ler.

;)

E para consumir APIs?

Para buscar dados de APIs, você geralmente fará uma solicitação HTTP para o endpoint da API e receberá os dados como resposta.

Abaixo, um exemplo de como você pode fazer isso em Python, usando a biblioteca requests:

```python

import requests


response = requests.get('http://api_endpoint')


# A resposta da API é geralmente um arquivo json
data = response.json()


print(data)

Lembre, substitua 'http://api_endpoint' pelo endpoint da API que você deseja acessar.

;)

Agora, a título de informação plus, para buscar dados diretamente de um Banco de Dados (BD), o processo é um pouco diferente. Porque depende do tipo de DB que você está usando.

Em Python, você pode usar a biblioteca sqlite3 para trabalhar com bancos de dados SQLite, a biblioteca psycopg2 para trabalhar com bancos de dados PostgreSQL e outros.

Antes de continuar quero esclarecer que: não tem relação buscar dados diretamente de um Banco de Dados (BD) com endpoint que eu criei no Azure AI ML Studio que é uma API que recebe dados.

Por quê? porque, buscar dados diretamente de um BD e interagir com um endpoint de Machine Learning no Azure AI ML Studio são duas tarefas distintas.

No entanto, (sempre tem possibilidades) eles podem estar relacionados em um fluxo de trabalho de Machine Learning.

Por exemplo, você pode buscar dados de um DB para treinar um modelo de Machine Learning.

Depois de treinar o modelo, voc√™ pode hosped√°-lo no Azure AI ML Studio e criar um endpoint. Ent√£o, voc√™ pode enviar novos dados para esse endpoint para obter previs√Ķes do modelo.

Mas, fique atento ūüö® a a√ß√£o de buscar dados de DB e a a√ß√£o de enviar dados para um endpoint de Machine Learning s√£o diferentes e usam diferentes conjuntos de ferramentas e habilidades e √© assunto para uma outra postagem.

Continuando, no Azure AI e no ML Studio, eu criei um modelo de aprendizado de m√°quina e o expus como um servi√ßo web (que ainda estou construindo usando a framework Next.js), que √© uma API que pode ser acessada por meio de solicita√ß√Ķes HTTP.

Essa API retorna previs√Ķes do seu modelo em formato JSON.

Quando se faz uma solicita√ß√£o para essa API, voc√™ envia dados de entrada em formato JSON, e a API retorna previs√Ķes, tamb√©m em formato JSON. Portanto, voc√™ estar√° lendo e escrevendo dados JSON quando interage com essa API.

Novamente para deixar bem claro: a leitura de um arquivo JSON a partir de um sistema de arquivos local ou a leitura de dados de um DB são tarefas diferentes que requerem código diferente.

O código que você usaria para interagir com a API do ML Studio não seria o igual que você usaria para ler um arquivo JSON local ou buscar dados de um DB.

mas neste meu caso, que você pode conferir no meu repositório no GitHub: AzureAI-MLStudio-BikeRental-EndPoints, o que estou fazendo no meu código Python?

```python
import urllib.request
import json
import os
import ssl


def allowSelfSignedHttps(allowed):
  # bypass the server certificate verification on client side
  if allowed and not os.environ.get('PYTHONHTTPSVERIFY', '') and getattr(ssl, '_create_unverified_context', None):
      ssl._create_default_https_context = ssl._create_unverified_context


allowSelfSignedHttps(True) # this line is needed if you use self-signed certificate in your scoring service.


# Request data goes here
# The example below assumes JSON formatting which may be updated
# depending on the format your endpoint expects.
# More information can be found here:
# https://docs.microsoft.com/azure/machine-learning/how-to-deploy-advanced-entry-script
data =  {
"Inputs": {
  "data": [
    {
      "day": 22,
      "mnth": 3,
      "year": 2024,
      "season": 0,
      "holiday": 0,
      "weekday": 0,
      "workingday": 0,
      "weathersit": 0,
      "temp": 0.0,
      "atemp": 0.0,
      "hum": 0.0,
      "windspeed": 0.0
    }
  ]
},
"GlobalParameters": 0.0
}


body = str.encode(json.dumps(data))


url = 'http://599ecad4-5061-4cf3-88ec-7caf2ae8f9a8.eastus.azurecontainer.io/score'




headers = {'Content-Type':'application/json'}


req = urllib.request.Request(url, body, headers)


try:
  response = urllib.request.urlopen(req)


  result = response.read()
  print(result)
except urllib.error.HTTPError as error:
  print("The request failed with status code: " + str(error.code))


  # Print the headers - they include the requert ID and the timestamp, which are useful for debugging the failure
  print(error.info())
  print(error.read().decode("utf8", 'ignore'))
  ```

Neste script em Python estou fazendo uma solicitação HTTP POST para um serviço de pontuação de Machine Learning hospedado no Azure.

O servi√ßo de pontua√ß√£o √© uma API que recebe dados de entrada, passa-os por um modelo de aprendizado de m√°quina e retorna as previs√Ķes do modelo.

Aqui est√° o que cada parte do script est√° fazendo:

  1. A fun√ß√£o¬†allowSelfSignedHttps¬†√© usada para permitir conex√Ķes HTTPS com certificados autoassinados. Isso √© √ļtil se o seu servi√ßo de pontua√ß√£o estiver usando um certificado autoassinado, mas n√£o √© necess√°rio se o seu servi√ßo estiver usando um certificado de uma autoridade de certifica√ß√£o confi√°vel.
  2. A vari√°vel¬†data¬†cont√©m os dados de entrada que ser√£o enviados para o servi√ßo de pontua√ß√£o. Neste caso, os dados de entrada s√£o um √ļnico registro com campos como "day", "mnth", "year", etc.
  3. A variável body contém os dados de entrada codificados como uma string JSON.
  4. A variável url contém o URL do serviço de pontuação.
  5. A vari√°vel¬†headers¬†cont√©m os cabe√ßalhos HTTP que ser√£o enviados com a solicita√ß√£o. Neste caso, o √ļnico cabe√ßalho √© 'Content-Type', que √© definido como 'application/json' para indicar que o corpo da solicita√ß√£o cont√©m dados JSON.
  6. req é um objeto Request que representa a solicitação HTTP que será enviada para o serviço de pontuação.
  7. O bloco¬†try/except¬†tenta enviar a solicita√ß√£o para o servi√ßo de pontua√ß√£o e imprimir a resposta. Se a solicita√ß√£o falhar, ele imprime informa√ß√Ķes sobre o erro.

Portanto, este script est√° enviando dados para um servi√ßo de pontua√ß√£o de Machine Learning no Azure e imprimindo as previs√Ķes que o servi√ßo retorna.

Neste script Python, eu estou de fato trabalhando com dados JSON, mas de uma maneira específica.

Estou criando um objeto JSON (a variável data), convertendo-o em uma string JSON (a variável body), e enviando essa string JSON como parte de uma solicitação HTTP POST para um serviço de pontuação.

Quando recebo a resposta do serviço de pontuação, leio os dados de resposta (a variável result), que também estão em formato JSON.

Ent√£o, embora eu n√£o esteja lendo um arquivo JSON do seu sistema de arquivos local, voc√™ est√° lendo e escrevendo dados JSON como parte das solicita√ß√Ķes e respostas HTTP.

Aqui estão as partes relevantes do código:

# Criando um objeto JSON
data =  {
"Inputs": {
  "data": [
    {
      "day": 22,
      "mnth": 3,
      "year": 2024,
      "season": 0,
      "holiday": 0,
      "weekday": 0,
      "workingday": 0,
      "weathersit": 0,
      "temp": 0.0,
      "atemp": 0.0,
      "hum": 0.0,
      "windspeed": 0.0
    }
  ]
},
"GlobalParameters": 0.0
}

# Convertendo o objeto JSON em uma string JSON
body = str.encode(json.dumps(data))

# ...

# Lendo a resposta JSON
result = response.read()
print(result)

image

Imagem: JSON e a Predição da quantidade de bikes, em m3, d22, y2024, como resultado do aprendizado de máquina, que eu desenvolvi, no Azure AI | Machine Learning Studio.

Enfim, fiz uma leitura de um JSON?

image

Imagem: Script em Python e a Predição da quantidade de bikes, em m3, d22, y2024, como resultado do aprendizado de máquina, que eu desenvolvi, no Notebook do Azure AI | Machine Learning Studio.

Sim, fiz a leitura de um JSON no script Python.

Por enquanto é isto.

Espero que tenha ajudado e que tenha gostado.

:) Obrigado!

Compartilhe
Coment√°rios (0)