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)