Categorias
Biblioteca Ciência de Dados Machine Learning Python

Tutorial PyTorch: um guia rápido para você entender agora os fundamentos do PyTorch

O Python está bem estabelecido como a linguagem ideal para ciência de dados e aprendizado de máquina, e isso se deve em parte à biblioteca de ML de código aberto PyTorch.

A combinação do PyTorch com ferramentas poderosas de construção de rede neural profunda e fáceis de uso, torna-o uma escolha popular entre cientistas de dados. À medida que sua popularidade cresce, mais e mais empresas estão mudando do TensorFlow para o PyTorch, tornando-se agora o melhor momento para começar a usar o PyTorch.

Hoje, vamos te ajudar a entender o que torna o PyTorch tão popular, alguns fundamentos do uso dessa biblioteca e ajudá-lo a fazer seus primeiros modelos computacionais.

 

O que é o PyTorch?

O PyTorch é uma biblioteca Python de aprendizado de máquina de código aberto usada para implementações de aprendizado profundo, como visão computacional (usando TorchVision) e processamento de linguagem natural. Essa biblioteca foi desenvolvida pelo laboratório de pesquisa de IA do Facebook (FAIR) em 2016 e, desde então, é adotada nos campos da ciência de dados e ML.

O PyTorch torna o aprendizado de máquina intuitivo para aqueles que já estão familiarizados com Python e tem ótimos recursos como suporte OOP e gráficos de computação dinâmica.

Junto com a construção de redes neurais profundas, o PyTorch também é ótimo para cálculos matemáticos complexos por causa de sua aceleração de GPU. Esse recurso permite que o PyTorch use a GPU do seu computador para acelerar enormemente os cálculos.

Essa combinação de recursos exclusivos e a simplicidade incomparável do PyTorch o torna uma das bibliotecas de aprendizado profundo mais populares, competindo apenas com o TensorFlow pelo primeiro lugar.

 

Por que usar o PyTorch?

Antes do PyTorch, os desenvolvedores usavam cálculos avançados para encontrar as relações entre erros retro-propagados e peso do nó. Redes neurais mais profundas exigiam operações cada vez mais complicadas, o que restringia o aprendizado de máquina em escala e acessibilidade.

Agora, podemos usar bibliotecas de ML para completar automaticamente todo esse cálculo! As bibliotecas de ML podem computar redes de qualquer tamanho ou formato em questão de segundos, permitindo que mais desenvolvedores criem redes maiores e melhores.

O PyTorch leva essa acessibilidade um passo adiante, comportando-se como o Python padrão. Em vez de aprender uma nova sintaxe, você pode usar o conhecimento existente de Python para começar rapidamente. Além disso, você pode usar bibliotecas Python adicionais com PyTorch, como depuradores populares como o PyCharm.

 

PyTorch vs. TensorFlow

A principal diferença entre PyTorch e TensorFlow é a escolha entre simplicidade e desempenho: o PyTorch é mais fácil de aprender (especialmente para programadores Python), enquanto o TensorFlow tem uma curva de aprendizado, mas tem um desempenho melhor e é mais usado.

  • Popularidade: Atualmente, o TensorFlow é a ferramenta ideal para profissionais e pesquisadores do setor porque foi lançado 1 ano antes do PyTorch. No entanto, a taxa de usuários do PyTorch está crescendo mais rápido do que a do TensorFlow, sugerindo que o PyTorch pode em breve ser o mais popular.

  • Paralelismo de dados: O PyTorch inclui paralelismo de dados declarativo, em outras palavras, ele distribui automaticamente a carga de trabalho do processamento de dados em diferentes GPUs para acelerar o desempenho. O TensorFlow tem paralelismo, mas exige que você atribua o trabalho manualmente, o que costuma ser demorado e menos eficiente.

  • Gráficos dinâmicos vs. estáticos: PyTorch tem gráficos dinâmicos por padrão que respondem a novos dados imediatamente. O TensorFlow tem suporte limitado para gráficos dinâmicos usando o TensorFlow Fold, mas usa principalmente gráficos estáticos.

  • Integrações: PyTorch é bom para usar em projetos na AWS por causa de sua estreita conexão por meio do TorchServe. O TensorFlow está bem integrado com o Google Cloud e é adequado para aplicativos móveis devido ao uso da API Swift.

  • Visualização: O TensorFlow tem ferramentas de visualização mais robustas e oferece um controle mais preciso sobre as configurações do gráfico. A ferramenta de visualização Visdom da PyTorch ou outras bibliotecas de plotagem padrão, como matplotlib, não são tão completas quanto o TensorFlow, mas são mais fáceis de aprender.

 

Fundamentos do PyTorch

Tensores

Os tensores PyTorch são variáveis indexadas (arrays) multidimensionais usadas como base para todas as operações avançadas. Ao contrário dos tipos numéricos padrão, os tensores podem ser atribuídos para usar sua CPU ou GPU para acelerar as operações.

Eles são semelhantes a uma matriz NumPy n-dimensional e podem até ser convertidos em uma matriz NumPy em apenas uma única linha.

Tensores vêm em 5 tipos:

  • FloatTensor: 32-bit float
  • DoubleTensor: 64-bit float
  • HalfTensor: 16-bit float
  • IntTensor: 32-bit int
  • LongTensor: 64-bit int

Como acontece com todos os tipos numéricos, você deseja usar o menor tipo que atenda às suas necessidades para economizar memória. O PyTorch usa  FloatTensor como o tipo padrão para todos os tensores, mas você pode mudar isso usando:

torch.set_default_tensor_type(t)                           

Para inicializar dois FloatTensors:

import torch
# initializing tensors
a = torch.tensor(2)
b = torch.tensor(1)

Os tensores podem ser usados como outros tipos numéricos em operações matemáticas simples.    

# addition
    print(a+b)
    # subtraction
    print(b-a)
    # multiplication
    print(a*b)
    # division
    print(a/b)

Você também pode mover tensores para serem manipulados pela GPU usando cuda.

if torch.cuda.is_available():
x = x.cuda()
y = y.cuda()
x + y

Como tensores são matrizes em PyTorch, você pode definir tensores para representar uma tabela de números:

ones_tensor = torch.ones((2, 2)) # tensor containing all ones
rand_tensor = torch.rand((2, 2)) # tensor containing random values

 

Aqui, estamos especificando que nosso tensor deve ser um quadrado 2×2. O quadrado é preenchido com todos os 1 ao usar a função ones() ou números aleatórios ao usar a função rand().

Redes neurais

PyTorch é comumente usado para construir redes neurais devido aos seus modelos de classificação excepcionais, como classificação de imagem ou redes neurais convolucionais (CNN).

As redes neurais são camadas de nós de dados conectados e ponderados. Cada camada permite que o modelo identifique a qual classificação os dados de entrada correspondem.

As redes neurais são tão boas quanto seu treinamento e, portanto, precisam de grandes conjuntos de dados e estruturas GAN, que geram dados de treinamento mais desafiadores com base naqueles já dominados pelo modelo.

O PyTorch define redes neurais usando o pacote torch.nn, que contém um conjunto de módulos para representar cada camada de uma rede.

Cada módulo recebe tensores de entrada e calcula os tensores de saída, que trabalham juntos para criar a rede. O pacote torch.nn também define funções de perda que usamos para treinar redes neurais.

As etapas para construir uma rede neural são:

  • Construção: Crie camadas de rede neural, configure parâmetros, estabeleça pesos e tendências.
  • Propagação direta: Calcule a saída prevista usando seus parâmetros. Meça o erro comparando a saída prevista e a real.
  • Retropropagação: Depois de encontrar o erro, tire a derivada da função de erro em termos dos parâmetros de nossa rede neural. A propagação para trás nos permite atualizar nossos parâmetros de peso.
  • Otimização iterativa: Minimize erros usando otimizadores que atualizam parâmetros por meio de iteração usando gradiente descendente.

Aqui está um exemplo de uma rede neural em PyTorch:

import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 1 input image channel, 6 output channels, 3x3 square convolution
# kernel
self.conv1 = nn.Conv2d(1, 6, 3)
self.conv2 = nn.Conv2d(6, 16, 3)
# an affine operation: y = Wx + b
self.fc1 = nn.Linear(16 * 6 * 6, 120) # 6*6 from image dimension
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
# Max pooling over a (2, 2) window
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
# If the size is a square you can only specify a single number
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = x.view(-1, self.num_flat_features(x))

x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
def num_flat_features(self, x):
size = x.size()[1:] # all dimensions except the batch dimension
num_features = 1
for s in size:
num_features *= s
return num_features

net = Net()
print(net)

O nn.module designa que esta será uma rede neural e então a definimos com duas camadas conv2d, que realizam uma convolução 2D, e 3 camadas lineares, que realizam transformações lineares.

A seguir, definimos um método direto para descrever como fazer a propagação direta. Não precisamos definir um método de propagação para trás porque PyTorch inclui uma função backwards() por padrão.

Não se preocupe se isso parece confuso agora, depois vamos cobrir implementações mais simples do PyTorch neste tutorial.

Autograd

Autograd é um pacote PyTorch usado para calcular derivadas essenciais para operações de rede neural. Essas derivadas são chamadas de gradientes. Durante uma passagem para frente, o autograd registra todas as operações em um tensor habilitado para gradiente e cria um gráfico acíclico para encontrar a relação entre o tensor e todas as operações. Essa coleção de operações é chamada de diferenciação automática.

As folhas deste gráfico são tensores de entrada e as raízes são tensores de saída. O Autograd calcula o gradiente traçando o gráfico da raiz à folha e multiplicando cada gradiente usando a regra da cadeia.

Depois de calcular o gradiente, o valor da derivada é preenchido automaticamente como um atributo grad do tensor.

import torch
# pytorch tensor
x = torch.tensor(3.5, requires_grad=True)
# y is defined as a function of x

y = (x-1) * (x-2) * (x-3)
# work out gradients
y.backward()

Por padrão, requires_grad é definido como false e o PyTorch não rastreia gradientes. Especificar requires_grad como True durante a inicialização fará o PyTorch rastrear gradientes para este tensor em particular sempre que realizarmos alguma operação nele.

Este código olha para y e vê que ele veio de (x-1) * (x-2) * (x-3) e calcula automaticamente o gradiente dy / dx, 3x^2 – 12x + 11.

A instrução também calcula o valor numérico desse gradiente e o coloca dentro do tensor x ao lado do valor real de x, 3.5.

Juntos, o gradiente é 3 * (3.5 * 3.5) – 12 * (3.5) + 11 = 5.75.

                                                 Figura 01

 

 

 

 

 

 

 

 

 

Os gradientes se acumulam por padrão, o que pode influenciar o resultado se não for redefinido. Use model.zero_grad() para zerar novamente seu gráfico após cada gradiente.

 

Otimizadores

Os otimizadores permitem que você atualize os pesos e tendências dentro de um modelo para reduzir o erro. Isso permite que você edite como seu modelo funciona sem ter que refazer tudo.

Todos os otimizadores PyTorch estão contidos no pacote torch.optim, com cada esquema de otimização projetado para ser útil em situações específicas. O módulo torch.optim permite que você construa um esquema de otimização abstrato apenas passando uma lista de parâmetros. O PyTorch tem muitos otimizadores para escolher, o que significa que quase sempre há um que melhor se adapta às suas necessidades.

Por exemplo, podemos implementar o algoritmo de otimização comum, SGD (Stochastic Gradient Descent), para suavizar nossos dados.

import torch.optim as optim
params = torch.tensor([1.0, 0.0], requires_grad=True)
learning_rate = 1e-3
## SGD
optimizer = optim.SGD([params], lr=learning_rate)

Depois de atualizar o modelo, use optimizer.step() para dizer ao PyTorch para recalcular o modelo.

Sem usar otimizadores, precisaríamos atualizar manualmente os parâmetros do modelo, um por um, usando um loop:

for params in model.parameters():
params -= params.grad * learning_rate

No geral, os otimizadores economizam muito tempo, permitindo que você otimize a ponderação dos dados e altere o modelo sem refazê-lo.

 

Gráficos de computação com PyTorch

Para entender melhor o PyTorch e as redes neurais, é importante praticar com gráficos de computação. Esses gráficos são essencialmente uma versão simplificada de redes neurais com uma sequência de operações usadas para ver como a saída de um sistema é afetada pela entrada.

Em outras palavras, a entrada x é usada para encontrar y, que então é usada para encontrar a saída z.

                                                            Figura 02

 

 

 

 

 

 

 

Imagine que  y e z são calculados assim:

y = x^2

z = 2y + 3

No entanto, estamos interessados em como a saída z muda com a entrada x, então precisaremos fazer alguns cálculos:

dz/dx = (dz/dy) * (dy/dx)

dz/dx = 2.2x

dz/dx = 4x

Usando isso, podemos ver que a entrada x = 3,5 fará com que z = 14.

Saber definir cada tensor em termos dos outros (y e z em termos de x, z em termos de y, etc.) permite que o PyTorch construa uma imagem de como esses tensores estão conectados.

                                                          Figura 03

 

 

 

 

 

 

 

 

 

Esta imagem é chamada de gráfico computacional e pode nos ajudar a entender como o PyTorch funciona nos bastidores.

Usando esse gráfico, podemos ver como cada tensor será afetado por uma mudança em qualquer outro tensor. Esses relacionamentos são gradientes e são usados para atualizar uma rede neural durante o treinamento.

Esses gráficos são muito mais fáceis de fazer usando o PyTorch do que manualmente. Então, agora que entendemos o que está acontecendo nos bastidores, vamos tentar fazer esse gráfico.

import torch
# set up simple graph relating x, y and z
x = torch.tensor(3.5, requires_grad=True)
y = x*x
z = 2*y + 3
print("x: ", x)
print("y = x*x: ", y)
print("z= 2*y + 3: ", z)
# work out gradients
z.backward()
print("Working out gradients dz/dx")

# what is gradient at x = 3.5
print("Gradient at x = 3.5: ", x.grad)

Isso mostra que z = 14, exatamente como encontramos manualmente acima!

 

Mãos à obra com PyTorch: gráfico computacional de vários caminhos

Agora que você viu um gráfico computacional com um único conjunto relacional, vamos tentar um exemplo mais complexo.

Primeiro, defina dois tensores, a e b, para funcionar como nossas entradas. Certifique-se de definir requires_grad=True para que possamos fazer gradientes na linha.

import torch
# set up simple graph relating x, y and z
a = torch.tensor(3.0, requires_grad=True)
b = torch.tensor(2.0, requires_grad=True)

Em seguida, configure as relações entre nossa entrada e cada camada de nossa rede neural, x, y e z. Observe que z é definido em termos de x e y, enquanto x e y são definidos usando nossos valores de entrada a e b.

import torch
# set up simple graph relating x, y and z
a = torch.tensor(3.0, requires_grad=True)
b = torch.tensor(2.0, requires_grad=True)

x = 2*a + 3*b
y = 5*a*a + 3*b*b*b
z = 2*x + 3*y

Isso cria uma cadeia de relacionamentos que o PyTorch pode seguir para entender todos os relacionamentos entre os dados.

Agora podemos calcular o gradiente dz/da​​ seguindo o caminho de volta de z para  a.

Existem dois caminhos, um passando por x e outro por y. Você deve seguir os dois e adicionar as expressões de ambos os caminhos. Isso faz sentido porque ambos os caminhos de a a z contribuem para o valor de z.

Teríamos encontrado o mesmo resultado se tivéssemos calculado dz/da usando a regra da cadeia do cálculo.

                                               Figura 04

 

 

 

 

 

 

 

 

 

 

O primeiro caminho por x nos dá 2 * 2 e o segundo caminho por y nos dá 3 * 10a. Assim, a taxa na qual z varia com a é 4 + 30a.

Se a é 22, então dz/da​​ é 4+30∗2=64.

Podemos confirmar isso no PyTorch adicionando uma propagação para trás de z e pedindo o gradiente (ou derivado) de a.

import torch
# set up simple graph relating x, y and z
a = torch.tensor(2.0, requires_grad=True)
b = torch.tensor(1.0, requires_grad=True)
x = 2*a + 3*b
y = 5*a*a + 3*b*b*b
z = 2*x + 3*y
print("a: ", a)
print("b: ", b)
print("x: ", x)
print("y: ", y)
print("z: ", z)
# work out gradients
z.backward()
print("Working out gradient dz/da")
# what is gradient at a = 2.0
print("Gradient at a=2.0:", a.grad)

Próximos passos para o seu aprendizado

Parabéns, você concluiu seu início rápido de PyTorch e Redes Neurais! A conclusão de um gráfico computacional é uma parte essencial da compreensão de redes de aprendizado profundo.

À medida que você aprender habilidades e aplicativos avançados de aprendizado profundo, você desejará explorar:

  • Redes neurais complexas com otimização
  • Design de visualização
  • Treinamento com GANs

Vamos continuar aprendendo juntos!

Fonte: PyTorch tutorial: a quick guide for new learners

 

 

Categorias
Ciência de Dados Dica de Leitura Python

10 artigos indispensáveis sobre Ciência de Dados para ler no Medium

A plataforma Medium é um dos melhores espaços na internet para estudantes de ciência de dados. Lá, existe uma diversidade enorme de profissionais compartilhando seus conhecimentos em artigos sobre programação, estatística, machine learning e outras áreas relacionadas ao data science.

São muitos os conteúdos para profissionais de dados no Medium, por isso, hoje destacamos 10 artigos dessa plataforma que trazem assuntos essenciais para qualquer cientista de dados. Esses conteúdos, como é próprio dos trabalhos com qualidade, contribuirão na sua carreira.

Mas antes de apresentarmos a lista, lembre que é possível ler todos os artigos no Medium de graça. Caso você não consiga acessar algum texto na plataforma porque atingiu o limite de conteúdos gratuitos, basta copiar o link do artigo e enviar como mensagem para você mesmo no Twitter. Pronto, agora é só clicar no link e ler.

Isso dito, vamos para os artigos!

 

01- Entendendo Rede Neural Convolucional (CNN) – Deep Learning          

As redes neurais convolucionais são amplamente usadas para, por exemplo, classificação de imagens, detecção de objetos e reconhecimento facial. Tendo essas como algumas de suas principais possibilidades de aplicação, fica entendido o porquê dos grandes esforços investidos no desenvolvimento da CNN.

E um artigo que te ajudará a entender como as máquinas decifram imagens é o “Compreensão da Rede Neural Convolucional (CNN) – Deep Learning”. Nele, o cientista de dados Prabhu Raghav explica alguns conceitos básicos de CNN e as etapas envolvidas neste processo.

Raghav organiza seu texto nestes seis tópicos, cada um deles dedicado a explicar uma das etapas envolvidas no processamento das redes neurais convolucionais: camada de convolução, strides, preenchimento, não linearidade (ReLU), camada de pooling e camada totalmente conectada. 

 

02- Entendendo self em Python – Código rápido

Depois de começar a usar o Python, não há como escapar da palavra “self “. Ela é vista nas definições de métodos e na inicialização de variáveis. Mas entender a ideia por trás disso parece um pouco problemático. E é nisto que este artigo te ajudará, a ter uma ideia intuitiva do que é o self e como você deve usá-lo.

Para isso, o autor, Ashan Priyadarshana, primeiro explora a criação de métodos de instância e classe em Python e, a partir deste quadro, aprofunda a explicação sobre o uso de self em Python.

Ao final do texto você terá conseguido entender por que deve sempre usar self como o primeiro parâmetro de métodos de instância em Python e o que realmente acontece nos bastidores quando chamamos um método de instância.

 

03- Aprendendo Python do zero

Um dos grandes motivos para aprender Python é certamente sua versatilidade; podemos usá-lo em diferentes áreas, como ciência de dados, desenvolvimento web e machine learning.

Diante disso, não é surpreendente a popularidade dessa linguagem de programação, que é adotada pelas também popularíssimas Google, Netflix, Quora, Pinterest e Spotify.

Se assim como essas gigantes, você também quer codificar em Python, o artigo “Aprendendo Python do zero” te ajudará. Nesse texto, por meio de exemplos de aplicação prática, você entenderá a teoria que estrutura o ambiente Python e também como se dão algumas de suas funções essenciais.

Veja o conteúdo básico sobre Python que você entenderá melhor com este artigo:

  • Como as variáveis em Python funcionam
  • Como funciona o controle de fluxo — condicionais
  • Como Python lida com loop, iteração, mais especificamente while e for
  • Como listas funcionam
  • Dicionários, uma estrutura de dados de chave-valor
  • Como iteramos sobre essas estruturas de dados
  • Objetos e Classes
  • Atributos como dados de um objeto
  • Métodos como comportamento de um objeto
  • Usando getters e setters em Python & decorator property
  • Encapsulamento: ocultando informações
  • Herança: herdando comportamentos e características.

 

04- Além do Pandas: Spark, Dask, Vaex e outras tecnologias de big data lutando frente a frente

Ao enfrentar um novo problema de ciência de dados, uma das primeiras perguntas a fazer é qual tecnologia usar. E foi pensando nisso que Jonathan Alexander, que acompanha intensamente o universo das ferramentas de big data, realizou testes para comparar a performance de tecnologias de conversão de dados e, assim, escolher a mais adequada para exploração, limpeza e conversão de dados tabulares. O objetivo é comparar as tecnologias em suas APIs, desempenho e facilidade de uso.

Alexander compartilhou os resultados e etapas desses testes em seu artigo no  Medium, “Beyond Pandas: Spark, Dask, Vaex and other big data technologies battling head to head”.

O conjunto de dados escolhidos para os testes foi o “Billion Row Taxi”, de 100 GB. As ferramentas selecionadas para comparação foram Dask DataFrame, PySpark, Koalas, Vaex, Turicreate e Datatable.

Acompanhe o artigo completo para entender como essas ferramentas se comportam em diferentes categorias, como complexidade de codificação e recursos. Conhecer as particularidades dessas tecnologias te ajudará a escolher a solução adequada para seus diferentes projetos de big data. 

 

05- Use o Docker e o Airflow para implantar seu fluxo de trabalho de Data Science

Este artigo busca ajudar cientistas de dados a aprimorar sua compreensão de como seu código seria executado em um ambiente de produção.

Assim, esta matéria é uma introdução, baseada no passo a passo para o uso do Airflow e do Docker, de como se pode articular a escrita de um código para o nível de produção. O autor explica os diferentes estágios em um fluxo de trabalho de data science e como projetar DAG e pipeline para um determinado problema. Além disso, também fornece uma visão geral de como usar a UI do Airflow.

 

06- Como analisar 100 GB de dados no seu laptop com Python

É cada vez mais comum os cientistas de dados enfrentarem conjuntos de dados de 50 GB ou mesmo 500 GB. Algo importante sobre trabalhar com esse tipo de conjunto de dados é que eles são pequenos o suficiente para caber no disco rígido de seu laptop comum, mas muito grandes para caber na RAM. Portanto, eles já são complicados de abrir e inspecionar, quanto mais de explorar ou analisar.

Neste artigo, Jovan Veljanoski apresenta uma nova abordagem para dados dessas dimensões: o Vaex. Essa é uma biblioteca de DataFrame de código aberto que permite a visualização, exploração e análise em conjuntos de dados tabulares que são tão grandes quanto seu disco rígido. Para fazer isso, o Vaex emprega conceitos como mapeamento de memória, algoritmos out-of-core eficientes e lazy evaluations.

Esta matéria de introdução ao Vaex te ajudará a aliviar alguns dos seus problemas com dados dessa proporção, pelo menos quando se trata de conjuntos de dados tabulares.

 

07- 5 operações em conjuntos Python que você precisa saber

Estruturas de dados são os blocos de construção para scripts Python. Eles mantêm ou contêm os dados de uma maneira específica para fazer com que os scripts funcionem com mais eficiência. Portanto, é crucial aprender a interagir com as estruturas de dados.

Os conjuntos (sets) são uma das principais estruturas de dados em Python. E neste artigo são apresentadas as características dos sets e examinadas cinco operações comumente usadas nos conjuntos.

 

08- Aprenda Ciência de Dados em 10 anos – 3 lições de Peter Norvig (diretor de aprendizado de máquina da Google)

A demanda industrial, acadêmica e governamental por profissionais de ciência de dados qualificados é enorme, e continua crescendo rapidamente. A contínua “corrida de dados” está, portanto, atraindo profissionais com diversas formações, como física, matemática, estatística, economia e engenharia.

O mercado tem urgência por mais cientistas de dados, mas a formação desses profissionais exige muito tempo e esforço.

Inspirado pelo texto de Peter Norving sobre quanto tempo leva para se tornar um especialista em programação, Benjamin Obi Tayo compartilha em “Teach Yourself Data Science in 10 Yearspassos essenciais para dominar os fundamentos da ciência de dados.

Ao longo dessa conversa, Benjamin Obi Tayo te ajudará a encontrar as respostas para duas perguntas que todos os iniciantes em data science devem se fazer:

  1. Quanto tempo leva para aprender os fundamentos da ciência de dados?
  2. Quais recursos usar para aprender ciência de dados?

De forma geral, este artigo vem para nos lembrar que para tornar-se um cientista de dados é preciso tempo, esforço, energia, paciência e comprometimento. Ou seja, cuidado com aquela conversa de “aprenda ciência de dados em quatro semanas”.

 

09- 6 práticas recomendadas para tornar suas funções Python mais legíveis

Você já olhou para uma função que escreveu um mês antes e achou difícil entendê-la em até 3 minutos? Se sim, é hora de refatorar seu código. Se você levar mais de 3 minutos para entender seu próprio código, imagine quanto tempo isto tomará de seus colegas.

Se você deseja que seu código seja reutilizável, ele deve ser legível.

E em seu artigo sobre como escrever código limpo em Python, a cientista de dados Khuyen Tran detalha seis práticas para tornar as funções mais legíveis e mais fáceis de detectar erros. Ela diz que as funções devem ser curtas, fazer uma única coisa, conter código com o mesmo nível de abstração, ter menos de quatro argumentos, não ter duplicação e usar nomes descritivos.

Acompanhe o texto completo para entender como utilizar essas práticas e escrever códigos python muito mais legíveis. 

 

10- Tipos de conjuntos de dados em ciência de dados, mineração de dados e aprendizado de máquina

Para tomar qualquer decisão sobre como lidar com um conjunto de dados, é preciso entender com qual tipo de dados você está trabalhando. E nisso Tarun Gupta te ajudará com seu artigo “Types of Data Sets in Data Science, Data Mining & Machine Learning”.

Antes de tratar especificamente de cada tipo de dataset, Gupta explica dimensionalidade, esparsidade e resolução, que são características gerais dos datasets. A partir disso, ele destrincha os três tipos de conjuntos de dados: dados de registro (record data), dados baseados em gráficos (graph-based data) e dados ordenados (ordered data).  

 

Esses foram os 10 artigos selecionados para nossa lista de hoje, mas não faltam excelentes conteúdos de data science no Medium, como é o caso das publicações que fazemos lá. Então, Acompanhe o Insight Lab no Medium.

E quais outros artigos te ajudaram a ser um cientista de dados melhor? Compartilha aqui nos comentários com a gente e nossos leitores. 

 

Categorias
Full Stack Programação Tecnologia

Uma arquitetura para a importação assíncrona de eventos espaço-temporais em larga escala

Introdução

O Big Data e Inteligência Artificial é um projeto em desenvolvimento pelo Insight Lab e o Ministério da Justiça e Segurança Pública. O objetivo desse projeto é realizar estudos científicos para criar uma plataforma que permitirá integrar e analisar fontes de dados de segurança pública dos estados brasileiros, direcionando, então, a implantação de estratégias para a melhoria da segurança pública.

Entre as ferramentas já disponíveis desse projeto está o Geointeligência, que é um sistema de georreferenciamento aplicado na segurança pública. E desde 2020, essa ferramenta também está sendo usada na área da saúde, pois, devido à pandemia de Covid-19, o Governo do Ceará implementou o Geointeligência para entender a disseminação dessa doença no estado.

Importação de eventos é uma das principais funcionalidades do Geointeligência. Implementado utilizando a linguagem de programação Scala com Play Framework, ele é um dos sistemas desenvolvidos por nossa equipe e tem como objetivo analisar eventos espaço-temporais através de algoritmos que procuram encontrar padrões capazes de ajudar na melhor aplicação de forças tarefas de segurança.

Como o Geointeligência é um sistema analítico, ele precisa que os eventos utilizados em suas análises sejam adicionados à sua base. E uma das maneiras mais importantes para fazer isso é a importação através de arquivos do tipo csv ou xlsx.

A importação de arquivos traz a facilidade de qualquer usuário poder importar seus eventos e utilizar o sistema para fazer análises a fim de identificar padrões úteis em seus eventos. Sem a importação de arquivos, nenhuma organização ou usuário poderiam criar análises com seus eventos, e com isso as análises seriam menos eficazes para diversos casos. Tendo isso em vista, a importação de eventos tem a necessidade de ser uma funcionalidade robusta e eficaz para importar eventos em larga escala.

Motivação – Processando muitos eventos

A importação de eventos passou a ser uma funcionalidade muito importante para nossos usuários. Com isso, notamos que a maioria deles tinham que dividir os arquivos de importação em diversos arquivos menores devido à limitação de tamanho e ao tempo que eles esperavam que sua tarefa fosse concluída para, só então, ter uma resposta do sistema. 

Por conta disso, nossa equipe resolveu que precisávamos melhorar a eficiência da importação para que fosse possível processar muitos eventos através de um único arquivo e com vários usuários ao mesmo tempo. Quantos eventos nós queríamos ser capazes de processar em um só arquivo? 

> Que tal 300.000 eventos?

Arquivos grandes

Em virtude dos requisitos que nós tínhamos à época, nossa implementação inicial da funcionalidade de importação de arquivos era bem simples. Uma vez que o servidor recebesse a requisição HTTP do usuário, ele carregaria todo o arquivo em memória e faria todo o processamento necessário dos eventos contidos nele dentro do escopo dessa mesma requisição, retornando então para o usuário uma resposta com a quantidade de eventos importados.

Dada a necessidade de se importar grandes quantidades de eventos, surgiram dois problemas principais com essa implementação. O arquivo que deveria conter essa maior quantidade de eventos a serem importados precisaria ser significativamente maior, ocasionando um consumo de memória que tornaria progressivamente mais limitada a utilização dessa funcionalidade por múltiplos usuários ao mesmo tempo.

Além disso, mais eventos significavam que a aplicação precisaria gastar proporcionalmente mais tempo para processar um arquivo completo. Por conta disso e pelo fato de a importação ser realizada dentro do escopo de uma requisição HTTP, o usuário poderia precisar esperar por muito tempo até que o upload desse arquivo fosse feito e seus eventos fossem validados e inseridos na base de dados, para só então ter uma resposta e poder seguir utilizando a aplicação, que ficaria “bloqueada” esperando a finalização da requisição.

Devido ao impacto causado pelo consumo de memória e o tempo de espera do usuário durante uma importação, nós precisávamos resolver esses problemas para obtermos uma implementação que suportasse a importação de grandes quantidades de eventos.

Para resolver o problema do consumo de memória, tivemos de elaborar uma estratégia para o processamento do arquivo na qual fosse garantido que o arquivo em si nunca fosse integralmente carregado em memória, o que ampliaria a escalabilidade da aplicação e permitiria, mais facilmente, a possibilidade de importações sendo executadas simultaneamente. 

Em paralelo, para resolver o problema de espera do usuário, chegamos à conclusão de que o processamento dos eventos não poderia estar limitado ao escopo de uma requisição do usuário. Isto é, uma vez que o usuário iniciasse uma importação, o Geointeligência deveria ser capaz de respondê-lo que sua requisição de importação fora aceita, mas o processo de importação em si deveria ser executado em segundo plano. Por consequência, uma vez que a importação fosse executada fora do escopo da requisição de importação, o usuário precisaria receber algum tipo de feedback do sistema informando-o quando sua tarefa fosse concluída. Desta forma, nós também tivemos de desenvolver um mecanismo, independente do escopo de uma requisição, capaz de informar ao usuário que sua importação foi concluída.

Disco é mais barato que memória RAM

Com o crescimento no tamanho dos arquivos de importação, a estratégia que nós havíamos implementado já não funcionava. Para resolver isso, uma opção seria guardar todo o arquivo em disco e depois ir carregando apenas partes dele na memória à medida que os eventos contidos nele fossem sendo processados.

Felizmente, para uma linguagem como o Scala, carregar apenas uma parte de um arquivo em memória não é uma tarefa difícil, uma vez que esse arquivo esteja salvo em disco ou em uma base de dados. Para implementar isso, nós utilizamos apenas as abstrações de InputStream e OutputStream nativas da linguagem de programação, sem que houvesse a necessidade da utilização de nenhuma biblioteca externa. Como os arquivos que nós usávamos armazenavam os eventos de modo sequencial, nós tínhamos tudo o que precisávamos para implementar essa arquitetura.

Desta forma, nós implementamos a seguinte estratégia:

  1. Assim que o servidor recebesse a requisição com o arquivo de eventos, ele seria diretamente armazenado em nossa base de dados através de um stream;
  2. Quando necessário, o sistema retiraria, também através de um stream, partes do arquivo contendo blocos de eventos que precisavam ser validados e inseridos;
  3. Cada bloco de eventos seria, então, processado de modo independente, isto é, cada um dos eventos de um bloco deveria passar por uma série de validações antes de serem inseridos em nossa base;
  4. Quando todo o arquivo fosse consumido, isto é, quando todo o seu conteúdo tivesse sido “lido”, e todos os seus eventos fossem processados, o sistema removeria esse arquivo da base.

Utilizando essa estratégia, nós conseguimos controlar de maneira muito mais detalhada o quanto do arquivo seria carregado na memória dos nossos servidores, além de permitir que partes de um mesmo arquivo pudessem ser processadas paralelamente.

O usuário não pode esperar 

Importar algumas centenas de eventos no escopo de uma requisição HTTP era algo simples. Processar um arquivo pequeno com essa quantidade de eventos não é uma tarefa tão custosa assim. O usuário ficaria esperando alguns poucos segundos e a tarefa dele estaria concluída. 

Acontece que esse padrão de uso não durou muito tempo e logo os usuários precisaram fazer importações na casa dos milhares de eventos. Essas importações demoravam mais, deixando o usuário esperando por vários segundos; isso quando o processo todo conseguia ser executado dentro do tempo limite de uma requisição HTTP. 

Isso não estava bom o suficiente. Nós precisávamos permitir que nosso sistema fosse robusto o bastante para permitir importações maiores e gostaríamos também que o usuário não fosse obrigado a ficar esperando sua importação terminar para realizar outras atividades dentro do sistema.

Nós precisávamos que as importações feitas no Geointeligência acontecessem em segundo plano, isto é, uma vez que o usuário iniciasse uma importação, esta deveria acontecer fora do escopo de sua requisição, e o usuário deveria ter alguma forma de verificar se sua tarefa já havia sido concluída.

Para isso, nós utilizamos a ferramenta mais indicada para a nossa necessidade e que estava à nossa disposição: o Akka.

Por que Akka e Akka Cluster?

O Akka é um conjunto de ferramentas que simplifica a construção de aplicativos concorrentes e distribuídos na JVM. Como nossos sistemas são implementados utilizando a linguagem de programação Scala, que roda na JVM, o Akka costuma ser uma ótima ferramenta para nos auxiliar a tornar nossos sistemas mais poderosos. Além disso, o Akka nos traz a possibilidade de trabalhar com o modelo de atores, que facilita o nosso trabalho como desenvolvedores no processo de criação de sistemas concorrentes e distribuídos. 

Outro ponto importante é que nossa infraestrutura prevê a possibilidade da criação de múltiplas instâncias da mesma aplicação com o objetivo de suportar uma maior quantidade de usuários durante um momento de estresse do sistema. Desse modo, o Akka, juntamente com o Akka Cluster, nos permitem desenvolver funcionalidades utilizando modelo de atores com o objetivo de tornar transparente para o desenvolvedor questões de gerenciamento e comunicação entre mais de uma instância de um mesmo sistema.

Conversa entre atores

No fim, para conseguirmos que a importação fosse toda processada fora do escopo da requisição do usuário, nós tivemos que fazer grandes mudanças na forma como ela era implementada, substituindo a estratégia anterior por uma baseada no modelo de atores. Resumidamente, essa estratégia utiliza um conjunto de atores, pequenas unidades de processamento capazes de se comunicar entre si através de mensagens, que são responsáveis por executar cada passo da importação.

Para implementar essa arquitetura de atores nós utilizamos a API de atores do Akka, uma vez que ela já abstrai uma porção de detalhes de gerenciamento de threads e bloqueios, tornando o trabalho do desenvolvedor mais focado na construção do sistema em si e nas interações entre os atores.


Resumidamente, quando um usuário envia uma requisição de importação para o sistema, o arquivo enviado é imediatamente salvo em nossa base de dados e uma mensagem com informações desse arquivo é enviada para um ator de arquivo (File Actor). As principais responsabilidades desse ator de arquivo são controlar o andamento da importação e carregar o arquivo de importação armazenado na base em partes na memória. Toda essa etapa inicial é executada ainda dentro do escopo da requisição HTTP do usuário, mas a partir desse ponto a execução ocorre em segundo plano.

O ator de arquivo, então, envia uma parte do arquivo para um segundo ator: o ator de blocos de eventos (Buffer Actor). Ele funciona como um buffer, responsável por processar um bloco de eventos, realizando as devidas validações e inserindo os eventos válidos na base. Uma vez que o ator de blocos de eventos tenha inserido todo um bloco de eventos, ele notifica novamente o ator de arquivo com informações desses eventos. O ator de arquivo então envia para um terceiro ator (Status Actor) as informações atualizadas da importação. Esse ator é responsável por manter o estado da importação com informações como quantidade de eventos inseridos e quantidade de erros encontrados.

O ator de arquivos, então, reinicia seu ciclo de execução, retirando partes do arquivo, uma a uma, e enviando-as para o ator de blocos. Por fim, quando o último bloco do arquivo é retirado da base e seus eventos são processados, o ator de arquivo remove esse arquivo da base, completando assim o processo de importação.

Acompanhando o progresso

A evolução da importação para ser processada fora do escopo de uma requisição HTTP não bloqueando o usuário no sistema gerou a necessidade de uma funcionalidade de feedback para o usuário sobre o processamento da importação do seu arquivo de eventos. A nossa arquitetura de atores possui um ator de notificação (Notification Actor) cuja função é justamente disponibilizar informações sobre as importações que estão ocorrendo naquele momento. 

Por isso, surgiu a ideia de criar um canal de comunicação direto entre o front-end e esse ator de notificação através de um Websocket. Sempre que o ator de estado da importação é atualizado com novas informações de importações atuais, ele utiliza esse Websocket para enviar mensagens com o progresso dessas importações para o front-end que, por sua vez, fica responsável por apresentar ao usuário essas informações como indicado na imagem abaixo:

O Geointeligência apresenta cada importação com uma barra de progresso sendo atualizada em tempo real. Ao clicar sobre a importação, o usuário verá mais informações sobre a quantidade de eventos que estão sendo inseridos, repetidos ou se houve erros:

Com essa funcionalidade o usuário tem a todo instante o entendimento do momento atual de sua importação e pode continuar usando o sistema sem precisar esperar que todo o processo seja finalizado.

Capacidade de importação

O Geointeligência passou a importar de forma eficaz uma quantidade significativamente maior de eventos por arquivo. Essa evolução deveu-se à saída do escopo de uma requisição HTTP, leitura otimizada do arquivo durante processamento, adição do modelo de atores do Akka para processamento de eventos e introdução do Akka Cluster para suportar diversas instâncias

Hoje, nosso sistema consegue importar arquivos com 300 mil eventos em pouco mais de dois minutos, sem que o usuário precise esperar o processamento de todos esses eventos para continuar a utilizar o sistema. O usuário pode fazer uma análise de eventos enquanto outros são importados. Isso melhorou a usabilidade do nosso sistema, permitindo ao usuário utilizar seu tempo para fazer as análises em vez de preparar os dados.

Conclusão

Com tudo isso, nossa equipe encontrou uma ótima forma de lidar com uma importação maciça de eventos sem precisar que o usuário esperasse a finalização de todo o processamento. 

A utilização do Akka e de atores trouxe  mais responsividade para a funcionalidade e, com isso, a utilização de mensagens assíncronas para informar progresso ao usuário permitiu que nosso sistema se comportasse de maneira mais reativa.

Nossos usuários ganharam tempo de processamento com o uso de modelo de atores para processar partes dos eventos por vez, e além disso, agora eles podem acompanhar todo o processo em tempo real com o progresso visual. A saída do escopo da requisição HTTP trouxe muitas vantagens para a importação no Geointeligência e a utilização do Akka fez com que o desenvolvimento disso fosse bem menos complexo do que poderia ser. 

Melhorar a experiência do usuário é sempre um objetivo que devemos procurar dentro de nossos sistemas.

 

Categorias
Ciência de Dados Machine Learning

Usando Ciência de Dados para detectar anomalias em logs de sistema

Com o aumento significativo de dispositivos computacionais nos últimos anos, a quantidade de dados transmitidos e armazenados cresceu de forma alarmante. Diante disso, os logs de sistema são um artefato essencial para a aplicação das técnicas de detecção de anomalias, pois eles registram os estados e eventos significativos do sistema, ajudando a depurar os comportamentos que não são esperados.

Na indústria é comum registrar informações detalhadas do tempo de execução do software em logs, permitindo que os desenvolvedores e engenheiros de suporte analisem o comportamento do sistema. As ricas informações registradas pelos logs permitem que os desenvolvedores conduzam uma variedade de tarefas de gerenciamento de sistema, como diagnóstico de erros e travamentos, garantia de segurança da aplicação e detecção de anomalias.

A detecção de anomalias desempenha um papel muito importante em várias comunidades, como a de Ciência de Dados, Aprendizado de Máquina, Visão Computacional e Estatística, e é provavelmente o campo mais comum para conduzir uma análise formal e confiável em logs de sistema. Isso, porque é possível detectar coisas que deram errado na execução do processo.

Esse campo, que busca comportamentos anormais do sistema observando os dados de log, permite que os desenvolvedores localizem e resolvam problemas em tempo hábil. 

 

Conceitos básicos 

Quando uma instância de dados apresenta um comportamento diferente do que é esperado pelo sistema, ela passa a ser denominada anomalia. O objetivo da detecção de anomalias é determinar todas essas instâncias orientando-se por dados. As anomalias também são chamadas de anormalidades, novidades, desvios ou discrepâncias na literatura de mineração de dados e estatística. 

Os desvios podem ser causados por erros nos dados, mas às vezes são indicativos de um novo processo subjacente, anteriormente desconhecido. Agora, vamos conhecer os três tipos de classificação nas quais as anomalias são divididas: anomalias pontuais, anomalias contextuais e anomalias coletivas. 

  • A maioria dos trabalhos na literatura concentra-se em anomalias pontuais, que geralmente representam uma irregularidade ou desvio aleatório que pode não ter uma interpretação particular.
  • Uma anomalia contextual, também conhecida como anomalia condicional, é uma instância de dados que pode ser considerada anômala em algum contexto específico, por exemplo, o timestamp, um padrão de gasto de dinheiro, a ocorrência de eventos em logs do sistema ou qualquer recurso usado para descrever o comportamento normal.
  • Anomalias coletivas são um tipo de anomalia que, individualmente, aparece como instâncias normais, e quando observada em grupo, exibe características incomuns. 

 

Aplicações: anomalias robustas

A detecção de anomalias pode ser aplicada em muitos contextos, inclusive para identificar discrepâncias robustas. Nesse caso, temos o LogRobust, uma abordagem de detecção de anomalias baseada em log. 

O LogRobust busca uma detecção precisa e robusta, considerando que os dados de log do mundo real estão em constante mudança. Devido à instabilidade dos dados de log, a eficácia das abordagens de detecção de anomalias existentes é significativamente afetada.

A arquitetura do LogRobust adota a rede neural baseada em atenção Bi-LSTM para lidar com as sequências de log instáveis. Já que os eventos de log diferentes têm impactos distintos no resultado da classificação, o mecanismo de atenção foi apresentado ao modelo Bi-LSTM para atribuir pesos diferentes aos eventos de log. Além disso, o impacto do ruído dos dados também pode ser reduzido, pois eventos com ruído tendem a ter menos importância e são mais propensos a receber pouca atenção. 

 

Aplicações: análise de sentimentos

A detecção de anomalias também pode ser utilizada no contexto de análise de sentimentos.

Em seu trabalho, Hudan Studiawan (2020) propõe uma nova técnica de análise de sentimentos baseada em aprendizado profundo para verificar se há atividades anômalas em logs de sistema operacional (SO). Esse problema é considerado análise de sentimento de duas classes: sentimentos positivos e negativos.

Studiawan usou uma técnica de Deep Learning que fornece alta precisão e flexibilidade em relação a dados não vistos anteriormente. Especificamente, é usado um modelo Gated Recurrent Unit para detectar o sentimento nas mensagens de log do sistema operacional.

Em logs do sistema operacional da vida real, o número de mensagens negativas é muito menor do que as positivas, gerando o desbalanceamento de classe. E para alcançar um equilíbrio entre as duas classes de sentimento é usado o método de Tomek link. O equilíbrio produzirá um modelo de aprendizado profundo melhor; portanto, capaz de detectar com mais precisão atividades anômalas.

Para concluir

Por fim, os métodos não-supervisionados são amplamente utilizados quando não se tem dados rotulados. Vários frameworks de Deep Learning que abordam desafios na detecção de anomalias não-supervisionadas são propostos e mostrados para produzir um desempenho de estado da arte.

Kengo Tajiri (2020) propõe um método de monitoramento de sistemas TIC (Tecnologia da Informação e Comunicação) para detecção contínua de anomalias, considerando que as dimensões dos vetores mudam frequentemente. Os métodos de detecção de anomalias baseados em Autoencoders, que treinam um modelo para descrever a “normalidade”, são promissores para monitorar o estado dos sistemas.

Há uma grande necessidade de desenvolver técnicas de detecção de anomalias de uso geral e personalizadas para problemas. Essas metodologias devem ser adaptadas para acompanhar as últimas mudanças na tecnologia que podem resultar em novas vulnerabilidades em vários sistemas. As técnicas de detecção de anomalias precisam ser eficientes o suficiente para capturar a pequena quantidade de outliers em grandes fluxos de dados e também inteligentes o suficiente para detectar anomalias em períodos de tempo curtos ou longos.

Se você quiser continuar aprendendo sobre o tema, confira aqui embaixo as indicações bibliográficas que selecionamos.

Até o próximo tema!

 

 

Referências Bibliográficas

  • AGGARWAL, Charu C. Neural networks and deep learning. Springer, v. 10, p. 978-3, 2018.
  • CHALAPATHY, Raghavendra; CHAWLA, Sanjay. Deep learning for anomaly detection: A survey. arXiv preprint arXiv:1901.03407, 2019.
  • CHANDOLA, Varun; BANERJEE, Arindam; KUMAR, Vipin. Anomaly detection: A survey. ACM computing surveys (CSUR), v. 41, n. 3, p. 1-58, 2009.
  • MA, Rongjun. Anomaly detection for Linux system log. 2020. Dissertação de Mestrado. University of Twente.
  • PANG, Guansong. Deep Learning for Anomaly Detection: A Review. ACM Computing Surveys (CSUR), v. 54, n. 2, p. 1-38, 2021.
  • SONG, Xiuyao. Conditional anomaly detection. IEEE Transactions on knowledge and Data Engineering, v. 19, n. 5, p. 631-645, 2007.
  • STUDIAWAN, Hudan; SOHEL, Ferdous; PAYNE, Christian. Anomaly detection in operating system logs with deep Learning-based sentiment analysis. IEEE Transactions on Dependable and Secure Computing, 2020.
  • TAJIRI, Kengo et al. Dividing Deep Learning Model for Continuous Anomaly Detection of Inconsistent ICT Systems. In: NOMS 2020-2020 IEEE/IFIP Network Operations and Management Symposium. IEEE, 2020. p. 1-5.
  • ZHANG, Xu et al. Robust log-based anomaly detection on unstable log data. In: Proceedings of the 2019 27th ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering. 2019. p. 807-817.
  • ZHU, Jieming et al. Tools and benchmarks for automated log parsing. In: 2019 IEEE/ACM 41st International Conference on Software Engineering: Software Engineering in Practice (ICSE-SEIP). IEEE, 2019. p. 121-130.

 

 

Categorias
Ciência de Dados Dica de Leitura Machine Learning Tecnologia

Um livro para entender o desenvolvimento de Machine Learning Pipelines

Todo mundo está falando sobre aprendizado de máquina, de uma disciplina acadêmica, ele tornou-se uma das tecnologias mais interessantes em qualquer parte. Incluindo desde a compreensão dos feeds de vídeo em carros autônomos até a personalização de medicamentos, essa tecnologia está se tornando importante em todos os setores. Por isso, te convidamos a conhecer profundamente o livro “Building Machine Learning Pipelines: Automating Model Life Cycles with TensorFlow”.


Escrito pela dupla de autores
Hannes Hapke e Catherine Nelson, esse livro busca mostrar como construir um sistema de machine learning padrão que é automatizado e resulta em modelos reproduzíveis.

 

O que são Machine Learning Pipelines?

Os pipelines de aprendizado de máquina implementam e formalizam processos para acelerar, reutilizar, gerenciar e implantar modelos de aprendizado de máquina. O objetivo deste livro é contribuir para a padronização de projetos de aprendizado de máquina, conduzindo os leitores por todo um pipeline de aprendizado de máquina, de ponta a ponta.


Um pipeline automatizado e reproduzível reduz o esforço necessário para implantar um modelo, assim, o pipeline deve incluir etapas que:

  • Criem versões de seus dados de maneira eficaz e dê início a uma nova execução de treinamento de modelo
  • Validem os dados recebidos e verifique a variação de dados
  • Pré-processem os dados de maneira eficiente para o treinamento e validação do seu modelo
  • Treinem seus modelos de aprendizado de máquina de maneira eficaz
  • Acompanhem o treinamento do seu modelo
  • Analisem e valide seus modelos treinados e ajustados
  • Implantem o modelo validado
  • Dimensionem o modelo implantado
  • Capturem novos dados de treinamento e modelem as métricas de desempenho com ciclos de feedback

 

O livro

Neste guia prático, Hannes Hapke e Catherine Nelson orientam você nas etapas de automação de um pipeline de aprendizado de máquina usando o ecossistema TensorFlow. Você aprenderá as técnicas e ferramentas que reduzirão o tempo de implantação, assim, você poderá se concentrar no desenvolvimento de novos modelos em vez de manter sistemas legados.


Building Machine Learning Pipelines” é voltado para cientistas de dados e engenheiros de machine learning, mas também conversa com gerentes de projetos de data science e engenheiros DevOps. Para a leitura da obra, você deve estar confortável com os conceitos básicos de aprendizado de máquina e familiarizado com pelo menos uma estrutura de aprendizado de máquina (por exemplo, PyTorch, TensorFlow, Keras). Os exemplos de aprendizado de máquina neste livro são baseados no TensorFlow e Keras, mas os conceitos principais podem ser aplicados a qualquer estrutura.


Este livro te ajudará a:

  • Entender as etapas para criar um pipeline de aprendizado de máquina
  • Criar seu pipeline usando componentes do TensorFlow Extended
  • Orquestrar seu pipeline de aprendizado de máquina com Apache Beam, Apache Airflow e Kubeflow Pipelines
  • Trabalhar com dados usando o TensorFlow Data Validation e TensorFlow Transform
  • Analisar um modelo em detalhes usando o TensorFlow Model Analysis
  • Examinar a equidade e o viés no desempenho do seu modelo
  • Implantar modelos com TensorFlow Serving ou TensorFlow Lite para dispositivos móveis
  • Aprender técnicas de aprendizado de máquina que preservam a privacidade

 

Os autores      

Hannes Hapke

Hannes Hapke é um cientista de dados sênior do Concur Labs no SAP Concur e mestre em Engenharia Elétrica pela Oregon State University.  Antes de ingressar no SAP Concur, Hannes resolveu problemas de infraestrutura de aprendizado de máquina em vários setores, incluindo saúde, varejo, recrutamento e energias renováveis. Além disso, Hannes é co-autor de uma publicação sobre processamento de linguagem natural e aprendizado profundo e apresentou-se em várias conferências sobre aprendizado profundo e Python. 

 

Catherine Nelson

Catherine Nelson também é cientista de dados sênior do Concur Labs no SAP Concur e tem PhD em geofísica pela Durham University e mestrado em Ciências da Terra pela Oxford University. Suas principais áreas de foco vão desde ML explainability e análise de modelos até o ML com preservação da privacidade. Enquanto trabalhou como geofísica, ela estudou vulcões antigos e explorou petróleo na Groenlândia.

 

Gostou da nossa dica? Então, agora é hora de alinhar o livro, sua vontade de aprender, seu tempo e praticar bastante para expandir suas habilidades em machine learning.

 

Categorias
Destaque Webinar

Webinar: Intervenção em Violência Doméstica no Brasil e em Portugal

No dia 16 de junho (quarta-feira), realizaremos o webinar “Intervenção em Violência Doméstica no Brasil e em Portugal: Partilha de Práticas e Cooperação Internacional”. Esse evento é resultado da parceria entre o Insight Data Science Lab e a CIG (Comissão para a Cidadania e a Igualdade de Género), órgão nacional português responsável pela promoção e defesa da igualdade entre mulheres e homens.

Nesse encontro, os pesquisadores Rebeca Quezado, José Macêdo e Ricardo Loureiro apresentarão pesquisas realizadas no Brasil e em Portugal para entender o cenário da violência doméstica nos dois países.

Ricardo Loureiro tratará dos projetos realizados pela CIG e Rebeca Quezado e José Macêdo abordarão os resultados do estudo “Panorama do crime de feminicídio cadastrado no Tribunal de Justiça do Estado do Ceará – Comarca de Fortaleza (2018-2019)”. Assim, os três debaterão a relevância das pesquisas científicas e da cooperação internacional no desenvolvimento de práticas para o enfrentamento da violência doméstica.

 

Participantes

 

REBECA QUEZADO: Pesquisadora no Insight Data Science Lab  da Universidade Federal do Ceará – UFC

 

 

 

JOSÉ MACÊDO: Cientista-chefe de Dados do Governo do Estado do Ceará

 

 

 

 

RICARDO LOUREIRO: Técnico Superior da CIG – Comissão para  a Cidadania e a Igualdade de Género

 

 

Participe! Sua presença fortalece o debate.

AGENDA:

? 16 de junho

? Horário:

10h30 (Brasil)

14h30 (Portugal)

Transmissão: Canal Insight Lab (YouTube).

 

 

                                       

Categorias
Ciência de Dados Dica de Leitura Matemática

“Uma senhora toma chá”, a história da Estatística está cheia de histórias

Sabe aqueles livros que você precisa ler antes de terminar a graduação? Então, para os estudantes de Estatística, um dos primeiros livros dessa lista é “Uma senhora toma chá – Como a Estatística revolucionou a ciência no século XX”, de David Salsburg.

E o título já traz história. Em uma tarde de verão em Cambridge, Inglaterra, um grupo de professores universitários e suas esposas tomavam o chá da tarde. Uma das mulheres presentes afirmava que a ordem na qual os ingredientes, leite e chá, eram colocados alterava o sabor do chá. E por isso, um dos homens presentes disse: “vamos testar a proposição”.

Esse homem era Ronald Aylmer Fisher, que, em 1935, publicou The Design of Experiments, no qual descreveu o experimento da senhora provando chá. Como resume Salsburg, “nesse livro, Fisher analisa a senhora e sua crença como um problema hipotético e considera os vários experimentos que podem ser planejados para determinar se era possível a ela notar a diferença”.

As vidas que revolucionaram a Estatística

E assim segue Salsburg nos contando a história da revolução estatística na ciência do século XX. Como afirma o autor, no final desse século, “quase toda a ciência tinha passado a usar modelos estatísticos”.

Em “Uma senhora toma chá”, David Salsburg nos convida a conhecer a história do desenvolvimento da Estatística mesclada às histórias de algumas das pessoas que protagonizaram essa ciência. Mas além da beleza da Estatística e genialidade desses estudiosos, o livro nos conta também sobre os conflitos entre esses pioneiros e sobre algumas de suas contradições.

E como escrito por Carlos Antonio Costa na revista Ciência Hoje, “os leitores que conhecem e trabalham com estatística vão adorar conhecer as histórias dos homens e mulheres que inventaram os métodos que usam em seu cotidiano de trabalho. Por exemplo, as de William Gosset (1876-1937), que inventou o teste t de Student enquanto trabalhava na cervejaria Guiness; Chester Bliss (1899-1979), inventor do modelo probit; de Jerzy Neyman (1894- 1981), que desenvolveu a matemática que explica os testes de hipótese; de W. Edwards Deming (1900-1993), que revolucionou a indústria japonesa; ou de Andrey Kolmogorov (1903-1987), o gênio matemático que desenvolveu a teoria da probabilidade”.

 

Sobre o autor

David Salsburg é PhD em Estatística Matemática e lecionou na University of Pennsylvania, Harvard School of Public Health, Yale University, Connecticut College e University of Connecticut.  Mas antes de sua experiência docente, David trabalhou na Pfizer Central Research por 27 anos. E isso foi um marco, pois Salsburg foi o primeiro estatístico contratado pela Pfizer, assim como um dos primeiros a trabalhar para qualquer empresa farmacêutica.

 

Categorias
Não categorizado

Os 10 melhores Ted Talks sobre Ciência de Dados

Acessar o Ted Talks é ter certeza de encontrar alguns dos melhores conteúdos disponíveis na internet sobre design, sociedade, inovação e, é claro, data science. Por isso, escolhemos os 10 melhores Ted Talks sobre campos que compõem a ciência de dados. O conjunto de palestras que lhe apresentaremos a seguir, comandados por profissionais que estão à frente do desenvolvimento e aplicação da ciência de dados, nos ajudam a aprofundar nosso conhecimento e entendimento do potencial, beleza, magnitude e responsabilidade que todos os responsáveis por essa ciência têm.

 

1. Como os computadores estão aprendendo a ser criativos

Estamos à beira de uma nova fronteira na arte e criatividade – e isso não é humano. Blaise Agüera y Arcas, cientista-chefe do Google, trabalha com redes neurais profundas para percepção de máquina e aprendizado distribuído. Nesta demonstração cativante, ele mostra como redes neurais treinadas para reconhecer imagens podem ser executadas ao contrário, para gerá-las. Os resultados: colagens alucinatórias espetaculares (e poemas!) que desafiam qualquer categorização. “Percepção e criatividade estão intimamente conectadas”, diz Agüera y Arcas. “Qualquer criatura, qualquer ser que é capaz de fazer atos perceptivos também é capaz de criar.”

 

2. Como a IA pode provocar uma segunda revolução industrial

“O caminho real percorrido por uma gota de chuva enquanto desce o vale é imprevisível, mas a direção geral é inevitável”, diz o visionário digital Kevin Kelly. E com a tecnologia acontece praticamente o mesmo, impulsionada por padrões que são surpreendentes, mas inevitáveis. Nos próximos 20 anos, diz ele, nossa tendência para tornar as coisas cada vez mais inteligentes terá um impacto profundo em quase tudo o que fazemos. Kelly explora três tendências em IA que precisamos entender para abraçá-la e orientar seu desenvolvimento. “O produto de IA mais popular daqui a 20 anos, que todo mundo usará, ainda não foi inventado”, diz Kelly. “Isso significa que você não está atrasado.”

 

3. Como vamos ganhar dinheiro em um futuro sem emprego

Máquinas que podem pensar, aprender e se adaptar estão chegando, e isso pode significar que nós, humanos, teremos um nível de desemprego significativo. O que devemos fazer sobre isso? Em uma conversa direta sobre uma ideia polêmica, o futurista Martin Ford defende a separação entre renda e trabalho tradicional e a instituição de uma renda básica universal.

 

4. A próxima revolução de software: programação de células biológicas

As células do seu corpo são como um software de computador: elas são “programadas” para realizar funções específicas em momentos específicos. Se pudermos entender melhor esse processo, poderemos, nós mesmos, desbloquear a capacidade de reprogramar células, diz a bióloga computacional Sara-Jane Dunn. Em uma palestra sobre a ciência de ponta, ela explica como sua equipe está estudando células-tronco embrionárias para obter uma nova compreensão dos programas biológicos que impulsionam a vida e desenvolver “software vivo” que pode transformar a medicina, a agricultura e a energia.

 

5. As incríveis invenções da IA intuitiva

O que você ganha quando dá a uma ferramenta de design um sistema nervoso digital? Computadores que melhoram nossa capacidade de pensar e imaginar, e sistemas robóticos que apresentam (e constroem) novos designs para pontes, carros, drones e muito mais, sozinhos. Faça um tour pela Augmented Age com o futurista Maurice Conti e visualize uma época em que robôs e humanos trabalharão lado a lado para realizar coisas que nenhum deles poderia fazer sozinho.

 

6. Podemos construir IA sem perder o controle sobre ela?

Assustado com a IA superinteligente? Você deveria estar, diz o neurocientista e filósofo Sam Harris, e não apenas de uma forma teórica. Vamos construir máquinas sobre-humanas, diz Harris, mas ainda não enfrentamos os problemas associados à criação de algo que pode nos tratar da mesma forma que tratamos as formigas.

 

7. Estamos construindo uma distopia apenas para fazer as pessoas clicarem nos anúncios

Estamos construindo uma distopia alimentada por inteligência artificial, um clique de cada vez, diz a tecno-socióloga Zeynep Tufekci. Em uma palestra reveladora, ela detalha como os mesmos algoritmos que empresas como Facebook, Google e Amazon usam para fazer você clicar em anúncios também são usados para organizar seu acesso a informações políticas e sociais. E as máquinas nem são a verdadeira ameaça. O que precisamos entender é como os poderosos podem usar IA para nos controlar, e o que podemos fazer em resposta. 

 

8. 3 princípios para criar IA mais segura

Como podemos aproveitar o poder das máquinas super inteligentes e, ao mesmo tempo, prevenir a catástrofe de robôs controladores? À medida que nos aproximamos da criação de máquinas oniscientes, o pioneiro da IA, Stuart Russell, está trabalhando em algo um pouco diferente: robôs com incerteza. Ouça sua visão para IA compatível com humanos que pode resolver problemas usando bom senso, altruísmo e outros valores humanos.

 

9. A beleza da visualização de dados

David McCandless transforma conjuntos de dados complexos (como gastos militares mundiais, assuntos cobertos pela mídia, atualizações de status do Facebook) em diagramas bonitos e simples que revelam padrões e conexões invisíveis. Um bom design, ele sugere, é a melhor maneira de navegar por grandes conjuntos de informações, e pode mudar a maneira como vemos o mundo.

 

10. Como estou lutando contra o preconceito nos algoritmos

A aluna do MIT Joy Buolamwini estava trabalhando com um software de análise facial quando percebeu um problema: o software não detectou seu rosto, porque as pessoas que codificaram o algoritmo não o ensinaram a identificar uma ampla gama de tons de pele e estruturas faciais . Agora ela está em uma missão de combater o preconceito no aprendizado de máquina, um fenômeno que ela chama de “olhar codificado”. É uma palestra reveladora sobre a necessidade de responsabilidade na codificação à medida que os algoritmos assumem cada vez mais aspectos de nossas vidas.

 

Gostou da nossa seleção? Então conheça a nossa lista dos “10 melhores Ted Talks de tecnologia”. E você também pode deixar nos comentários outras sugestões de palestras sobre data science que merecem ser compartilhadas. 

 

Categorias
Ciência de Dados Machine Learning Programação

10 habilidades indispensáveis para os cientistas de dados em 2021

Muito se fala sobre a grande procura das empresas por cientistas de dados e os excelentes salários reservados a esses profissionais. Mas quem pode receber esse título, quais habilidades tornam os cientistas de dados tão requisitados e ainda raros no mercado de trabalho?

Para conhecer quais competências você deve desenvolver para se tornar um cientista de dados, e entender que este não é um processo de apenas 6 meses, trazemos aqui a lista produzida por Daniel D. Gutierrez sobre as 10 habilidades essenciais de ciência de dados em 2021.

Gutierrez é cientista de dados, autor de quatro livros de data science, jornalista de tecnologia e professor, tendo ministrado aulas de ciência de dados, aprendizado de máquina (machine learning) e R em nível universitário.

 


1. Experiência com GPUs

Agora é a hora de entender a grande popularidade das GPUs. A maneira mais fácil de começar a usar GPUs para aprendizado de máquina  é começar com um serviço de GPU em nuvem. Aqui está uma pequena lista de opções que podem ser adequadas às suas necessidades:

 

  • Colab Google Colaboratory, ou “Colab” para abreviar, é um produto do Google Research. O Colab permite que qualquer pessoa escreva e execute código Python arbitrário por meio do navegador, e é especialmente adequado para aprendizado de máquina. Especificamente, o Colab é um serviço de nuvem gratuito hospedado pelo Google que usa o Jupyter Notebook, ou seja, que não requer instalação para uso, ao mesmo tempo que fornece acesso a recursos de computação, incluindo GPUs.
  • Kaggle Kaggle (propriedade do Google) fornece acesso gratuito às GPUs NVIDIA TESLA P100. Essas GPUs são úteis para treinar modelos de aprendizado profundo (deep learning), no entanto, não aceleram a maioria dos outros fluxos de trabalho, como bibliotecas Python, Pandas e Scikit-learn. Você pode usar um limite de cota por semana de GPU. A cota é restabelecida semanalmente e é de 30 horas ou às vezes mais, dependendo da demanda e dos recursos.
  • NVIDIA NGCO catálogo NGC ™ é um hub para software otimizado por GPU para deep learning, machine learning e computação de alto desempenho que acelera a implantação para fluxos de trabalho de desenvolvimento para que cientistas, desenvolvedores e pesquisadores possam se concentrar na construção de soluções, coleta de insights e entrega de valor comercial.
  • Cloud GPUs no Google Cloud Platform GPUs de alto desempenho no Google Cloud para aprendizado de máquina, computação científica e visualização 3D.
  • Lambda GPU Cloud para Deep Learning Lambda oferece Lambda GPU Cloud, um serviço de nuvem GPU para Deep Learning. 

 


2. Visualização de dados criativa e storytelling de dados

A visualização de dados, juntamente com o storytelling de dados, continua sendo uma habilidade importante a ser cultivada por todos os cientistas de dados. Essa etapa integra o processo de ciência de dados e é uma habilidade que diferencia os cientistas de dados de seus colegas engenheiros de dados. Os cientistas de dados assumem a importante função de interagir com os responsáveis pelo projeto ao entregar os resultados de um trabalho de data science.

Além dos tradicionais relatórios e resultados numéricos, uma visualização de dados atraente e bem pensada é a melhor maneira de mostrar os resultados provenientes de um algoritmo de aprendizado de máquina. Além disso, é também um ingrediente básico do estágio final do storytelling de dados do projeto, onde o cientista de dados se esforça para chegar a uma descrição concisa e não técnica dos resultados, onde as principais descobertas são facilmente compreendidas.

Para quem sente dificuldade nesta parte, como no trabalho com elementos mais criativos e visuais, sempre procure por novas técnicas de visualização de dados usando pacotes R recém-descobertos e bibliotecas Python para tornar o resultado mais atraente.

 

 


3. Python

Para Gutierrez, é difícil ignorar o Python, pois a maioria dos bons artigos de blog e materiais de aprendizagem usam esta linguagem. Por exemplo, a maioria dos documentos de aprendizagem profunda que aparecem no arXiv referem-se a repositórios GitHub com código Python usando estruturas como Keras, TensorFlow e Pytorch, e quase tudo que acontece no Kaggle envolve Python.

Ainda de acordo com o autor, o R costumava ter a vantagem com os 16.891 pacotes disponíveis para complementar a linguagem base, mas o Python afirma ter uma ordem de magnitude maior do que essa. Um conhecimento robusto de Python é uma habilidade de ciência de dados importante para se aprender.

 

 


4. SQL

SQL é uma ótima linguagem de consulta de dados, mas não é uma linguagem de programação de propósito geral. É fundamental que todo cientista de dados seja proficiente em SQL. Muitas vezes, seus conjuntos de dados para um projeto de ciência de dados vêm diretamente de um banco de dados relacional corporativo. Portanto, o SQL é seu canal para adquirir dados. Além disso, você pode usar SQL diretamente em R e Python como uma ótima maneira de consultar dados em um quadro de dados.

 

 


5. GBM além de Deep Learning

A IA e o aprendizado profundo continuam no topo do “hype cycle” do setor, e certamente 2021 não será diferente. O aprendizado profundo é a ferramenta perfeita para muitos domínios de problemas, como classificação de imagens, veículos autônomos, PNL e muitos outros. Mas quando se trata de dados tabulares, ou seja, dados típicos de negócios, deep learning pode não ser a escolha ideal. Em vez disso, o GBM (Gradient Boosted Machines) é o algoritmo de aprendizado de máquina que geralmente atinge a melhor precisão em dados estruturados / tabulares, superando outros algoritmos, como as tão faladas redes neurais profundas (deep learning). Alguns dos principais GBMs incluem XGBoost, LightGBM, H2O e catboost.

 

 


6. Transformação de dados

Muitas vezes, é mencionado em voz baixa quando os cientistas de dados se encontram: o processo de data munging (também conhecido como data wrangling, transformação de dados) leva a maior parte do tempo e do orçamento de custos de um determinado projeto de ciência de dados.

Transformar dados não é o trabalho mais atraente, mas acertar pode significar sucesso ou fracasso com o aprendizado de máquina. Para uma tarefa tão importante, um cientista de dados deve certificar-se de agregar à sua caixa de ferramentas de ciência de dados código que atenda a muitas necessidades comuns. Se você usa R, isso significa usar dplyr e, se você usa Python, então Pandas é sua ferramenta de escolha.

 

 


7. Matemática e estatística

Manter um conhecimento sólido dos fundamentos dos algoritmos de aprendizado de máquina requer uma base em matemática e estatística. Essas áreas são normalmente deixadas por último no esforço de aprendizado de muitos cientistas de dados, isso porque matemática / estatística podem não estar em sua lista pessoal de atualização. Mas um entendimento elementar dos fundamentos matemáticos do aprendizado de máquina é imprescindível para evitar apenas adivinhar os valores dos hiperparâmetros ao ajustar algoritmos.

As seguintes áreas da matemática são importantes: cálculo diferencial, equações diferenciais parciais, cálculo integral (curvas AUC-ROC), álgebra linear, estatística e teoria da probabilidade. Todas essas áreas são importantes para entender como funcionam os algoritmos de aprendizado de máquina.

Um objetivo de todos os cientistas de dados é ser capaz de consumir “a bíblia do aprendizado de máquina”, “Elements of Statistical Learning”, de Hastie, Tibshirani e Friedman. Esse é um daqueles livros que você nunca termina de ler.

Para atualizar sua matemática, verifique o conteúdo do OpenCourseWare do professor Gilbert Strang do MIT.

 

 


8. Realização de experimentos com os dados

Busque novos conjuntos de dados e experimente, experimente e experimente! Os cientistas de dados nunca conseguem praticar o suficiente trabalhando com fontes de dados desconhecidas. Felizmente, o mundo está cheio de dados. É apenas uma questão de combinar suas paixões (ambientais, econômicas, esportivas, estatísticas de crime, o que for) com os dados disponíveis para que você possa realizar as etapas do “processo de ciência de dados” para aprimorar suas habilidades. A experiência que você ganha com seus próprios experimentos com dados o ajudará profissionalmente no futuro.

 

 


9. Conhecimento especializado

Um consultor independente de ciência de dados pode trabalhar em todos os tipos de projetos interessantes em um amplo espectro de domínios de problemas: manufatura, sem fins lucrativos, educação, esportes, moda, imóveis, para apenas mencionar alguns.

Então, quando se tem um novo cliente de um novo setor, é fundamental aumentar rapidamente seu conhecimento na área desde o início. Falar com pessoas da organização do cliente que são especialistas no assunto, analisar as fontes de dados disponíveis, ler tudo que possa encontrar sobre o assunto, incluindo white papers, postagens em blogs, periódicos, livros, artigos de pesquisa; tudo isso em uma tentativa de começar a todo vapor.

 

 


10. Aprendizado de máquina ético

O professor Gutierrez apresenta aos seus alunos uma lista de casos em que cientistas de dados foram solicitados a usar suas habilidades para fins nefastos.

“Falo a eles sobre os cientistas de dados que desenvolvem tecnologia para criar imagens e vídeos ‘deep fake’ indetectáveis. Conto a eles a vez em que testemunhei um gerente de ciência de dados de uma grande empresa pública de jogos que disse a uma multidão em um encontro que ele e sua equipe trabalharam com psicólogos para descobrir maneiras de viciar crianças em seus jogos. E eu falo sobre Rebekah Jones, a cientista de dados do estado da Flórida que se recusou a adulterar os dados do COVID-19 para fazer a situação da saúde pública do estado parecer melhor.”

Se você deseja se tornar um profissional de ciência de dados ético, pense no futuro. Saiba desde já que em sua carreira, provavelmente, surgirão situações nas quais você precisará se posicionar contra o uso de suas habilidades para prejudicar outras pessoas. Olhando para 2021, o clima político pode estar propício para tais dilemas. 

 

Fonte: Data Science Skills for 2021: 10 Skills You Need to Get Ahead

Categorias
Resultado UFC Vagas

Resultado da seleção de bolsistas Full Stack e Frontend nos campi de Fortaleza e Quixadá

Hoje é dia de conhecer os novos colaboradores do Insight Lab. De 22 de fevereiro a 1º de março, realizamos o processo seletivo das bolsas de graduação para Desenvolvedores Full Stack e Frontend, com vagas nos campi de Fortaleza e Quixadá. Agora, veja a lista de alunos selecionados.

Estudantes aprovados:

Domingos Mykaeull Gomes Peres

Campus: Fortaleza

Vaga: Desenvolvedor Frontend

 

Francisco Evenilson Liandro Pinheiro

Campus: Quixadá

Vaga: Desenvolvedor Frontend

 

Gabriel Camurça Fernandes de Sousa

Campus: Fortaleza

Vaga: Desenvolvedor Frontend

 

Isabel Cristina de Oliveira Lopes

Campus: Fortaleza

Vaga: Desenvolvedora Frontend

 

Ulisses Queiroz da Silva

Campus: Quixadá

Vaga: Desenvolvedor Frontend


Parabéns e bem-vindos aos novos colaboradores do Insight Lab! 

E se você também deseja fazer parte do nosso laboratório, continue nos acompanhando aqui e nas redes sociais para saber sobre novas oportunidades de trabalho. 

 

Sair da versão mobile