Tipos de Aprendizado de Máquina
Tags: braziliandevs, machinelearning, ia, iniciante
Published: 2024-04-23 02:48:56


No meu último post aqui, eu trouxe um pouco do que venho vivenciando aprendendo sobre análise de dados. Dando sequência aos meus estudos, comecei a estudar um pouco sobre machine learning e trouxe aqui alguns conceitos mais básicos, como os tipos de aprendizado que existem!

Grande parte das coisas escritas aqui vem do que estou aprendendo no livro: 
[Mãos à obra: aprendizado de máquina com scikit-learn & tensorflow
](https://www.amazon.com.br/M%C3%A3os-obra-aprendizado-Scikit-Learn-inteligentes/dp/8550815489)

_~~To achando muito legal aprender sobre tudo isso. Sabe, é como se eu estivesse aprendendo sobre o cérebro de um computador. kkk~~_


_Então, vamos lá!_

---

Esse tipo de aprendizado se divide em algumas categorias. Vou resumir aqui, mas no decorrer do artigo aprofundarei em cada uma delas.


- **Treinamento com Supervisão Humana**: Os algoritmos de aprendizado de máquina podem ser treinados com ou sem supervisão humana. Isso é conhecido como:
 - **Aprendizado Supervisionado**: O algoritmo aprende a partir de um conjunto de dados rotulados fornecidos por humanos.
 - **Aprendizado Não Supervisionado**: O algoritmo aprende a partir de um conjunto de dados não rotulados, encontrando padrões e estruturas nos dados.
 - **Aprendizado Semissupervisionado**: Uma combinação dos dois anteriores, onde o algoritmo aprende a partir de um conjunto de dados parcialmente rotulados.
 - **Aprendizado por Reforço**: O algoritmo aprende através de tentativa e erro, recebendo recompensas ou punições por suas ações.
- **Aprendizado em Tempo Real**: Alguns algoritmos podem aprender gradualmente em tempo real. Isso é conhecido como aprendizado online. Por outro lado, o aprendizado em lote ocorre quando o algoritmo aprende a partir de um grande conjunto de dados de uma só vez.
- **Aprendizado Baseado em Instância vs Aprendizado Baseado em Modelo**: Os algoritmos de aprendizado de máquina podem aprender de duas maneiras principais:
 - **Aprendizado Baseado em Instância**: O algoritmo aprende os pontos de dados exatos do conjunto de treinamento e faz previsões com base em quão semelhante é um novo ponto de dados aos pontos de dados conhecidos.
 - **Aprendizado Baseado em Modelo**: O algoritmo detecta padrões nos dados de treinamento e cria um modelo preditivo. Esse modelo é então usado para fazer previsões sobre novos pontos de dados.

E ah, podemos combinar cada um desses critérios. Igual na programação onde podemos usar várias libs diferentes juntas. 

> No livro que estou lendo, ele dá um exemplo do filtro de spam. Imagine que você já utiliza de um filtro de spam muito bom, que já faz bem o trabalho dele. Porém, alguns e-mails de spam mudaram e esse filtro já não consegue captá-los, podemos então fazer com que ele aprenda instantaneamente com a utilização de um modelo de rede neural profundo treinado a partir de exemplos novos de spam. Isso faz dele um sistema de aprendizado supervisionado online, baseado em modelos. 

Agora vamos detalhar cada um dos tipos de aprendizados. Bora lá: 

## Aprendizado supervisionado/ Não Supervisionado 🎓

Podemos classificar aqui de acordo com a quantidade e também o tipo de supervisão que essas máquinas recebem durante seu treinamento.

Esse tipo de aprendizado se divide em quatro categorias:

- Supervisionado
- Não supervisionado
- Semissupervisionado
- Aprendizado por reforço 

### Aprendizado supervisionado 👩‍🏫

Nesse tipo de aprendizado, todo conjunto de dados fornecidos para treinamento do algoritmo inclui as soluções desejadas. Chamamos isso de `rótulos` ou `labels`. Voltando ao exemplo do spam, é como se ele fosse treinado com muitos exemplos de e-mails juntos e dentre esses e-mails vamos ter alguns spams. Para treinar esse tipo de sistema é necessário dar pra ele muitos exemplos de e-mails.

Em aprendizado de máquina, quando falamos em `atributo`, é um tipo de dado, por exemplo, os e-mails (textos), já as `características` assumem vários significados dependendo do contexto, geralmente corresponde ao atributo mais o seu valor. Por exemplo: 

```python
email = "Olá eu sou um e-mail!!!"
```

Veja alguns exemplos de algoritmos supervisionados. 

- K-ésimo vizinho mais próximo
- Regressão linear
- Regressão logística
- Máquinas de vetores de suporte
- Árvores de decisão e florestas aleatórias
- Redes neurais


### Aprendizado não supervisionado 🤖

Nesse caso, os dados de treinamento não são rotulados, ou seja, não trazem as soluções desejadas.

> Você deve estar pensando: UAI, E AGORA?

Nesse caso, o sistema tenta aprender sem um “professor”, na marra!

Temos alguns tipos, sendo os mais importantes:

- Clusterização
- K-Means
- Clusterização espacial baseada em densidade de aplicações com ruídos
- Análise de cluster hierárquica
- Detecção de anomalias
- Floresta de isolamento
- Dentre outros…

Vamos imaginar que você trabalha em uma escola dando aulas e gostaria de entender quais grupos de pessoas possuem mais semelhanças. Em nenhum momento vamos informar para o nosso algoritmo qual grupo o aluno X pertence, vai ser tarefa dele entender isso sozinho.

Outros exemplos bem comuns de aprendizado não supervisionado é a detecção de anomalia, transações incomuns no cartão pra evitar algum tipo de fraude, uma outra tarefa bem parecida seria a detecção de novidades, onde o objetivo é detectar coisas novas/instâncias novas que aparecem diferente de todas as outras que o conjunto de treinamento já possui. **Vale lembrar que esse tipo de situação exige um conjunto de treinamento muito limpo**.

No livro, ele dá um exemplo bem legal que é, imagine que você tenha milhares de fotos de cachorros e 1% delas representa um PUG, um algoritmo de detecção de novidade não deve tratar as novas fotos de PUG como novidade. Agora, em contrapartida disso, os algoritmos de detecção de anomalias poderiam considerar esses PUG’s tão raros e tão diferentes que provavelmente os classificaria como anomalias, o que não é nada legal…

Um outro exemplo de situação que poderíamos usar esse tipo de aprendizado, vamos imaginar que você tenha um mercadinho, e aí usamos uma regra de associação nos registros de vendas desse nosso mercadinho, com isso descobrimos que as pessoas que compram carne moída, presunto e queijo estão mais propensas a comprar também massa de lasanha, dessa forma podemos deixar a massa de lasanha mais próxima desses itens.

###  Aprendizado semissupervisionado 🤝

Rotular dados demanda muito **tempo e dinheiro**, então teremos alguns casos onde a grande quantidade de instâncias não rotuladas será bem maior que as rotuladas. E pra isso, a gente tem um nome chique: _aprendizado semissupervisionado_.

O livro traz um exemplo muito bom que é o Google Fotos, sabe quando ele meio que detecta as pessoas em comum, por exemplo, sabe todas as fotos que tem sua mãe, alguma amiga ou namorada e ele consegue detectar isso? Então, essa é a parte não supervisionada do algoritmo (_clusterização_), e aí ele fica esperando que você fale pra ele quem são essas pessoas ou seja, insira rótulos pra cada uma delas. Fazendo isso, você será capaz de pesquisar fotos da e com a pessoa a partir do seu nome.

**A grande parte dos algoritmos de aprendizado semissupervisionado são combinações de algoritmos supervisionados e não supervisionados. :)**

### Aprendizado por Reforço 🎮

Esse aprendizado é bem diferente dos demais. Nesse contexto, temos um elemento chamado de `agente`, que pode observar o ambiente, selecionar e executar ações e obter recompensas em troca, ou penalidades dependendo do caso _(recompensas negativas)_. Ele deve aprender sozinho qual é a melhor estratégia, que chamamos de política, para obter o maior número de recompensas ao longo do tempo. Essa política é o que define qual ação o agente deverá escolher quando está em uma determinada situação. 

![aprendizado reforco](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3dyfewppyfyk878whsk3.png)
Imagem retirei desse artigo [aqui](https://www.redesdesaude.com.br/aprendizado-de-maquina-machine-learning/)

Um exemplo de agente treinando para aprender a jogar o jogo de videogame “Super Mario Bros”:

- Ambiente: O mundo do jogo “Super Mario Bros”, incluindo todos os inimigos, moedas, power-ups, buracos, etc.
- Agente: O algoritmo de aprendizado por reforço que está tentando aprender a jogar “Super Mario Bros”.
- Ações: Os movimentos possíveis que o agente pode fazer (por exemplo, ir para a esquerda, ir para a direita, pular, etc.).
- Recompensas: O agente recebe uma recompensa positiva quando coleta uma moeda, derrota um inimigo ou completa um nível. Recebe uma recompensa negativa quando é derrotado por um inimigo ou cai em um buraco.
- Política: A estratégia que o agente usa para decidir qual ação tomar em um determinado estado. A política é atualizada à medida que o agente aprende com a experiência.

O objetivo do agente é aprender a política que maximiza a soma total de recompensas ao longo do tempo. Ele faz isso através de um processo de tentativa e erro, onde ele explora o ambiente (jogando o jogo e vendo os resultados) e explota o conhecimento que adquiriu (fazendo movimentos que ele acredita que levarão a recompensas altas).

## Aprendizado em Batch e Online 📊

Outro critério que é usado para classificarmos os sistemas de aprendizado é se ele consegue ou não aprender de forma incremental, isto é, a partir da entrada de um fluxo de dados.

### Aprendizado em Batch (por Ciclo) 🔄

Nesse caso, o sistema não consegue aprender de forma incremental, ele deve ser treinado usando todos os dados disponíveis. Isso demanda muito tempo e recurso computacional, então normalmente ele é realizado offline. Primeiro o sistema é treinado, em seguida é implementado, e como todo o treinamento/aprendizado já foi adquirido, ele roda/executa sem aprender mais nada. 

_E se eu quiser ter acesso a dados novos?_ Aí você vai precisar treinar ele novamente a partir do zero no conjunto completo de dados, ou seja, não só com os dados novos mas também com os antigos e por fim descontinua com o sistema antigo substituindo pelo novo. A parte boa disso tudo é que todo esse processo de treinamento até a disponibilização pode ser automatizado. 

Vale lembrar que esse tipo de coisa leva bastante tempo, então geralmente treina-se um novo sistema apenas a cada 24 horas ou semanalmente. E ah, caso esse sistema tenha recursos limitados (memória, E/S do disco, E/S de rede etc.) fazer upload de grandes quantidades de dados e usar os inúmeros recursos para treinar por dias e horas isso com toda certeza resultaria num bug do tipo `showstop`. Um "bug do tipo `showstop`" é um erro ou falha que ocorreria se o sistema tentasse processar uma quantidade muito grande de dados de uma só vez, especialmente se os recursos do sistema fossem limitados. Isso poderia causar uma variedade de problemas, como travamentos do sistema, lentidão extrema ou até mesmo a perda de dados. Portanto, nesse caso, é melhor tentar algum algoritmo que aprende de forma incremental, processando os dados em pequenos lotes ao longo do tempo, em vez de tentar processar todos os dados de uma vez.

### Aprendizado online (incremental) 📈


Nesse caso, já conseguimos treinar nosso sistema incrementalmente, ou seja, fornecendo para ele as instâncias de dados de forma sequencial, individual ou em pequenos grupos, chamados de mini-batches. _~~Traduzindo: Na calmaria!~~_

Cada etapa desse aprendizado é rápida e tem um custo bem mais baixo, assim o sistema consegue aprender instantaneamente os dados novos em tempo real, assim que eles entram. 

![imagem com fluxo que representa o aprendizado online](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p7xjs3q3c53dlc8jmypm.png)

Esse tipo de aprendizado é muito bom para sistemas que recebem dados em um fluxo contínuo e que precisam se adaptar a essas mudanças rápido ou de forma independente, por exemplo: preço das ações, mudança no clima.

Ou também quando seus recursos computacionais são limitados, até porque uma vez que o seu sistema aprendeu com aqueles dados ele não precisa mais deles, logo você pode descartar. (a menos que precise daqueles dados depois). O que pode economizar bastante espaço. 

Os algoritmos de aprendizagem incremental também são utilizados para treinar sistemas em grandes conjuntos de dados que não cabem na memória principal de uma máquina, chamamos isso de aprendizado _out-of-core_. O algoritmo faz upload de parte desses dados, executa uma etapa do treinamento neles e repete esse processo até que ele tenha sido executado em todos os dados.


![imagem com fluxo incremental tratando muitos dados](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/06u5m22c59m2mqerewb1.png)

Um ponto importante dos sistemas de aprendizado online é a rapidez com que eles devem se adaptar a mudanças de dados, para isso usamos a `taxa de aprendizado`. Por exemplo: Se você definir uma alta taxa de aprendizado, o sistema vai se adaptar rapidamente a dados novos mas também vai esquecer mais rápido os dados antigos. Agora se você definir uma taxa mais baixa de aprendizado, o sistema vai ser mais _"preguiçoso",_ assim dizendo, ele vai aprender porém numa velocidade menor.

Um grande problema/desafio nesse tipo de aprendizado é que se fornecermos dados ruins o desempenho do sistema diminui gradualmente. Para mitigar isso, precisamos monitorar de perto o sistema e parar com o aprendizado dele imediatamente.

## Aprendizado baseado em instâncias VS baseado em modelo 🔍

Outra maneira de classificar esses sistemas de aprendizado de máquina é por meio da _generalização_.

A maioria desses sistemas trabalha com **predições**. Predições, no contexto de aprendizado de máquina, referem-se à capacidade de um modelo de usar informações que ele aprendeu de um conjunto de dados de treinamento para fazer uma estimativa informada ou "previsão" sobre algo. Por exemplo, se tivermos um modelo treinado para prever o preço de uma casa com base em suas características (como tamanho, número de quartos, localização, etc.), o modelo pode "prever" o preço de uma nova casa com base nessas características.

Portanto, quando dizemos "dado uma série de exemplos de treinamento, o sistema precisa conseguir fazer predições boas o suficiente para (generalizar) exemplos que nunca viu antes", estamos dizendo que o sistema deve ser capaz de aplicar o que aprendeu com os dados de treinamento para fazer previsões precisas sobre novos dados que não faziam parte do conjunto de treinamento. A capacidade de um modelo de fazer isso - de generalizar a partir de seus dados de treinamento para novos dados - é uma medida fundamental de seu desempenho.

A ideia é que ter bons rendimentos em dados de treinamento é muito bom, mas melhor ainda é ter em instâncias de dados novas.

Temos duas abordagens principais no que se diz a respeito da generalização. 
- Aprendizado baseado em instâncias 
- Aprendizado baseado em modelo

### Aprendizado baseado em instância 📚 

Se pararmos para analisar nós mesmos, a forma mais simples de se aprender é memorizando algo, concorda comigo? Mas se a gente aplicar algo do tipo para um filtro de spam, por exemplo, ele apenas sinalizaria todos os e-mails idênticos/iguais em relação aos e-mails já sinalizados pelos usuários. Não é a pior solução do mundo, mas também não é a melhor, rs!

Em vez de fazer isso, podemos mudar nossa abordagem, que tal nosso filtro sinalizar também os e-mails semelhantes aos conhecidos?! Isso exige o que chamamos de medida de similaridade (SM) entre dois e-mails.

Vamos pensar o seguinte, essa medida de similaridade ela poderia conter o número de palavras que eles têm em comum, dessa forma o sistema marcaria um e-mail como spam se tivesse muitas palavras em comum com um e-mail **spam conhecido**. 

Para isso damos o nome de aprendizado baseado em instância: o sistema aprende os exemplos usando a memorização e depois generaliza para novos casos e para isso ele usa uma medida de similaridade que serve basicamente para comparar com os outros exemplos.

### Aprendizado baseado em modelo 🛠️ 

Aqui utilizamos algoritmos que podem aprender a partir de dados e fazer previsões ou decisões.

Esses modelos são “treinados” usando conjuntos de dados históricos, onde eles identificam padrões e relações. Uma vez treinados, eles podem ser aplicados a novos dados para prever resultados.

Voltando ao nosso conjunto de dados sobre casas e seus preços. As características das casas (como tamanho, número de quartos, localização) são as entradas do modelo, e os preços são as saídas que queremos prever.

- Coleta de Dados: Você reúne dados de várias casas vendidas recentemente.
- Treinamento do Modelo: Você escolhe um modelo de aprendizado de máquina, como a regressão linear, e “ensina” ao modelo como o preço das casas se relaciona com suas características.
- Teste do Modelo: Depois de treinado, você testa o modelo com dados de casas cujos preços você já conhece para ver se ele pode prever corretamente.
- Uso do Modelo: Uma vez que o modelo está bem ajustado, você pode usá-lo para estimar o preço de uma casa nova no mercado, baseando-se nas suas características.

O modelo aprendeu a relação entre as características das casas e seus preços e agora pode fazer previsões informadas sobre novas casas. 

Isso é aprendizado de máquina baseado em modelo. Ele é útil porque pode nos ajudar a tomar decisões baseadas em dados e experiências passadas._~~(queria aplicar isso na minha vida real)~~_


----

Vou deixar o [link do GitHub](https://github.com/anabergerr/machine-learning-studies) onde estou colocando códigos e também explicações desses meus últimos aprendizados nesse mundo muito doido de Machine Learning haha!

Qualquer duvida, vocês já sabem! Podem me perturbar.

bjs bjs e até a próxima 💟