Full text
25-308727.0 CDD-006.3 Dados Internacionais de Catalogação na Publicação (CIP) (Câmara Brasileira do Livro, SP, Brasil) Inteligência artificial [livro eletrônico] : aprendizagem de máquina (modelos preditivos e suas aplicações práticas em Python) / Eduardo Palhares Júnior...[et al.] ; coordenação Tiago Francisco Andrade Diocesano...[et al.]. -- 1. ed. -- Manaus, AM : Ed. dos Autores, 2025. PDF Outros autores: Wenndisson da Silva Souza, Raimundo Fagner Costa, Alexandre Lopes Martiniano, Nivaldo Rodrigues e Silva. Outros coordenadores: Jaidson Brandão da Costa, Elvican dos Santos Silva, Martinho Correia Barros, Adelino Maia Galvão Filho. Bibliografia. ISBN 978-65-01-74472-8 1. Aprendizagem de máquina 2. Ciência da computação 3. Inteligência artificial 4. Python (Linguagem de programação para computadores) 5. Tecnologia I. Júnior, Eduardo Palhares. II. Souza, Wenndisson da Silva. III. Costa, Raimundo Fagner. IV. Martiniano, Alexandre Lopes. V. Silva, Nivaldo Rodrigues e. VI. Diocesano, Tiago Francisco Andrade. Índices para catálogo sistemático: 1. Inteligência artificial 006.3 Aline Graziele Benitez - Bibliotecária - CRB-1/3129 DOI: 10.5281/zenodo.15333838
Expediente do IFAM MINISTÉRIO DA EDUCAÇÃO SECRETARIA DE EDUCAÇÃO PROFISSIONAL E TECNOLÓGICA INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO AMAZONAS Reitor Jaime Cavalcante Alves Pró-Reitor de Administração Fábio Teixeira Lima Pró-Reitor de Gestão de Pessoas Leandro Amorim Damasceno Pró-Reitora de Ensino Rosângela Santos da Silva Pró-Reitora de Extensão Maria Francisca Morais de Lima Pró-Reitor de Pesquisa, Pós-Graduação e Inovação Paulo Henrique Rocha Aride Diretor Geral do Campus Manaus Distrito Industrial Nivaldo Rodrigues e Silva
Expediente do Projeto CITHA MINISTÉRIO DA EDUCAÇÃO SECRETARIA DE EDUCAÇÃO PROFISSIONAL E TECNOLÓGICA INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO AMAZONAS Gestores Nivaldo Rodrigues e Silva Samirames da Silva Fleury Alyson de Jesus dos Santos Maria Cassiana Andrade Braga Adanilton Rabelo de Andrade Coordenadores Tiago Francisco Andrade Diocesano Jaidson Brandão da Costa Elcivan dos Santos Silva Martinho Correia Barros Adelino Maia Galvão Filho Expediente de Produção Autor(es) Eduardo Palhares Jr. Wenndisson da Silva Souza Raimundo Fagner Costa Alexandre Lopes Martiniano Nivaldo Rodrigues e Silva Avaliação Pedagógica Samirames da Silva Fleury Diagramadores Wenndisson da Silva Souza Eduardo Palhares Jr. Fabio Serra Ribeiro Couto Revisores de Texto Alexandre Lopes Martiniano Alyson de Jesus dos Santos
Inteligência Artificial — Aprendizagem de Máquina (modelos preditivos e suas aplicações práticas em Python) Autores Eduardo Palhares Jr. Wenndisson da Silva Souza Raimundo Fagner Costa Alexandre Lopes Martiniano Nivaldo Rodrigues e Silva Prefácio por Nivaldo Rodrigues e Silva Revisão Alexandre Lopes Martiniano Alyson de Jesus dos Santos 1ª Edição Manaus - AM 2025
Prefácio Vivemos em uma era impulsionada por dados e decisões inteligentes, e o Machine Learning ou Aprendizado de Máquina está no centro dessa transformação. Esta tecnologia tem revolucionado diversos setores ao permitir que sistemas aprendam com os dados e tomem decisões com mínima intervenção humana. Este e-book foi desenvolvido para guiar o leitor por uma jornada estruturada e acessível no universo do Machine Learning, desde os fundamentos teóricos até aplicações práticas em problemas reais. O conteúdo foi cuidadosamente planejado para atender tanto iniciantes quanto profissionais que desejam aprofundar seus conhecimentos. No primeiro módulo, são apresentados os conceitos essenciais do Machine Learning, incluindo os tipos de aprendizado, as etapas de um projeto e as principais bibliotecas da linguagem Python utilizadas na área. O segundo módulo aprofunda-se em algoritmos supervisionados e não supervisionados, trazendo exemplos práticos que facilitam a compreensão e a aplicação das técnicas. No terceiro módulo, abordamos a preparação de dados, a avaliação de modelos e a importância da escolha adequada de métricas de desempenho. Já o módulo final propõe um estudo de caso aplicado à área ambiental, demonstrando como modelos de Machine Learning podem contribuir para a previsão de padrões climáticos e a tomada de decisões sustentáveis. Mais do que um guia técnico, este e-book busca despertar no leitor o senso crítico e a curiosidade para explorar o potencial do Machine Learning. Ao aplicar os conhecimentos adquiridos, o leitor será capaz de transformar dados em soluções inteligentes, contribuindo para um mundo mais eficiente, inovador e sustentável. Que esta leitura inspire descobertas, estimule o pensamento analítico e fortaleça sua jornada no fascinante campo do Aprendizado de Máquina.
Projeto de Capacitação e Interiorização em Tecnologias Habilitadoras na Amazônia - CITHA O projeto CITHA surge com o objetivo de fortalecer a economia da Amazônia por meio do incentivo ao empreendedorismo local e do desenvolvimento sustentável. Sua proposta é capacitar profissionais e impulsionar a criação de startups voltadas para a bioeconomia, além de apoiar cooperativas locais na melhoria de seus processos produtivos. A implementação de tecnologias inovadoras é uma das estratégias centrais do projeto, visando oferecer soluções eficientes que atendam às necessidades regionais, como a otimização dos recursos naturais e a melhoria da infraestrutura local. Ao longo de sua execução, o projeto se compromete a integrar os diversos stakeholders, como governos, empresas, ONGs e comunidades, por meio da capacitação da mão de obra local. O objetivo é formar um capital intelectual qualificado, capaz de apoiar uma governança eficiente, promover a inovação e assegurar a sustentabilidade. O CITHA dedica-se à criação de processos internos que incentivem o desenvolvimento de novos métodos e tecnologias, adaptáveis às particularidades do território amazônico. Em síntese, o projeto CITHA visa criar um ciclo de desenvolvimento que não só incentive o empreendedorismo, mas também promova a modernização das estruturas locais, elevando a qualidade de vida das populações da Amazônia. Focado em áreas como bioeconomia, inovação e transferência de tecnologia, o projeto busca estabelecer um ecossistema mais forte e autossustentável, capaz de responder eficientemente às demandas do mercado e da sociedade.
Lista de Expressões para Enriquecimento de Conteúdo Este material foi cuidadosamente estruturado para apoiar sua jornada de aprendizado. Ao longo dos capítulos, você encontrará diversas chamadas sinalizadas por ícones especiais, que ajudarão a destacar pontos-chave e enriquecer sua compreensão. Durante a diagramação, esses ícones serão inseridos conforme as indicações dos autores, guiando você para diferentes tipos de conteúdo e atividades que potencializam seu estudo. Fique Alerta! Destaque para conceitos, expressões e trechos fundamentais que merecem sua atenção especial para a compreensão do conteúdo. Iniciando o diálogo... Espaço para reflexão crítica. Aqui você será convidado(a) a problematizar os temas abordados, relacionando-os com sua experiência e buscando conexões relevantes para aprofundar seu aprendizado. Conhecendo um pouco mais! Indicação de fontes complementares, como livros, entrevistas, vídeos, aplicativos, links e outros recursos para ampliar seu conhecimento sobre o tema. Caso Prático Aplicação direta do conteúdo em exemplos concretos, para facilitar a fixação e demonstrar a utilidade do que foi aprendido. Copie e Teste! Trechos de código prontos para serem copiados e executados, para que você possa experimentar, validar e explorar na prática os conceitos estudados.
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA informações é enorme e cresce exponencialmente. Sem a ajuda de algoritmos de machine learning, seria impossível processar, analisar e extrair conclusões de maneira rápida e eficiente. Logo, ensinar máquinas a aprender nos ajuda a encontrar padrões e tomar decisões com base em dados que, sozinhos, não daríamos conta de analisar. Para personalização e praticidade Muitos serviços de streaming de música ou vídeo utilizam aprendizado de máquina para sugerir conteúdos de acordo com o nosso gosto. Esse tipo de personalização surge porque sistemas inteligentes analisam quais filmes assistimos, que músicas ouvimos e em que momento trocamos de faixa, para oferecer recomendações cada vez mais certeiras. Desse modo, ensinar máquinas a aprender cria experiências mais práticas e personalizadas, tanto para quem consome conteúdos quanto para quem os produz. Para inovação em diversos setores Desde a agricultura até a área da saúde, o aprendizado de máquina traz possibilidades de inovação. Na agricultura, por exemplo, é possível prever pragas ou identificar o melhor momento para irrigar, baseando-se em estatísticas de um grande conjunto de dados. Já na medicina, algoritmos podem auxiliar médicos a detectar precocemente doenças em exames de imagem, contribuindo para diagnósticos mais rápidos e assertivos. Para alunos do Ensino Médio, isso significa compreender desde cedo como a tecnologia pode ser usada para resolver problemas reais e melhorar a qualidade de vida das pessoas. 1.1.2 Uma nova forma de aprender (e ensinar) O machine learning desperta interesse não só por suas aplicações práticas, mas pela lógica que ele segue. Em vez de dizer explicitamente como resolver uma questão, confiamos em dados e padrões. Esse método é bastante alinhado ao pensamento científico: levantamos hipóteses, testamos com exemplos e checamos se o modelo previu corretamente ou não, esse ciclo de tentativa e erro não só estimula a curiosidade, mas nos ensina a ter uma mente investigativa e metódica. É muito importante e de valor imensurável compreender essas ideias agora. Saber como trabalhar com dados e algoritmos abre portas em várias carreiras, desde áreas tecnológicas como Ciência de Dados e Engenharia de Software, até campos em que a tomada de decisões baseada em análise de dados é fundamental, como Economia, Biologia e afins. 1.1.3 Conectando teoria e prática Uma das características mais legais de machine learning é que podemos ver resultados na prática rapidamente. Há ferramentas e bibliotecas em Python, por exemplo, que permitem criar modelos simples para classificar imagens, textos ou até prever valores em tabelas. Ao testar pequenos projetos, como analisar por que algumas músicas recebem mais “likes” do que outras, vocês começam a ter uma noção real de como funciona o ciclo de coleta de dados, treinamento de algoritmo e avaliação de resultados. Esses experimentos são estimulantes porque mostram o lado prático do que se estuda nas aulas de Matemática, Estatística e até mesmo de Programação. É aí que enxergamos a importância dos conceitos de média, variância, probabilidade e lógica: sem eles, é difícil ajustar um modelo de forma correta. 15
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA 1.1.4 Por que isso tudo importa? Entender por que ensinar máquinas a aprender não é só uma curiosidade científica; é preparar-se para o futuro. As transformações tecnológicas nos convidam a ser mais criativos, analíticos e colaborativos. Quanto antes compreendermos esses processos, melhor conseguiremos aplicá-los de maneira ética e construtiva, resolvendo problemas e contribuindo para o desenvolvimento da nossa sociedade. Vivemos em uma era em que as inovações tecnológicas fazem parte do nosso cotidiano. Aprender machine learning é como revelar os bastidores de muitas dessas tecnologias, desde as recomendações que recebemos online até previsões de clima e trânsito, tudo isso impulsionado por algoritmos treinados com dados. E o mais interessante: vocês podem ser os próximos a desenvolver soluções criativas, responsáveis e transformadoras! Pense um pouco, na Amazônia, o aprendizado supervisionado pode ser empregado para Monitoramento de espécies, usando fotos ou áudios gravados na floresta, o modelo aprende a reconhecer animais específicos e alertar quando uma espécie rara é detectada; Agricultura de precisão: A partir de variáveis como tipo de solo, umidade e histórico de safra, prevê-se a quantidade de fertilizante ideal, evitando o desperdício; Prevenção de desmatamento: Com imagens de satélite rotuladas, o computador consegue identificar áreas de risco para desmatamento ilegal, ajudando órgãos de fiscalização; E outra infinidade de possibilidades, descubra! 1.2 Aprendizagem Supervisionada Iniciando o diálogo... Você já imaginou como um computador consegue “adivinhar” qual animal aparece em uma foto ou prever se vai chover amanhã? No aprendizado supervisionado, fornecemos exemplos rotulados para uma máquina, para que ela possa descobrir padrões e aprender a tomar decisões ou fazer previsões a partir de novos dados (RUSSELL; NORVIG, 2003). É uma das áreas mais conhecidas e baseia-se em técnicas que permitem que sistemas computacionais evoluam com a experiência. E se quisermos que um programa identifique se uma folha pertence a uma planta nativa da Amazônia ou não? Precisamos primeiro mostrar várias folhas, dizendo “Esta é de uma planta amazônica; esta outra não é”. Assim, o modelo “aprende” como reconhecer essas características. Figura 1.1: Imagens retiradas da Wikimedia Commons: vitória-régia amazônica e do cerrado arnica do campo. 16
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA 1.2.1 Como funciona o aprendizado supervisionado? O paradigma supervisionado, de acordo com Mitchell (1997), envolve treinar modelos com exemplos rotulados para aprender funções de mapeamento. Para entendermos melhor como funciona o processo de aprendizado supervisionado, podemos visualizar um ciclo composto por quatro etapas principais, conforme ilustrado na figura a seguir: Figura 1.2: Ciclo do Aprendizado Supervisionado. •Coleta e Preparação dos Dados (x, y): O processo começa com a coleta de dados históricos compostos por pares de entrada (x) e saída (y). As entradas podem ser variáveis como imagens, textos, medições ou registros diversos (por exemplo, temperatura e umidade), enquanto as saídas são os rótulos ou respostas corretas (como “choveu ou não”). Esses pares (x, y) formam a base sobre a qual o modelo vai aprender. •Treinamento do Modelo com um Algoritmo de Machine Learning: Os pares (x, y) são enviados para um algoritmo de aprendizado, que busca identificar padrões e relações entre as entradas e suas respectivas saídas. Esse processo é conhecido como treinamento e envolve o ajuste de parâmetros internos do modelo, com o objetivo de minimizar os erros entre as previsões feitas e os rótulos reais. Nesta etapa, também é importante avaliar se o modelo está bem generalizado (aprendeu os padrões de forma eficaz) ou se sofre de overfitting (decorou os exemplos) ou underfitting (não captou os padrões). •Geração do Modelo Treinado: Após o treinamento, temos um modelo ajustado, pronto para ser testado em novos dados. Esse modelo é, essencialmente, uma representação da relação aprendida entre entradas e saídas, e será usado para fazer previsões. •Predição com Novos Dados (ŷ): Quando fornecemos uma nova entrada (x), agora sem o rótulo conhecido, o modelo treinado utiliza o que aprendeu para estimar uma saída (chamada de ŷ, ou y-hat). Se o modelo foi bem treinado, essa previsão tende a ser bastante próxima da resposta correta, permitindo a aplicação prática em diversos contextos, como reconhecimento de padrões, diagnósticos, previsões meteorológicas e muito mais. Dessa forma, o ciclo se completa toda vez que ajustamos um modelo com dados rotulados e, posteriormente, utilizamos esse modelo para predizer rótulos desconhecidos. Esse mesmo fluxo pode ser repetido quando surgem novos dados ou quando desejamos melhorar ainda mais a qualidade das previsões. Suponha que queremos ensinar o computador a distinguir peixes-boi de outros mamíferos aquáticos por fotos. Precisamos: 17
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA •Dados de Treinamento: Conjunto de imagens de peixes-boi (rotuladas como “peixeboi”) e de outros animais (rotuladas como “outros mamíferos”). •Treinamento: O modelo analisa as imagens, compara com o rótulo (“peixe-boi” ou “outro”) e ajusta seus parâmetros. •Predição: Ao receber uma nova foto, o modelo “decide” se vê um peixe-boi ou não, com base nos padrões que aprendeu. Assim, mesmo sem entrar em detalhes matemáticos, compreendemos que o aprendizado surge da exposição a exemplos corretos. Quanto melhor a qualidade dos dados, mais eficaz é a classificação. 1.2.2 Classificação e Regressão No aprendizado supervisionado, há duas tarefas básicas: •Classificação: quando o objetivo é colocar cada entrada em uma categoria. Exemplo: dizer se a imagem de um drone mostra um trecho de floresta alagada ou em área seca. •Regressão: quando o objetivo é prever um valor numérico. Exemplo: estimar quanta chuva cairá em uma região amazônica, analisando dados climáticos como umidade e temperatura. Figura 1.3: Gráfico didático para reforçar os conceitos de Classificação e de Regressão. Esses dois formatos abrangem boa parte das aplicações na área. Por exemplo, prever se uma pessoa está “apta” ou “não apta” a receber um medicamento é classificação; estimar a altura de uma árvore com base em sua circunferência é regressão. Independentemente do tipo de problema, seja de classificação ou de regressão, existe um passo fundamental para garantir que o modelo funcione de forma confiável: a separação dos dados em conjuntos de treino e teste. Essa prática é essencial para avaliar o desempenho do modelo em situações reais, evitando o temido Overfitting e o Underfitting como veremos a seguir. 18
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Fique Alerta! Overfitting (superajuste): é quando o modelo decora detalhes específicos do conjunto de treinamento e falha ao prever corretamente fora desses exemplos. Underfitting (subajuste): é quando o modelo não aprende os padrões o suficiente e obtém baixa precisão, mesmo nos dados de treino. Generalização: é o objetivo principal é equilibrar aprendizado nos dados conhecidos e bom desempenho em dados novos e desconhecidos. 1.2.3 Por que separar os dados? Separar os dados em conjuntos de treino e teste é uma prática essencial no desenvolvimento de modelos de regressão e de aprendizado de máquina em geral. Essa divisão permite que o modelo aprenda com uma parte dos dados (conjunto de treino) e seja avaliado com outra parte que ele nunca viu antes (conjunto de testes). Isso ajuda a verificar se o modelo realmente está aprendendo a identificar padrões e não apenas memorizando os dados fornecidos. Quando um modelo é testado nos mesmos dados com os quais foi treinado, os resultados podem ser enganosamente bons. Isso porque ele pode simplesmente estar reproduzindo os exemplos memorizados, sem ser capaz de generalizar para novas situações. Separar os dados garante que o desempenho avaliado reflita a capacidade do modelo de lidar com dados do “mundo real”, ou seja, dados novos que não estavam disponíveis durante o processo de aprendizado. Além disso, essa abordagem ajuda a evitar o chamado overfitting, que ocorre quando o modelo se ajusta demais aos dados de treino e perde a capacidade de fazer boas previsões em novos casos. O conjunto de teste, portanto, serve como um “termômetro” para verificar se o modelo está robusto e equilibrado. Em geral, costuma-se usar de 70% a 80% dos dados para o treinamento e o restante para o teste. Em projetos mais complexos, pode-se ainda usar um terceiro subconjunto chamado de validação, destinado ao ajuste de hiperparâmetros antes da avaliação final com o conjunto de teste. Esse cuidado todo contribui para o desenvolvimento de modelos mais confiáveis e eficazes. O aprendizado supervisionado é como ensinar um estudante com respostas corretas para que, no futuro, ele possa resolver novas questões sozinho. É a base de muitas aplicações de inteligência artificial e ciência de dados. No próximo módulo, veremos como funcionam os algoritmos e as técnicas que tornam esse aprendizado possível, bem como os cuidados na coleta e preparação dos dados. 1.2.4 Aplicando seus conhecimentos 1. Explique, com suas palavras, a diferença entre classificação e regressão. 2. Dê um exemplo prático de como aplicar aprendizado supervisionado para resolver um problema da sua comunidade. 3. Por que é importante separar dados de treino e dados de teste? 19
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA 1.3 Regressão Linear Iniciando o diálogo... Olá, estudante! Chegamos a um tópico muito importante, a Regressão Linear. De forma bem simplificada, podemos dizer que a regressão linear é um método usado para descobrir como variáveis se relacionam e, com isso, prever valores futuros. No dia a dia, ela aparece em diversas áreas: da economia para prever o preço dos itens da cesta básica, na agricultura para estimar a produção de grãos, ou ainda no campo ambiental, para estimar a qualidade do ar, mudanças na temperatura, períodos de chuvas, etc. 1.3.1 O que é Regressão Linear? A Regressão Linear é uma técnica estatística e computacional usada para entender e quantificar a relação entre variáveis (MITCHELL, 1997), sendo uma das técnicas fundamentais em modelagem preditiva, como discutido por Géron (2023). Nesse exemplo, estamos interessados em prever a quantidade de frutos produzidos por hectare com base em uma única variável: a quantidade de chuva registrada em determinado período. Figura 1.4: Regressão Linear: Relação entre Chuva e Produção de Frutos. A variável independente (no eixo X) é a quantidade de chuva (em milímetros). A variável dependente (no eixo Y) é a produção de frutos por hectare, é o que queremos estimar. Cada ponto verde no gráfico representa uma observação real: uma combinação de quantidade de chuva e respectiva produção observada. A linha preta traçada é o resultado do modelo de regressão linear, ela indica a tendência geral da relação entre as variáveis. Podemos interpretar essa linha como uma estimativa média: quanto mais chuva, maior tende a ser a produção de frutos. Porém, a produção também sofre influência de outros fatores (como solo, fertilizantes, pragas etc.), o que explica por que os pontos não estão exatamente sobre a linha (isso é o ruído dos dados). Este é um ótimo exemplo de como o machine learning pode ser aplicado de forma prática: ao entender padrões em dados históricos, conseguimos fazer previsões e tomar 20
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA decisões mais informadas, neste caso, ajudar agricultores a planejar suas safras com base em fatores ambientais. Regressão Linear Simples Quando há apenas uma variável explicativa (x) para prever y, chamamos de regressão linear simples. A fórmula que define a linha (reta) de melhor ajuste é: ˆy=θ0+θ1x onde: •ˆyé o valor previsto, •xé a variável independente, •θ0é o coeficiente que chamamos de intercepto ou termo de bias, •θ1é o coeficiente angular (a inclinação da reta). Regressão Linear Múltipla Se tivermos mais de uma variável independente por exemplo, chuva (mm), insolação (horas de sol) e fertilizante (em kg), o modelo se torna: ˆy=θ0+θ1x1+θ2x2+···+θnxn Vejam! É o mesmo princípio, mas agora com várias variáveis explicativas (mais de uma entrada). 1.3.2 Para que serve? O principal uso é prever um valor contínuo. Seja prever a nota de um aluno a partir de horas de estudo e exercícios resolvidos, prever o volume de chuva a partir de padrões climáticos ou prever a produtividade agrícola em determinada região. A regressão linear “aprende” com dados já conhecidos (históricos), ajusta uma reta (ou hiperplano) que melhor representa a relação entre x e y e, depois, usa essa reta para prever valores futuros. 1.3.3 Como Funciona na Prática? Para entender como o modelo encontra a reta de melhor ajuste, é importante conhecer três componentes centrais: a hipótese (ou função de predição), a função de custo e o processo de otimização, conhecido como descida do gradiente. Hipótese ou Função de Predição A hipótese (também chamada de função de predição) é a equação citada antes: ˆy=θ0+θ1x No caso de uma só variável, é como traçar uma reta que melhor se encaixe aos pontos em um gráfico onde o eixo x é a variável preditora e o eixo y é o valor observado. É como o modelo enxerga os dados e tenta prever resultados a partir disso. A hipótese é uma das peçaschave da regressão linear (e de muitos algoritmos de aprendizado de máquina). Ela representa a função que o modelo usa para fazer previsões, ou seja, é o “chute educado” que o modelo dá com base nos dados de entrada. 21
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Por que ela é importante? • É a fórmula usada para prever novos valores. • Serve como base para calcular o erro (função de custo). • É ajustada repetidamente durante o treinamento para melhorar a performance do modelo. Função de Custo A função de custo é uma fórmula matemática usada para medir o erro entre as previsões do modelo e os valores reais dos dados. Em outras palavras, ela diz ao modelo o quanto ele está errando e o objetivo do treinamento é minimizar esse erro. Vamos imaginar que temos uma função de predição, nossa famosa reta, e queremos saber o quão boa ela está. Para isso, usamos a função de custo, que compara os valores previstos com os valores reais de um conjunto de dados. Para medir se a reta está “boa” ou não, definimos uma função de custo, como o Erro Quadrático Médio (MSE - Mean Squared Error). Na forma simples, podemos escrever: J(θ0, θ1) = 1 2m m X i=1 (ˆy(i)−y(i))2 onde: •mé o número total de exemplos; •y(i)é o valor real do exemplo i; •ˆy(i)é o valor previsto. •J(θ0, θ1)é o valor da função de custo (o erro total) O objetivo é minimizar J. Se esse valor é pequeno, significa que as previsões do modelo ficam próximas dos valores reais. Se o valor é grande, algo está errado: ou a reta não está bem ajustada, ou há muitos “ruídos” nos dados. Figura 1.5: Custo em função de θ1(com θ0= 0). 22
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Otimização (Descida do Gradiente) Para chegar aos coeficientes θ0eθ1que minimizam a função de custo, um método frequentemente usado é o Gradiente Descendente. De modo geral, ele faz várias iterações, ajustando θ0eθ1passo a passo. A seguir, apresentamos a formulação matemática básica da atualização dos parâmetros com o algoritmo de gradiente descendente: θ0:= θ0−α·1 m m X i=1 (ˆy(i)−y(i)) θ1:= θ1−α·1 m m X i=1 ((ˆy(i)−y(i))·x(i)) A cada passo, o algoritmo calcula o quanto alterar cada θpara tornar o custo menor, até “convergir” para valores que representem um mínimo, esperamos que seja o mínimo global ou algo próximo. Imagine a função de custo como um vale ou uma montanha com um fundo (mínimo). O objetivo é chegar até o ponto mais baixo, onde o erro é mínimo. A descida do gradiente funciona como se estivéssemos descendo esse terreno, dando passos na direção mais inclinada, ou seja, onde o custo diminui mais rapidamente, como pode ser exemplificado no gráfico abaixo. Entretanto, precisamos ficar atentos na Taxa de Aprendizado (α), cuidado com o tamanho do passo, pois se for muito pequena, a descida é lenta, mas se for muito grande, o modelo pode ”pular”o mínimo e nunca convergir. Figura 1.6: Descida do Gradiente sobre a Função de Custo. Fique Alerta! A função de predição gera os valores estimados. A função de custo mede o erro dessas previsões. A descida do gradiente ajusta os parâmetros para reduzir esse erro, é o mecanismo que faz o modelo aprender com os erros. 23
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Exemplo prático: Produção Agrícola e Sustentabilidade Imagine que você vive em uma comunidade amazônica e quer entender como a quantidade de chuva (variável x) influencia a produção de açaí por hectare (variável y). Para isso, você coleta dados reais de cinco meses consecutivos. Mês Chuva (mm) Produção de Açaí (kg) 1 120 55 2 80 32 3 150 63 4 90 40 5 110 52 Tabela 1.1: Dados de chuva e produção de açaí. Com esses dados, aplicamos um modelo de regressão linear simples, que estima a relação entre as variáveis. O resultado é uma equação que nos permite prever a produção com base na quantidade de chuva. Para efeitos didáticos, digamos que após o treinamento, o modelo encontrou os seguintes valores: θ0(intercepto): aproximadamente 2.76 θ1(inclinação): aproximadamente 0.43 Ou seja, o modelo estima que a cada 1 mm a mais de chuva, a produção média de açaí aumenta em cerca de 0,43 kg por hectare. Se quisermos prever a produção em um mês com 130 mm de chuva, basta substituir o valor na equação: y= 2,76 + 0,43 ·130 = 58,66kg Abaixo, visualizamos os pontos coletados e a reta de regressão ajustada, que mostra a tendência da relação entre chuva e produtividade. Figura 1.7: Produção de Açaí vs. Quantidade de Chuva. Além de ser uma ferramenta de tomada de decisão, esse tipo de análise promove o uso consciente dos recursos naturais, respeitando os ritmos da floresta e garantindo maior segurança econômica para comunidades ribeirinhas e agricultores familiares. Esse tipo de modelo pode ajudar cooperativas agrícolas e gestores regionais a planejar melhor o estoque, a logística de transporte e até o preço de venda em diferentes épocas. Em termos de sustentabilidade, 24
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Projetos Práticos Colocar a teoria em prática é essencial para consolidar o aprendizado. Aqui vão algumas ideias: •Use dados abertos: Acesse portais como dados.gov.br, escolha um conjunto de dados de interesse (educação, meio ambiente, agricultura etc.) e aplique regressão linear para responder a uma pergunta prática. Crie gráficos, interprete os coeficientes e compartilhe os resultados com colegas ou em sala de aula. •Faça um projeto orientado: Comece pequeno. Escolha um problema claro, como prever o consumo de energia com base na temperatura. Baixe os dados, limpe-os, visualize, modele, teste e apresente, cada passo pode ser acompanhado com orientação, quase como “pegar pela mão”. •Colete dados locais: Uma abordagem simples e engajadora é levantar dados da própria comunidade ou escola. Por exemplo, medir a temperatura média e o consumo de energia em diferentes dias, ou a quantidade de chuva e o número de visitantes em um parque. Em seguida, aplique os conceitos de regressão para descobrir se há relação entre as variáveis. Esses passos podem não apenas reforçar seu entendimento, mas também gerar insights úteis para a comunidade, conectar teoria com realidade e abrir caminhos para projetos mais avançados no futuro. Fechamos aqui nossa seção sobre Regressão Linear! Ficou curioso(a)? Então continue a explorar. A regressão linear é apenas uma peça em um mosaico de técnicas de análise de dados. Não se esqueça de que sua aplicação prática depende de dados de qualidade, conhecimento do problema e reflexão ética ao lidar com os resultados. Em breve você descobrirá novas técnicas que se unem a este conhecimento para formar uma base sólida em Machine Learning. Boas descobertas e até a próxima! 1.4 Vetorização Iniciando o diálogo... Ao começar seus estudos em Machine Learning, você logo percebe que os algoritmos realizam muitas operações matemáticas ao mesmo tempo. Imagine, por exemplo, que você tem 100 mil pontos de dados e deseja calcular a soma de todos eles. Se formos somar cada valor um a um, isso seria extremamente demorado. Mas se utilizarmos a vetorização, é como se fizéssemos essa soma “toda de uma vez”, aproveitando a força do hardware para processar várias operações em paralelo. 1.4.1 O que é Vetorização? Vetorização é a prática de substituir estruturas de laços de repetição na programação (por exemplo, for ou while) por operações em blocos completos de dados. Em vez de processar cada elemento de um vetor ou matriz passo a passo, você executa uma instrução que manipula todo o conjunto de dados de uma só vez. 31
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Copie e Teste! # Forma não vetorizada vetor = [1, 2, 3, 4, 5] soma = 0 for iin range(len(vetor)): soma += vetor[i] print("Soma (não vetorizada):", soma) Copie e Teste! # Forma vetorizada import numpy as np vetor = np.array([1, 2, 3, 4, 5]) soma = np.sum(vetor) print("Soma (vetorizada):", soma) No segundo caso acima, a soma de todos os elementos ocorre internamente de maneira otimizada, sem que você precise escrever um laço manualmente. 1.4.2 Por que eliminar laços de repetição? Figura 1.10: Imagens criadas com o DALL-E, representando de um único “core” trabalhando em sequência, e de vários pintores trabalhando em paralelo, ilustrando o conceito de paralelismo com eficiência e divisão de tarefas. A vetorização costuma ser muito mais rápida que o uso de laços (for,while) tradicionais. Isso acontece porque bibliotecas como o NumPy em Python são escritas em linguagens de baixo nível (como C ou C++), que conseguem usar instruções vetoriais do processador. Estas 32
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA instruções permitem que várias operações sejam feitas em paralelo, aproveitando ao máximo os núcleos (cores) do processador e a GPU (Unidade de Processamento Gráfico), que é muito boa para lidar com grandes volumes de dados de uma vez. •O que é core? Um core é como um “trabalhador” dentro do processador. Os processadores modernos têm vários cores (dual-core = 2, quad-core = 4, etc.). Se você tem tarefas independentes, cada core pode trabalhar em paralelo, acelerando o processo. •E a GPU? A GPU (Graphics Processing Unit) é uma unidade especializada em realizar milhares de operações simples ao mesmo tempo. Inicialmente usada para gráficos (por exemplo, em jogos), hoje ela também é usada em ciência de dados, IA e processamento de matrizes, por ser absurdamente boa nisso. Uma analogia que podemos pensar é numa linha de produção, Imagine que você precisa pintar 1000 carrinhos de brinquedo, comparando as abordagens: •Laço de repetição: 1 pintor pinta os 1000 carrinhos um por um. •Vetorização: 100 pintores pintam 10 carrinhos cada ao mesmo tempo, ou seja, mais trabalhadores (cores / GPU) é igual a menos tempo. Legibilidade do código Códigos com muitos laços tendem a ficar grandes, difíceis de entender e manter. Vetorização deixa o código mais direto. Código com laço aninhado (um for dentro de for, dentro de outro for) # Multiplicando duas matrizes manualmente A = [[1, 2], [3, 4]] B = [[5, 6], [7, 8]] resultado = [[0, 0], [0, 0]] for iin range(2): for jin range(2): for kin range(2): # <- terceiro nível de loop! resultado[i][j] += A[i][k] * B[k][j] Código vetorizado com NumPy import numpy as np A = np.array([[1, 2], [3, 4]]) B = np.array([[5, 6], [7, 8]]) resultado = np.dot(A, B) Fique Alerta! O que é laço aninhado? É um laço dentro de outro. Cada nível de aninhamento aumenta a complexidade. Isso é comum em manipulações de matrizes ou listas multidimensionais. 33
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Menos erros Quando usamos laços, é comum errar no índice, especialmente com o famoso erro offby-one (erro de 1 unidade a mais ou a menos). Exemplo de erro off-by-one vetor = [10, 20, 30, 40, 50] # ERRO: começa em 1 e vai até len(vetor) = 5 -> índice 5 não existe! for iin range(1, len(vetor)+1): print(vetor[i]) # IndexError! Qual seria o “certo” vetor = [10, 20, 30, 40, 50] for iin range(len(vetor)): print(vetor[i]) # Tudo certo aqui Fique Alerta! Usando vetorização, você evita esse tipo de erro porque não precisa mexer diretamente com índices, olhe abaixo! import numpy as np vetor = np.array([10, 20, 30, 40, 50]) print(vetor) # imprime tudo, simples assim 1.4.3 Onde a vetorização aparece no dia a dia do Machine Learning? A vetorização é fundamental em tarefas de aprendizado de máquina, especialmente quando lidamos com grandes volumes de dados e modelos com muitos parâmetros, como: Cálculo de Funções de Custo Ao treinar um modelo de regressão linear, por exemplo, trabalhamos com milhares (ou até milhões) de amostras. Em vez de calcular a previsão h(x) para cada exemplo individualmente usando um laço, podemos fazer isso de uma só vez com uma multiplicação de matrizes. Fique Alerta! Isso permite calcular todas as previsões em uma única operação vetorizada, muito mais eficiente e rápida. Atualização de Parâmetros com Gradient Descent Em algoritmos de otimização como o gradiente descendente, os pesos do modelo (parâmetros θ) são atualizados com base no erro da previsão. Essa atualização pode ser escrita de forma vetorizada, o que elimina a necessidade de laços para cada parâmetro. Ou seja, em vez de atualizar cada peso individualmente com for, usamos uma expressão como theta = theta - alpha * grad, onde grad é o gradiente vetorizado. 34
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Propagação em Redes Neurais Cada camada de uma rede neural aplica operações matemáticas, principalmente multiplicações de matrizes seguidas de funções de ativação. Como essas redes frequentemente têm milhares ou milhões de parâmetros, usar laços aninhados para computar as ativações seria inviável. Com vetorização, a saída de uma camada inteira é calculada de uma só vez, tornando o treinamento e a inferência muito mais rápidos. 1.4.4 Vetorização na Prática A vetorização vai muito além de “remover laços”; ela é uma estratégia essencial para escrever código mais limpo, rápido e eficiente, especialmente em aplicações de Machine Learning. Praticamente todas as etapas do aprendizado de máquina se beneficiam disso: desde o cálculo de funções de custo, passando pela atualização de pesos com gradient descent, até as operações entre camadas em redes neurais. Essa abordagem elimina laços explícitos, reduz a chance de erros e permite que cálculos sejam distribuídos de forma paralela por múltiplos núcleos da CPU e até pela GPU graças às bibliotecas otimizadas como o NumPy, que usam instruções de baixo nível (como SSE e AVX) para acelerar tudo. O resultado é um código mais curto, mais legível e muito mais rápido. Copie e Teste! import numpy as np import time # Criando um vetor com 10 milhões de elementos a = np.random.rand(10_000_000) b = np.random.rand(10_000_000) # Forma com for start = time.time() resultado = np.zeros_like(a) for iin range(len(a)): resultado[i] = a[i] + b[i] print("Tempo com for:", time.time() - start) # Forma vetorizada start = time.time() resultado = a + b print("Tempo vetorizado:", time.time() - start) Resultado Esperado Tempo com for: 4.461456298828125 Tempo vetorizado: 0.019437074661254883 Mesmo em máquinas comuns, o ganho pode ser de 10x ou mais. Dominar a vetorização não só torna seu código mais robusto, como também melhora sua compreensão prática de álgebra linear e potencializa sua capacidade de construir soluções escaláveis em Machine Learning. 35
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Mas usar loops não é mais simples às vezes? Em alguns casos muito específicos, um laço simples pode até parecer intuitivo. Porém, quando os dados crescem, mesmo um simples for se torna um gargalo significativo de desempenho. Além disso, escrever C=A+Bpara somar vetores normalmente é mais legível do que laços extensos. Vetorização resolve tudo na programação? Não. Vetorização é muito útil para operações matemáticas bem estruturadas (somas, multiplicações, funções de ativação em redes neurais, etc.). Entretanto, em tarefas lógicas muito específicas (como if/else encadeados ou fluxos complexos de dados), nem sempre é possível eliminar completamente todos os loops. O segredo é encontrar onde a vetorização faz sentido. 1.4.5 Como a vetorização afeta meu dia a dia como estudante de Machine Learning? Quando você for implementar regressão linear para aprender a programar o gradiente descendente, por exemplo, a vetorização permitirá que você aplique as fórmulas de erro, gradiente e atualização de parâmetros de modo muito mais rápido. Em projetos maiores, como redes neurais, as bibliotecas (TensorFlow, PyTorch etc.) fazem a maior parte da vetorização automaticamente. Mas entender o conceito ajuda a escrever código mais limpo e explorar certos truques de otimização. Fique Alerta! Ao aplicar vetorização, utilizamos melhor os recursos do hardware, como CPUs e GPUs, o que resulta em ganhos significativos de desempenho. No entanto, é essencial ter atenção às dimensões das matrizes, erros de shape são comuns, especialmente para quem está começando. Como o código vetorizado tende a ser mais compacto, depurar pode ser desafiador; por isso, é uma boa prática inspecionar os shapes com A.shape e visualizar pequenos trechos dos dados, como A[:10], para entender o que está acontecendo. Dominar a vetorização não apenas melhorará seu entendimento prático de álgebra linear aplicada ao ML, mas também ampliará sua capacidade de criar soluções mais eficientes e escaláveis. A vetorização sendo um dos pilares da computação científica moderna, é essencial em Machine Learning. Sempre que você vir uma repetição que processa elementos um a um, investigue se é possível trocar por uma forma vetorizada. Quanto maior o volume de dados, maior será o ganho. Agora que você já sabe o que é e por que faz diferença, fica muito mais fácil reconhecer onde aplicar essa técnica no seu dia a dia de estudos e projetos de aprendizado de máquina! Conhecendo um pouco mais! A documentação oficial do NumPy é uma excelente fonte para explorar mais sobre vetorização, operações com arrays, funções matemáticas e muito mais. Lá temos exemplos práticos, explicações detalhadas e guias úteis para todos os níveis do iniciante ao avançado, veja em https://numpy.org/doc/ 36
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA 1.5 Engenharia de características Iniciando o diálogo... Você já se perguntou por que certos modelos de Inteligência Artificial conseguem ser mais precisos do que outros, mesmo usando algoritmos parecidos? Um dos segredos está na etapa de Engenharia de Características, também chamada de Feature Engineering. É nessa fase que transformamos dados brutos em atributos (características) mais relevantes para o modelo, ampliando suas chances de sucesso. 1.5.1 O que é Engenharia de Características? A Engenharia de Características é o processo de selecionar, criar e transformar dados em variáveis (ou características) que melhor representem o fenômeno que se deseja modelar. Imagine que você tem uma tabela com informações sobre clima, produtividade agrícola ou comportamento de consumidores. Nem sempre os dados vêm “prontos” para serem usados em algoritmos de Machine Learning. Muitas vezes, precisamos: • Limpar os dados e ajustar outliers (pontos “fora da curva”), valores ausentes, etc.; • Criar colunas a partir das já existentes (por exemplo, calcular a “taxa de crescimento” ou a “variação” entre períodos); • Reformatar variáveis categóricas (como nomes de cidades) em códigos numéricos. • Normalizar ou padronizar valores, para que fiquem em escalas comparáveis. A engenharia de características é uma etapa essencial dentro do fluxo de Ciência de Dados, ela faz o “meio de campo” entre a coleta dos dados (seja de fontes brutas ou bases prontas) e a construção de modelos de Machine Learning. É nesse ponto que os dados são transformados, combinados e representados de forma que os algoritmos possam aprender com eles de maneira mais eficaz. Sem uma boa engenharia de características, mesmo os melhores modelos não performam bem. Fique Alerta! A qualidade das características costuma ser até mais importante do que o algoritmo em si. Um bom conjunto de atributos pode fazer toda a diferença no desempenho final de um modelo preditivo. 1.5.2 Principais Técnicas de Engenharia de Características Transformação de Variáveis Categóricas Em problemas de aprendizado de máquina, é comum lidarmos com variáveis categóricas, ou seja, informações que representam categorias em vez de números, como ”cidade”, ”tipo de solo”, ”cultura agrícola”, entre outros. No entanto, a maioria dos algoritmos de machine learning exige que os dados estejam em formato numérico. Por isso, é necessário transformar essas categorias em números de forma que preserve seu significado, mas sem induzir o modelo ao erro. 37
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA One-Hot Encoding: Codificação Binária por Colunas Essa técnica cria uma coluna para cada categoria existente. O valor será 1 se aquela categoria estiver presente na observação, e 0 caso contrário. Suponha que temos a variável ”cidade”, com os seguintes valores: cidade Manaus Tefé Coari Após aplicar One-Hot Encoding, o conjunto será: cidade_Manaus cidade_Tefé cidade_Coari 1 0 0 0 1 0 0 0 1 Essa abordagem é bastante segura, pois não introduz relações artificiais entre as categorias. Label Encoding: Codificação por Rótulos Neste método, cada categoria é substituída por um número inteiro. É uma técnica simples, mas deve ser usada com cuidado. Suponha as cidades de Manaus, Tefé, Coari, Lábrea, São Gabriel da Cachoeira e Manacapuru, com Label Encoding poderia ser representado assim: cidade cidade_encoded Manaus 1 Tefé 2 Coari 3 Lábrea 4 São Gabriel da Cachoeira 5 Manacapuru 6 Apesar de parecer eficiente, essa representação pode induzir o modelo a interpretar que existe uma ordem entre as cidades como se “Coari” fosse maior ou mais importante que “Tefé” ou “Manaus”. Em muitos contextos, essa suposição não faz sentido e pode comprometer a performance do modelo. Sobre a escolha entre One-Hot e Label Encoding depende do tipo de dado e do algoritmo que será utilizado. Para variáveis categóricas sem relação de ordem, o One-Hot Encoding é geralmente mais seguro. Já o Label Encoding pode ser útil com algoritmos baseados em árvores (Tree-based models), desde que as relações implícitas não causem viés. Criação de Variáveis Sintéticas Além de interpretar o dado como ele vem, é comum criarmos atributos que resumem relações importantes. Por exemplo, a densidade de focos de calor em determinada área, que seria o número de focos dividido pela área total. Ou, no contexto agrícola, a variação de temperatura ao longo de um mês. Essas variáveis “sintéticas” (ou “derivadas”) frequentemente ajudam o modelo a encontrar padrões que não estavam claros nos dados originais. 38
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Normalização e Padronização: Equações Matemáticas Em muitos cenários, as variáveis do nosso conjunto de dados apresentam escalas muito distintas (por exemplo, “pluviosidade” em milímetros e “renda per capita” em reais). Isso pode dificultar o trabalho de algoritmos baseados em distâncias ou que são sensíveis a magnitudes diferentes. Para contornar esse problema, aplicamos algumas transformações de escala, como normalização ou padronização. Min-Max Normalization A normalização Min-Max (ou feature scaling) reescala os valores para ficarem dentro de um intervalo, comumente entre 0 e 1. A equação padrão é: Xmin-max =X−Xmin Xmax −Xmin Onde: •Xé o valor original de uma determinada observação; •Xmin eXmax são o valor mínimo e máximo dessa variável no conjunto de dados; • O resultado Xmin-max fica compreendido entre 0 e 1. Mean Normalization (Normalização pela Média) Uma variação menos comum, mas ainda utilizada, é a mean normalization, em que subtraímos a média da coluna e dividimos pela amplitude (Xmax −Xmin): Xmean-norm =X−¯ X Xmax −Xmin Onde ¯ Xé a média de todos os valores da variável. Dessa forma, deslocamos o valor para que a média da série fique em 0 e a amplitude final fique em torno de 1. Z-Score Standardization (Padronização) A padronização Z-Score reescala os dados para terem média igual a 0 e desvio-padrão igual a 1. A equação que demonstra isso é: Xz-score =X−µ σ Onde: •µé a média da variável; •σé o desvio-padrão da variável. 1.5.3 Por que padronizar os Dados? Quando trabalhamos com variáveis numéricas muito diferentes entre si, por exemplo, “chuva (mm)” variando entre 0 e 300, e “temperatura (°C)” entre 15 e 35, essas diferenças de escala podem afetar negativamente o desempenho de muitos algoritmos de aprendizado de máquina. A padronização resolve esse problema ao transformar os dados para que tenham média zero e desvio padrão igual a um. Isso faz com que todas as variáveis passem a ter peso semelhante, evitando que uma variável com valores maiores domine a análise. 39
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Copie e Teste! import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import MinMaxScaler, StandardScaler # Dados originais X = np.array([[10], [20], [30], [40], [50]]) # Min-Max Normalization scaler_minmax = MinMaxScaler() X_minmax = scaler_minmax.fit_transform(X) # Mean Normalization (manual) X_mean = X.mean() X_min = X.min() X_max = X.max() X_meannorm = (X - X_mean) / (X_max - X_min) # Z-Score Standardization scaler_zscore = StandardScaler() X_zscore = scaler_zscore.fit_transform(X) # Plotando os resultados plt.figure(figsize=(10, 6)) plt.plot(X, np.zeros_like(X), 'o', label='Original', markersize =10) plt.plot(X, X_minmax, 'o-', label='Min-Max [0, 1]') plt.plot(X, X_meannorm, 's--', label='Mean Normalization') plt.plot(X, X_zscore, 'd-.', label='Z-Score') plt.title('Comparação de Técnicas de Normalização/Padronização') plt.xlabel('Valor Original') plt.ylabel('Valor Transformado') plt.grid(True) plt.legend() plt.tight_layout() plt.show() Resultado Esperado Valores Originais Min-Max Mean Norm Z-Score 10 0.00 -0.50 -1.41 15 0.25 -0.25 -0.71 20 0.50 0.00 0.00 25 0.75 0.25 0.71 30 1.00 0.50 1.41 40
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA • Padronização (Z-score): transformação das variáveis temperatura e umidade para que tenham média 0 e desvio padrão 1, o que é útil em modelos que dependem de distância ou gradientes. A Engenharia de Características é fundamental para elevar o desempenho de modelos de Machine Learning, pois fornece uma visão mais rica dos dados. Em muitos casos, gastar tempo aprimorando e criando atributos relevantes traz melhorias maiores do que simplesmente trocar de algoritmo. Fique Alerta! Embora seja tentador criar dezenas de colunas, tome cuidado para não gerar “ruído” ou superdimensionar o problema (o que pode levar à “maldição da dimensionalidade”). Use métricas de validação para verificar se os atributos criados estão, de fato, melhorando seu modelo. 1.5.7 Aplicando seus conhecimentos 1. Você possui uma coluna que indica o tipo de solo de uma plantação. Transforme essas categorias usando Label Encoding. Qual seria o risco de o modelo interpretar o valor 3 como “maior” que o 1? Como resolver isso usando One-Hot Encoding? Copie e Teste! import pandas as pd # Dataset de exemplo dados = pd.DataFrame({ "Área": ["A1","A2","A3","A4","A5"], "Solo": ["argiloso","arenoso","argiloso","siltoso"," arenoso"] }) # Dicionário para codificação mapeamento_solo = { "argiloso": 1, "arenoso": 2, "siltoso": 3 } # Aplicar label encoding dados["Solo_Encoded"] = dados["Solo"].map(mapeamento_solo) print(dados) 2. Considere um pequeno dataset com dados hipotéticos de clima e temperatura média. O que acontece se os dados tiverem valores extremos (ex.: uma semana com 100 mm de chuva)? Qual técnica parece menos sensível a essas variações? Se você fosse usar esse dataset para prever o crescimento de uma planta, por que normalizar ajudaria? 47
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Copie e Teste! import pandas as pd import numpy as np # Novo dataset df = pd.DataFrame({ "ChuvaSemanal": [10, 25, 40, 35, 20], "TemperaturaMedia": [24.5, 27.0, 29.5, 28.0, 26.0] }) # Min-Max Normalization min_max = (df - df.min()) / (df.max() - df.min()) # Mean Normalization mean_norm = (df - df.mean()) / (df.max() - df.min()) # Z-Score Standardization z_score = (df - df.mean()) / df.std() # Exibir resultados print("=== Dados Originais ===\n", df) print("\n=== Min-Max Normalization ===\n", min_max) print("\n=== Mean Normalization ===\n", mean_norm) print("\n=== Z-Score Standardization ===\n", z_score) 1.6 Taxa de aprendizagem Iniciando o diálogo... Imagine que você está em uma trilha na Floresta Amazônica e precisa seguir um mapa até chegar ao seu destino. Se caminhar rápido demais, pode se perder; se caminhar muito devagar, pode demorar muito para chegar. A taxa de aprendizado (ou learning rate, geralmente representada pela letra grega α) tem um papel semelhante em modelos de Machine Learning que usam métodos de otimização, como o gradient descent. Ela controla o “passo” dado na busca pela minimização do erro. 1.6.1 Conceituando a Taxa de Aprendizado No contexto de algoritmos de Machine Learning que utilizam métodos de gradiente (gradient-based methods), a taxa de aprendizado (α) diz respeito a quanto ajustamos os parâmetros do modelo a cada iteração de treinamento. Em termos mais práticos: •αpequeno: O “passo” de ajuste dos parâmetros é curto. O aprendizado avança devagar, mas em geral tende a ser mais estável (com menor risco de “pular” o ótimo); •αgrande: O “passo” de ajuste é maior. O aprendizado pode convergir rapidamente, mas corre o risco de ultrapassar o mínimo e “oscilar”, sem chegar a uma convergência adequada. 48
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Em uma linguagem mais simples, é como decidir quão rápido você vai ajustar suas respostas em um teste de múltipla escolha com tempo limitado. Ajustes pequenos (cautelosos) podem garantir mais precisão, porém podem requerer muitas tentativas; ajustes grandes podem levá-lo rapidamente a uma resposta, mas o risco de erro é maior. 1.6.2 Por que a Taxa de Aprendizado é Importante? Encontrar o valor de αque seja “equilibrado” para o seu problema. Se αfor muito pequena, o treino poderá levar muitas iterações e, dependendo do contexto, até tornar o processo inviável. Se for muito grande, o modelo pode não convergir, ou seja, não “aprende” de fato, pois fica “saltando” em torno do mínimo. Conhecendo um pouco mais! A taxa de aprendizado costuma ser ajustada de forma empírica ou por meio de técnicas como grid search erandom search. Em alguns modelos avançados, a taxa de aprendizado varia durante o treinamento (ex.: learning rate decay,adaptive methods). Em cenários como previsão de chuvas na região amazônica, acertar a taxa de aprendizado significa conseguir um modelo estável, que faça previsões climáticas sem consumir recursos computacionais em excesso ou subaproveitar dados. 1.6.3 Visão Matemática Simplificada Considere um modelo com parâmetros θ(por exemplo, coeficientes de uma reta, pesos de uma rede neural etc.). Temos uma função de custo J(θ)que mede o quanto o modelo está errando. O procedimento de descida de gradiente (gradient descent) atualiza cada parâmetro θjassim: θj:= θj−α·∂ ∂θj J(θ) Onde: •αé a taxa de aprendizado; •∂ ∂θjJ(θ)é o gradiente (a “inclinação”) da função de custo em relação ao parâmetro θj. No início, podemos imaginar θcomo uma posição qualquer na “trilha” (superfície de erro). A cada passo do gradiente, ajustamos θna direção que faz J(θ)diminuir, mas o quanto mexemos depende diretamente de α. 1.6.4 Escolhendo o Tamanho do Passo Suponha que uma cooperativa de produtores de açaí no interior do Amazonas deseje prever quanto colher em cada safra, considerando fatores como quantidade de chuva, temperatura e histórico de vendas. Eles estão treinando um modelo de regressão simples: ˆy=θ0+θ1x1+θ2x2+. . . Onde: •ˆyrepresenta a produtividade estimada; 49
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA •θisão os parâmetros a serem aprendidos; •xisão as variáveis (chuva, temperatura, entre outras). Se a taxa de aprendizado for muito grande, o algoritmo pode saltar de uma previsão de safra para outra, nunca “afinando” a estimativa corretamente. Se a taxa for muito pequena, o modelo levará um tempo enorme para chegar em resultados úteis e, no ritmo de uma safra, isso pode ser tarde demais para o planejamento. 1.6.5 Ajustando na Prática Normalmente, começamos com um valor αem torno de 0,01 ou 0,001 (dependendo da escala dos dados) e observamos se o erro (função de custo) diminui suavemente. Podemos monitorar o erro ao longo das iterações, em alguns cenários estabelecer um número máximo de iterações ou um critério de convergência, como ∆J(θ)menor que um valor mínimo. • Se o erro diminui, mas de forma muito lenta, αpode estar pequena demais. • Se o erro oscila ou aumenta, αpode estar grande demais. Figura 1.13: Comparação do comportamento da função de custo com diferentes taxas de aprendizado. Conhecendo um pouco mais! Ferramentas como TensorFlow, PyTorch ou bibliotecas como scikit-learn facilitam o ajuste do learning rate. Em tutoriais avançados, são comuns estratégias de learning rate scheduling que reduzem a taxa de aprendizado à medida que o erro converge. 1.6.6 Devo escolher sempre? A escolha de uma boa taxa de aprendizado não é apenas uma questão de “otimizar o código”, também é fundamental ter previsões seguras e rápidas, sejam em quaisquer áreas. Ajustar adequadamente a taxa de aprendizado permite menor gasto computacional, evitando milhões de iterações desnecessárias, como ocorre quando αé minúscula, assim reduz tempo e consumo de energia. 50
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Fique Alerta! Lembre-se de que nenhum modelo é isolado; cada escolha de αenvolve contexto. Se os dados do seu problema forem muito grandes ou muito variáveis (como dados de monitoramento de chuva, umidade e temperatura em diferentes regiões do Amazonas), poderá ser necessário um ajuste dinâmico ou algoritmos de otimização mais avançados (como Adam, RMSProp, etc.). A taxa de aprendizado é um dos hiperparâmetros mais importantes em algoritmos de Machine Learning baseados em gradiente. Apesar de parecer “apenas um número”, determina, em muitos casos, se o seu modelo chegará a uma solução aceitável ou se ficará “preso” em tentativas frustradas. Em termos práticos, mantenha sempre um olhar investigativo e faça experimentos gradativos com diferentes valores de α. Monitore a função de custo e avalie o equilíbrio entre velocidade e estabilidade de convergência. Nesse processo, lembre-se de considerar o contexto, dados e recursos computacionais podem ser limitados ou distribuídos em localidades com pouca infraestrutura, o que torna o ajuste adequado da taxa de aprendizado ainda mais determinante para o sucesso do projeto. 1.6.7 Aplicando seus conhecimentos Neste exercício, você vai simular um pequeno projeto de regressão linear usando dados fictícios. A proposta é compreender, de forma prática, como a taxa de aprendizado (α) influencia o comportamento do algoritmo de gradiente descendente. Etapas 1. Crie ou baixe um conjunto simples de dados: Neste exemplo: número de milímetros de chuva por semana (variável X) e quantidade de produção de açaí em kg (variável Y). Um total de 10 a 20 amostras já é suficiente para este experimento. 2. Implemente um modelo de regressão linear: Use uma implementação manual (com gradiente descendente), como já vimos anteriormente, e insira diferentes valores de taxa de aprendizado (α), como: α= 0.1,α= 0.01,α= 0.0001. 3. Monitore o número de iterações necessárias para convergir: Observe se o custo diminui de forma estável ou se há oscilações nos valores. Anote o número de épocas (iterações) necessárias até o custo se estabilizar. Para cada valor de αtestado, plote a curva do custo (erro) em função do número de iterações. Isso vai te permitir visualizar claramente o impacto da taxa de aprendizado: • Um valor alto de αpode fazer o custo oscilar ou até divergir. • Um valor muito pequeno faz a curva descer lentamente, tornando o treinamento mais demorado. • Um valor adequado mostra uma descida suave e consistente até a convergência. Compare os gráficos lado a lado para entender visualmente os efeitos. Essa análise ajuda a desenvolver intuição sobre o processo de otimização. 51
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Copie e Teste! import numpy as np import matplotlib.pyplot as plt # Dados fictícios: Chuva (mm) vs Produção de Açaí (kg) X = np.array([120, 80, 150, 90, 110], dtype=float) Y = np.array([55, 32, 63, 40, 52], dtype=float) # Normaliza os dados para melhorar o desempenho do gradiente descendente X_norm = (X - X.mean()) / X.std() # Parâmetros alphas = [0.1, 0.01, 0.0001] epochs = 100 m=len(X) # Função de custo def compute_cost(theta0, theta1, X, Y): predictions = theta0 + theta1 * X return ((predictions - Y) ** 2).mean() / 2 # Gradiente descendente def gradient_descent(X, Y, alpha, epochs): theta0, theta1 = 0.0, 0.0 costs = [] for _in range(epochs): predictions = theta0 + theta1 * X errors = predictions - Y grad0 = errors.mean() grad1 = (errors * X).mean() theta0 -= alpha * grad0 theta1 -= alpha * grad1 costs.append(compute_cost(theta0, theta1, X, Y)) return theta0, theta1, costs # Plot das curvas de custo plt.figure(figsize=(10, 5)) for alpha in alphas: theta0, theta1, costs = gradient_descent(X_norm, Y, alpha, epochs) plt.plot(range(epochs), costs, label=f'α= {alpha}') plt.title('Curva de Custo por Época') plt.xlabel('Iterações') plt.ylabel('Custo') plt.legend() plt.grid(True) plt.tight_layout() 52
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA plt.show() # Visualização das retas de regressão ajustadas x_range = np.linspace(X_norm.min(), X_norm.max(), 100) plt.figure(figsize=(10, 5)) for alpha in alphas: theta0, theta1, _ = gradient_descent(X_norm, Y, alpha, epochs) y_pred = theta0 + theta1 * x_range plt.plot(x_range, y_pred, label=f'α= {alpha}') # Dados reais (normalizados) plt.scatter(X_norm, Y, color='black', label='Dados reais') plt.title('Retas de Regressão com Diferentes α') plt.xlabel('Chuva (normalizada)') plt.ylabel('Produção de Açaí (kg)') plt.legend() plt.grid(True) plt.tight_layout() plt.show() Figura 1.14: Comparação da convergência da função de custo para diferentes taxas de aprendizado (α). Figura 1.15: Comparação das retas de regressão ajustadas com diferentes taxas de aprendizado (α). 53
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Agora responda... 1. Qual foi o comportamento da curva de custo para cada valor de α(0.1, 0.01 e 0.0001)? 2. Qual valor de αconvergiu mais rapidamente? Houve algum valor que causou instabilidade ou oscilação? Por quê? 3. O que aconteceu com o valor de αmuito pequeno? E o muito grande? 4. As retas finais de regressão ficaram muito diferentes entre si? Por quê, mesmo com taxas de aprendizado distintas? 5. Experimente e verifique caso aumentarmos o número de épocas para α= 0.0001, você acha que a reta final seria similar às outras? Justifique. 1.7 Avaliação do modelo de regressão Iniciando o diálogo... Você já se perguntou como avaliar se um modelo de regressão que prevê valores numéricos, como temperatura, quantidade de chuva ou até mesmo vendas de uma loja está de fato desempenhando bem? Nesta seção, vamos conhecer duas métricas importantes para medir a qualidade das previsões de um modelo de regressão: o RMSE (Root Mean Squared Error) eoR²(Coeficiente de Determinação). 1.7.1 Por que avaliar um modelo de regressão? Construímos modelos para prever valores numéricos com base em diversas variáveis (também chamadas de features ou atributos). Por exemplo, podemos prever: • A precipitação média em uma região da Amazônia no próximo mês, dada a quantidade de chuva nos meses anteriores; • O volume de vendas de uma cooperativa local, com base em dados de estoque e procura; • A temperatura média diária, considerando medições históricas. Contudo, nem sempre um modelo está “bom” apenas porque parece plausível. Precisamos de medidas que nos mostrem, numericamente, se as previsões estão próximas dos valores reais. É aí que entram as métricas de avaliação, como o RMSE e o R². 1.7.2 Erro Médio Quadrático (MSE) e Raiz do Erro Médio Quadrático (RMSE) Para entender o RMSE, vamos primeiro conhecer o Erro Médio Quadrático (MSE – Mean Squared Error), que é definido da seguinte forma: MSE =1 n n X i=1 (yi−ˆyi)2 onde: 54
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA •yié o valor real (observado). •ˆ yié o valor previsto pelo modelo. •né a quantidade total de observações (amostras). O RMSE (Root Mean Squared Error) nada mais é do que a raiz quadrada desse valor: RMSE =√MSE =v u u t 1 n n X i=1 (yi−ˆyi)2 O que significa o RMSE? Se o RMSE for zero, o modelo prevê exatamente o valor real para todas as amostras. Quanto menor o RMSE, mais próximo o modelo tende a estar dos valores reais. A interpretação numérica do RMSE é intuitiva: se você obtém RMSE = 2, significa que, em média, seu modelo “erra” cerca de 2 unidades em suas previsões (dependendo de qual grandeza se está medindo). Fique Alerta! Se as unidades reais forem, por exemplo, em milímetros de chuva, o RMSE também será expresso em milímetros. É importante verificar se esse valor faz sentido no contexto do problema. Um RMSE de 2 mm de chuva pode ser excelente se estivermos falando de um total de 10 mm, mas pode ser irrelevante se a média de chuva for 300 mm. 1.7.3 Coeficiente de Determinação (R²) Enquanto o RMSE mede quão distantes estão as previsões do modelo em relação aos valores observados, o R² (R quadrado) avalia quão bem o modelo explica a variação dos dados. A fórmula resumida do R² é: R2= 1 −Pn i=1(yi−ˆyi)2 Pn i=1(yi−¯y)2 onde: •Pn i=1(yi−ˆyi)2é a soma dos erros quadráticos (igual à parte de cima do MSE). •Pn i=1(yi−¯y)2é a soma dos quadrados da diferença entre cada valor real e a média ¯y. Como interpretar o R²? Em termos simples, o R² indica qual fração da variação total dos dados está sendo “capturada” pelo modelo. •R² próximo de 1: o modelo explica muito bem a variação dos dados. •R² próximo de 0: o modelo não explica praticamente nada; é quase como fazer previsões aleatórias. •R² negativo: pode acontecer em situações em que o modelo está prevendo pior do que uma simples média dos valores. 55
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Caso Prático Estimativa de Precipitação Vamos imaginar um cenário em que desejamos prever a precipitação (em milímetros) em uma região da Amazônia, utilizando informações como umidade e temperatura dos últimos dias. A seguir, temos um exemplo com valores reais observados e valores preditos por um modelo de regressão. Vamos calcular duas métricas importantes para avaliação: o RMSE (erro quadrático médio da raiz) e o R² (coeficiente de determinação). Copie e Teste! import numpy as np from sklearn.metrics import mean_squared_error, r2_score # Valores reais de precipitação (em mm) y_real = np.array([12, 10, 25, 18, 30, 28]) # Valores previstos pelo modelo y_pred = np.array([14, 9, 20, 16, 31, 27]) # Cálculo do MSE e RMSE mse = mean_squared_error(y_real, y_pred) rmse = np.sqrt(mse) # Cálculo do coeficiente de determinação (R²) r2 = r2_score(y_real, y_pred) # Impressão dos resultados print("Valores reais de precipitação:", y_real) print("Valores previstos pelo modelo:", y_pred) print(f"MSE = {mse:.2f}") print(f"RMSE = {rmse:.2f}") print(f"R² = {r2:.2f}") Resultado Esperado Valores reais de precipitação: [12 10 25 18 30 28] Valores previstos pelo modelo: [14 9 20 16 31 27] MSE = 6.00 RMSE = 2.45 R² = 0.90 ORMSE indica o desvio médio das previsões em relação aos valores reais, se o RMSE for 2.45, por exemplo, significa que o modelo erra, em média, 2.45 mm de precipitação por previsão. R² mede o quanto da variação dos dados reais é explicada pelo modelo. Neste caso, um valor próximo de 1 indica que o modelo explica bem os dados; um valor próximo de 0 indica baixo poder explicativo. 56
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Figura 1.17: Função Sigmoide. Para entender isso de forma intuitiva, pense que zfaz uma soma ponderada das características (dados de entrada). Se essa soma for grande e positiva, a função sigmoide tende a valores próximos de 1 (interpretamos como “alta probabilidade de classe 1”). Se a soma for muito negativa, a sigmoide se aproxima de 0 (probabilidade de classe 0). Por exemplo, considere um modelo simples para predizer a probabilidade de desmatamento em uma determinada área: z=w0+w1×(Área de floresta) + w2×(Distância de rodovias) Se a área de floresta for muito grande (e o peso w1for positivo), ztende a aumentar, indicando maior probabilidade de desmatamento. Se a distância de rodovias for muito pequena (e w2for negativo), significa que quanto mais próximo de rodovias, maior chance de desmatamento, logo ztambém tende a subir nesse caso, apontando para classe 1. É claro que a importância de cada variável depende dos pesos aprendidos automaticamente pelo modelo durante o processo de treinamento. 1.9.3 Função de Custo (Cost Function) Para medir o desempenho do modelo, utilizamos a Função de Custo de Regressão Logística, também conhecida como Loss Function baseada em “cross-entropy”. Em vez de medir erros quadráticos (como na regressão linear), a regressão logística utiliza a seguinte forma: J(w) = −1 m m X i=1 [y(i)log(hw(x(i))) + (1 −y(i))log(1 −hw(x(i)))] onde: •mé o número de exemplos de treinamento. •y(i)é o valor real da classe do i-ésimo exemplo (0 ou 1). •hw(x(i))é a probabilidade prevista para a classe 1. 63
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Essa função de custo penaliza fortemente quando o modelo tem alta certeza (probabilidade próxima de 1 ou 0) mas erra a classe. É isso que faz a regressão logística ser robusta para classificação binária. 1.9.4 Otimização por Gradiente Para encontrar os melhores pesos w= (w1, w2, . . . , wn), utiliza-se geralmente o Gradiente Descendente (Gradient Descent). A ideia básica é: 1. Iniciar os pesos com valores aleatórios ou zeros. 2. Calcular a função de custo J(w)e os gradientes parciais em relação a cada wi. 3. Atualizar cada peso, movendo-se na direção contrária ao gradiente (que é onde o custo diminui). 4. Repetir até que o custo não apresente redução significativa ou alcance um número de iterações pré-determinado. Matematicamente, cada atualização se parece com: wj:= wj−α∂ ∂wj J(w) em que αé a taxa de aprendizado (learning rate), responsável pelo “tamanho do passo” que damos em cada atualização. Figura 1.18: Redução do Custo ao longo das Iterações. 1.9.5 Aplicando seus conhecimentos Abaixo, mostramos um pequeno exemplo prático em Python usando a biblioteca scikitlearn, que oferece a implementação de regressão logística. Suponha que temos um conjunto de dados fictício que relaciona algumas características ambientais e o rótulo de “desmatamento” (1) ou “não desmatamento” (0). 64
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Copie e Teste! import numpy as np import pandas as pd from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split # Exemplo fictício # Vamos criar um DataFrame com variáveis simuladas: data = { 'area_floresta': [10, 50, 80, 30, 60, 90, 45, 85, 20, 70], 'dist_rodovias': [1, 3, 5, 2, 4, 8, 6, 7, 2, 9], 'desmatamento': [0, 1, 1, 0, 1, 1, 1, 1, 0, 1] } df = pd.DataFrame(data) # Separe variáveis de entrada (X) e o alvo (y) X = df[['area_floresta','dist_rodovias']] y = df['desmatamento'] # Dividindo em treino e teste X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Criando o modelo de Regressão Logística modelo = LogisticRegression() modelo.fit(X_train, y_train) # Previsões e acurácia y_pred = modelo.predict(X_test) acuracia = modelo.score(X_test, y_test) print("Previsões no conjunto de teste:", y_pred) print("Acurácia do modelo:", acuracia) Resultado Esperado Previsões no conjunto de teste: [0 1] Acurácia do modelo: 1.0 Neste exemplo simples: • Criamos dados fictícios para área de floresta (em hectares), distância de rodovias e rótulos (desmatamento ou não). • Dividimos os dados em conjunto de treino (80%) e teste (20%). • Treinamos uma regressão logística e avaliamos a acurácia no conjunto de teste. Naturalmente, em aplicações reais, o conjunto de dados seria muito maior e com mais variáveis (chuva, uso do solo, tipo de vegetação etc.). 65
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA 1.9.6 Fronteira de Decisão A fronteira de decisão é a linha (em problemas 2D) ou superfície (em problemas com mais dimensões) que separa as regiões de previsão para cada classe. Por exemplo, se xestiver de um lado da fronteira, o modelo atribui a classe 0; se estiver do outro lado, classe 1. Na regressão logística, essa fronteira é definida quando: hw(x) = 0.5⇐⇒ 1 1 + e−z= 0.5⇐⇒ z= 0 Ou seja, a condição w·x= 0 (somando o termo bias) define geometricamente a fronteira. Apenas olhar para os números de acurácia ou as previsões finais pode não ser suficiente para entender como um modelo realmente está se comportando. Por isso, uma forma poderosa de interpretar algoritmos de classificação é visualizar como ele separa as diferentes classes no espaço das variáveis. A seguir, aproveitando o exemplo anterior de regressão logística aplicado à previsão de desmatamento com base em características ambientais (área de floresta e distância até rodovias), vamos construir um gráfico que mostra a fronteira de decisão aprendida pelo modelo. Copie e Teste! import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import confusion_matrix, classification_report # Dados fictícios data = { 'area_floresta': [10, 50, 80, 30, 60, 90, 45, 85, 20, 70], 'dist_rodovias': [1, 3, 5, 2, 4, 8, 6, 7, 2, 9], 'desmatamento': [0, 1, 1, 0, 1, 1, 1, 1, 0, 1] } df = pd.DataFrame(data) # Separação de variáveis X = df[['area_floresta','dist_rodovias']] y = df['desmatamento'] # Padronização scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # Divisão treino/teste X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42) 66
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA # Modelo modelo = LogisticRegression() modelo.fit(X_train, y_train) # Previsões y_pred = modelo.predict(X_test) # Malha de pontos para o contorno h = .02 # Passo da malha x_min, x_max = X_scaled[:, 0].min() - 1, X_scaled[:, 0].max() + 1 y_min, y_max = X_scaled[:, 1].min() - 1, X_scaled[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h)) # Previsões na malha Z = modelo.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) # Gráfico plt.figure(figsize=(8, 6)) plt.contourf(xx, yy, Z, cmap=plt.cm.RdYlBu, alpha=0.6) # Pontos reais scatter = plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=y, edgecolor='k', cmap=plt.cm.bwr, s=100) plt.title("Fronteira de decisão da Regressão Logística") plt.xlabel("Área de floresta (padronizada)") plt.ylabel("Distância até rodovia (padronizada)") plt.legend(*scatter.legend_elements(), title="Desmatamento") plt.grid(True) plt.tight_layout() plt.show() Figura 1.19: Visualização da fronteira de decisão do modelo de Regressão Logística para o problema de previsão de desmatamento. 67
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Fique Alerta! A regressão logística transforma uma combinação linear das variáveis de entrada em uma saída probabilística pela função sigmoide. A função de custo usada é baseada em “crossentropy”, adequada para classificação. O treinamento do modelo ajusta os pesos por meio do Gradiente Descendente ou outros métodos de otimização. A fronteira de decisão aparece onde a probabilidade calculada é 0,5, correspondente a z= 0. A regressão logística é um pilar fundamental para problemas de classificação binária, seja para prever probabilidade de desmatamento, risco de doenças ou qualquer outro cenário de decisão entre duas classes. Ela mescla a simplicidade do modelo linear com a capacidade de produzir uma saída probabilística entre 0 e 1. Ao longo de estudos mais avançados, você verá variações da regressão logística (multiclasse, regularizações distintas etc.) que expandem ainda mais seu campo de aplicação. Mas o mais importante é entender sua base: função sigmoide, função de custo apropriada e o ajuste dos parâmetros via métodos de otimização. 1.10 Avaliação do modelo de classificação A avaliação de modelos de classificação é parte essencial do desenvolvimento de soluções de Machine Learning, pois fornece uma visão abrangente de quão bem o modelo está distinguindo as classes de interesse. 1.10.1 Por que avaliar um modelo de classificação? Imagine que queremos desenvolver um sistema para identificar, em imagens de satélite, se uma determinada área da Amazônia está sendo impactada pelo desmatamento (classe positiva) ou permanece intacta (classe negativa). Ao criar esse modelo, precisamos saber se ele realmente acerta na maior parte das vezes e, principalmente, se ele é confiável para informar políticas de proteção ambiental. É possível que um modelo apresente resultados otimistas em alguns casos pontuais e não seja realmente efetivo em um cenário mais amplo. Em situações em que a classe “desmatamento” ocorre com frequência relativamente baixa (ou seja, a maioria das áreas ainda está preservada), confiar apenas em uma métrica como a acurácia pode levar a conclusões equivocadas. Por isso, precisamos de métricas complementares, como precisão, recall, F1 Score e a análise da Curva ROC e AUC, que nos oferecem uma visão mais rica sobre os erros e acertos. 1.10.2 Matriz de confusão Para interpretar corretamente as métricas de avaliação de um modelo de classificação, é fundamental começar pela matriz de confusão. Essa matriz nada mais é do que uma tabela que compara as previsões do modelo com os valores reais observados. Em um cenário de classificação binária, por exemplo, classificar áreas como “desmatadas” (positivo) ou “não desmatadas” (negativo), a matriz de confusão organiza os resultados em quatro categorias: •TP (Verdadeiro Positivo): é quando o modelo previu que a área está desmatada, e ela realmente está. •TN (Verdadeiro Negativo): é quando o modelo previu que a área não está desmatada, e isso é verdade. 68
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA •FP (Falso Positivo): é quando o modelo previu desmatamento, mas a área não estava desmatada de fato. •FN (Falso Negativo): é quando o modelo previu que não houve desmatamento, mas na realidade houve. Essa estrutura simples permite calcular métricas importantes como precisão, sensibilidade (recall), especificidade e acurácia, fornecendo uma visão mais completa da performance do modelo, especialmente quando há desequilíbrio entre as classes. Para compreender melhor as métricas de avaliação, vamos começar pela matriz de confusão, uma tabela que compara as previsões de um modelo aos valores reais. Em um problema binário, digamos, “área desmatada” (positivo) vs. “área não desmatada” (negativo), a matriz de confusão assume a forma: Predição Positivo Predição Negativo Real Positivo TP (Verdadeiro Positivo) FN (Falso Negativo) Real Negativo FP (Falso Positivo) TN (Verdadeiro Negativo) Agora vamos aproveitar o exemplo anterior de previsão de desmatamento com regressão logística e adicionar matriz de confusão. Copie e Teste! import numpy as np import pandas as pd from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix, classification_report, ConfusionMatrixDisplay import seaborn as sns import matplotlib.pyplot as plt # Dados simulados np.random.seed(42) n = 500 area_floresta = np.random.randint(10, 100, n) dist_rodovias = np.random.randint(1, 20, n) desmatamento = ((area_floresta < 60) & (dist_rodovias < 10)). astype(int) df = pd.DataFrame({ 'area_floresta': area_floresta, 'dist_rodovias': dist_rodovias, 'desmatamento': desmatamento }) # Separar variáveis X = df[['area_floresta','dist_rodovias']] y = df['desmatamento'] # Dividir em treino e teste X_train, X_test, y_train, y_test = train_test_split(X, y, 69
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA test_size=0.3, random_state=42) # Treinar o modelo modelo = LogisticRegression() modelo.fit(X_train, y_train) # Previsões y_pred = modelo.predict(X_test) # Métricas print("Relatório de Classificação:") print(classification_report(y_test, y_pred, digits=2)) # Matriz de Confusão cm = confusion_matrix(y_test, y_pred) disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels =["Não desmatada","Desmatada"]) # Visualização plt.figure(figsize=(6,4)) disp.plot(cmap="YlGnBu") plt.title("Matriz de Confusão - Classificação de Desmatamento") plt.grid(False) plt.show() Resultado Esperado Relatório de Classificação: precision recall f1-score support 0 0.95 0.98 0.96 107 1 0.95 0.86 0.90 43 accuracy 0.95 150 macro avg 0.95 0.92 0.93 150 weighted avg 0.95 0.95 0.95 150 70
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Acurácia A primeira métrica que normalmente vemos é a acurácia, definida como: Acurácia =TP +TN TP +TN +FP +FN Significa a proporção total de acertos entre todas as previsões feitas. Ela é intuitiva, mas pode ser enganosa se as classes estiverem desbalanceadas. Suponha que 90% do território analisado não apresente sinais de desmatamento; um modelo que “chuta” sempre “não desmatado” poderá atingir 90% de acurácia sem de fato conseguir identificar as áreas em risco. Se o conjunto de dados fosse altamente desbalanceado, por exemplo, contendo pouquíssimos casos de desmatamento em meio a muitas áreas preservadas, a acurácia poderia se mostrar elevada por motivos equivocados como “prever sempre preservado”. Por isso, exploraremos mais métricas. Precisão A precisão (precision) responde à pergunta: Dentre as áreas que o modelo classificou como desmatadas, qual a proporção de vezes em que ele estava certo? Precisão =TP TP +FP Quando a precisão é alta, significa que o modelo raramente dá “alarme falso”. Em um contexto amazônico, isso seria bom para evitar mobilizar fiscais ou drones para áreas que, na realidade, estariam intactas. Recall O recall (sensibilidade) avalia: Dentre todas as áreas que de fato estão desmatadas, quantas foram identificadas corretamente pelo modelo? Recall =TP TP +FN Quando o recall é alto, significa que o modelo dificilmente deixa passar um caso real de desmatamento. Num cenário de preservação, esse aspecto pode ser crítico, pois FN (falso negativo) tende a ser muito prejudicial: deixamos de detectar um problema real. Um recall muito baixo pode indicar que muitos desmatamentos estão passando despercebidos (FN alto). Uma precisão muito baixa pode indicar que estamos tendo muitos alarmes falsos (FP alto), o que pode levar a custo excessivo de fiscalização. F1 Score Para conciliar a importância tanto da precisão quanto do recall, a métrica F1 Score é frequentemente usada. Ela é a média harmônica dessas duas medidas: F1 = 2 ×Precisão ×Recall Precisão +Recall O F1 Score é especialmente útil em bases desbalanceadas, pois evita que o modelo foque apenas em um dos aspectos (por exemplo, ter precisão altíssima às custas de um recall péssimo, 71
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA ou vice-versa). Ele condensa em um único valor a noção de equilíbrio entre os acertos positivos corretos e a abrangência em capturá-los. Se seu problema exige um certo compromisso entre não perder exemplos positivos e não rotular negativos como positivos, o F1 Score pode ser um bom indicador de desempenho geral. Curva ROC Quando temos um problema de classificação binária, o modelo frequentemente retorna não apenas uma classe (0 ou 1), mas uma probabilidade associada a cada classe. Podemos então variar um limiar (threshold) para decidir quando essa probabilidade deve ser tratada como “positivo” ou “negativo”. A Curva ROC (Receiver Operating Characteristic) é um gráfico em que o Eixo Y é o True Positive Rate (TPR), também chamado de Recall, e o Eixo X é o False Positive Rate (FPR). Para cada limiar, obtemos um par (FPR, TPR). Ao plotar todos os pares, teremos uma curva que começa em (0,0) e termina em (1,1), mostrando o comportamento do modelo sob diversos níveis de “exigência” para prever positivo. Figura 1.20: Comparação de Curvas ROC de Três Modelos. 72
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA mas aqui o foco será na Regularização L2, também conhecida como Ridge Regularization. Para ilustrar, imagine que você está construindo um modelo para classificar se determinada região amazônica está em processo de desmatamento ou não. O modelo recebe fatores ambientais (chuvas, temperatura, imagens de satélite) e socioeconômicos (índice de desenvolvimento humano, crescimento populacional etc.). Se certos fatores tiverem pesos extremamente altos, o modelo pode estar “superajustado” a um conjunto pequeno de exemplos específicos, e não necessariamente estar aprendendo algo geral sobre desmatamento. Com a Regularização L2, esses pesos são contidos, penalizando valores muito grandes, ajudando o modelo a ser mais robusto e generalizar melhor. 1.12.1 Definição Matemática da Regularização L2 Na Regressão Logística simples (sem regularização), a função de custo (ou loss function) pode ser escrita da seguinte forma: J(θ) = −1 m m X i=1 [y(i)log(hθ(x(i))) + (1 −y(i))log(1 −hθ(x(i)))] onde: •mé o número de exemplos de treinamento •y(i)é o rótulo real do i-ésimo exemplo (0 ou 1 no caso binário) •x(i)é o vetor de features •hθ(x(i))é a hipótese do modelo: σ(θTx(i)), com σsendo a função sigmoide. A Regularização L2 adiciona um termo de penalidade ao custo, que empurra os coeficientes θjpara valores menores. A função de custo com essa penalização passa a ser: Jreg(θ) = −1 m m X i=1 [y(i)log(hθ(x(i))) + (1 −y(i))log(1 −hθ(x(i)))] + λ 2m n X j=1 θ2 j Note que a soma do termo de regularização não inclui θ0(o termo independente ou viés) na maior parte das implementações, pois não desejamos penalizar esse termo. •λé o hiperparâmetro de regularização, que controla a intensidade da penalização • Se λfor muito grande, o modelo ficará “excessivamente suave” pode gerar underfitting • Se λfor muito pequeno, o efeito de regularização será insignificante e o modelo pode “voltar” a sofrer overfitting Esse termo adicional λ 2mPθ2 j“puxa” todos os coeficientes θjpara mais perto de zero, reduzindo a complexidade do modelo e, por consequência, seu potencial de sobreajuste. 79
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA 1.12.2 Gradiente e Atualização dos Pesos Sem regularização, o gradiente descendente ajusta θjsegundo: θj:= θj−α∂ ∂θj J(θ) onde αé a taxa de aprendizado (learning rate). Com Regularização L2, a derivada da função de custo ganha um termo adicional, resultando em: θj:= θj−α∂ ∂θj J(θ) + λ mθj,para j≥1 Observe que o gradiente passa a ter esse acréscimo λ mθj. Em outras palavras, a cada passo do gradiente, é como se “empurrássemos” θjlevemente em direção a zero, de modo a evitar valores extremos. 1.12.3 Por que a Regularização L2 ajuda a reduzir o overfitting? Modelos que não são regularizados podem “inflar” coeficientes para obter uma classificação perfeita em cenários muito específicos do conjunto de treinamento. Ao penalizar pesos grandes, a regularização “doutrina” o modelo a somente elevar muito um peso se isso for realmente necessário para o aprendizado, caso contrário, ele “prefere” manter os coeficientes mais conservadores, próximos de zero. Na prática, isso faz com que o modelo seja mais “suave”: se uma única variável Xknão for realmente tão determinante, seu peso não crescerá descontroladamente. Assim, o modelo pode se generalizar melhor para novos dados. Podemos usar o conceito amazônico para exemplificar: se existirem diversos sinais ambientais e socioeconômicos que apontam para desmatamento, a regularização faz o modelo levar todos em conta de forma balanceada. Sem a regularização, poderia acontecer de algum indicador pontual, por exemplo, uma variação climática específica de certo ano assumir um peso exagerado, o que não se sustentaria ao longo do tempo. Caso Prático Regularização L2 na Previsão de Risco de Desmatamento Vamos explorar uma aplicação simples de Regressão Logística com Regularização L2 em um problema fictício de classificação binária. Suponha que tenhamos dados ambientais de áreas de preservação e queiramos prever se há alto risco de desmatamento (1) ou baixo risco (0), com base em variáveis como índice de chuva, densidade populacional e quantidade de árvores por hectare. Copie e Teste! import numpy as np import pandas as pd from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # Gerando dados simulados 80
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA np.random.seed(42) n = 50 chuva = np.random.normal(loc=200, scale=60, size=n) densidade_pop = np.random.normal(loc=80, scale=30, size=n) arvores_hectare = np.random.normal(loc=1000, scale=200, size=n) # Definindo o risco com base em regra fictícia risco = (chuva < 150).astype(int) | (densidade_pop > 110).astype( int) | (arvores_hectare < 800).astype(int) # Montando o DataFrame df = pd.DataFrame({ 'chuva': chuva, 'densidade_pop': densidade_pop, 'arvores_hectare': arvores_hectare, 'risco_desmatamento': risco }) # Separando X e y X = df[['chuva','densidade_pop','arvores_hectare']] y = df['risco_desmatamento'] # Divisão em treino e teste X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42) # Modelo com Regularização L2 model = LogisticRegression(penalty='l2', C=1.0) model.fit(X_train, y_train) # Avaliação y_pred = model.predict(X_test) acc = accuracy_score(y_test, y_pred) prec = precision_score(y_test, y_pred) rec = recall_score(y_test, y_pred) f1 = f1_score(y_test, y_pred) # Resultados print("Acurácia:", acc) print("Precisão:", prec) print("Recall:", rec) print("F1 Score:", f1) print("Coeficientes (Pesos):", model.coef_) * Os valores abaixo podem divergir dependendo de quais valores aleatórios o algoritmo gere para a simulação. 81
CAPÍTULO 1. APRENDIZAGEM SUPERVISIONADA Resultado Esperado Acurácia: 0.9230769230769231 Precisão: 1.0 Recall: 0.8888888888888888 F1 Score: 0.9411764705882353 Coeficientes (Pesos): [[-0.0658 0.0336 -0.0109]] 1.12.4 O que fazer a seguir •Escolha de λ: na prática, experimentamos diferentes valores de λ, ou diferentes valores de C, no caso do scikit-learn e avaliamos qual equilibra melhor o erro de treinamento e a capacidade de generalização, erro no conjunto de validação ou teste. •Verificação de λ: se a regularização estiver muito forte, isto é, λmuito grande ou C muito pequeno, o modelo pode não capturar as relações necessárias e ter desempenho ruim até mesmo em treinamento. Nesse caso, a estratégia é reduzir λ. •Combinando com outras técnicas: a regularização pode ser combinada com seleção de variáveis, uso de mais dados de treinamento e técnicas de validação cruzada para encontrar um bom ponto de equilíbrio. Sempre que lidamos com problemas que envolvam múltiplas variáveis ambientais ou demográficas, a Regularização L2 pode ser uma forma confiável de evitar que ruídos específicos, por exemplo, variáveis muito correlacionadas ou picos fora do comum em certo período façam o modelo “se perder” no processo de aprendizagem. A Regularização L2 é uma ferramenta fundamental para a construção de modelos de classificação mais robustos, sobretudo ao lidar com cenários em que há muitas variáveis potenciais e o risco de overfitting é alto. Seu funcionamento matemático baseia-se em adicionar ao custo um termo que penaliza o crescimento excessivo dos coeficientes, trazendo-os em direção a zero. Fique Alerta! Regularização L2 não é só “uma fórmula”, mas uma filosofia de modelagem que busca aprender padrões de modo controlado, contribuindo para um modelo mais confiável e útil na classificação de problemas reais. 82
Capítulo 2 Aprendizagem Não-Supervisionada e Sistemas de Recomendação Iniciando o diálogo... Você já se perguntou como as plataformas de streaming sugerem filmes ou séries sem que você diga exatamente do que gosta? Ou então, como aplicativos de compras online conseguem recomendar produtos que parecem ter tudo a ver com você, mesmo sem ter tantas informações sobre seu perfil? A resposta está em um ramo da Inteligência Artificial chamado Aprendizado Não Supervisionado, no qual os computadores aprendem padrões e relações a partir dos dados, tudo isso sem receber, de cara, o “rótulo” correto de cada exemplo. 2.1 O que é Aprendizado Não Supervisionado? De acordo com Mitchell (1997), o aprendizado não supervisionado busca identificar estruturas ocultas em dados sem o uso de rótulos. Para entendermos melhor o não supervisionado, vale relembrar rapidamente o que chamamos de aprendizado supervisionado. Nele, sabemos as respostas corretas (rótulos) para cada exemplo de treino, por exemplo, saber se uma imagem é de um gato ou de um cachorro e usamos esses rótulos para ensinar o computador a classificar ou fazer previsões. No aprendizado não supervisionado, essa etapa de “ensinar com respostas prontas” não existe. Ou seja, temos apenas os dados, sem classificações ou explicações fornecidas de antemão, e o computador tenta encontrar padrões ou estruturas por conta própria. Esses padrões podem surgir de muitas formas: grupos de pessoas com comportamentos parecidos, textos que tratam de assuntos semelhantes ou até produtos que geralmente são comprados juntos. Uma analogia simples para o aprendizado não supervisionado é imaginar que você tem uma caixa com peças de LEGO de vários tamanhos e cores, sem qualquer identificação. A tarefa é separar essas peças em grupos parecidos. Você não tem uma etiqueta “vermelho” ou “amarelo” nem mesmo um “conjunto oficial”: você descobre, por conta própria, se vai separar por cor, formato ou algum outro critério que faça sentido. 83
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO 2.1.1 Sistemas de Recomendação Os Sistemas de Recomendação são uma aplicação muito conhecida do aprendizado não supervisionado (embora possam envolver técnicas variadas). Plataformas como Netflix, YouTube, Amazon e Spotify geram recomendações personalizadas ao agrupar pessoas e conteúdos com comportamentos semelhantes, mesmo que não saibam “exatamente” o que cada pessoa é ou gosta. •Netflix e YouTube: Observam quais filmes/séries/vídeos cada pessoa assiste e criam padrões de preferências. Se você assiste a vários vídeos de culinária, por exemplo, o sistema encontra outros usuários que também veem vídeos de culinária e verificam o que mais eles assistem. A partir daí, surgem recomendações que podem despertar seu interesse. •E-commerce como Amazon, Mercado Livre etc.: Ao analisar o histórico de compras e visualizações, o sistema agrupa clientes com hábitos parecidos. Assim, quando alguém que lembra o seu perfil comprou um determinado produto, você também recebe a indicação. •Streaming de Música como Spotify e Deezer: Comportamentos como “pular uma faixa” ou “ouvir até o final” ajudam o algoritmo a entender quais estilos de música você mais gosta, sugerindo playlists bem específicas. Fique Alerta! Embora esses sistemas sejam muito úteis, eles se baseiam na disponibilidade e na qualidade dos dados. Se, por algum motivo, o registro de preferências ou hábitos estiver incompleto, distorcido ou tendencioso, as recomendações podem falhar e até mesmo criar “bolhas” de informação. 2.1.2 Agrupamento (Clustering) Grande parte dos sistemas de recomendação utiliza a ideia de agrupamento ou clustering. O algoritmo recebe dados como: • Histórico de compras; • Tipos de produtos visualizados; • Filmes assistidos; • Estilo musical preferido. Em seguida, ele tenta encontrar grupos de usuários com padrões semelhantes. Isso permite associar suas preferências às de outras pessoas que gostam de coisas parecidas, o que acaba gerando sugestões personalizadas. 2.1.3 Relação com o Cotidiano Além do entretenimento, o aprendizado não supervisionado aparece em muitas outras áreas: 84
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO •Agricultura Inteligente: Ao monitorar dados de temperatura, umidade e solo, é possível agrupar regiões parecidas e identificar que tipo de cuidado cada área precisa para uma produção mais eficiente. •Saúde: Dados de exames podem ser analisados para encontrar grupos de pacientes com sintomas ou características semelhantes, auxiliando na descoberta de possíveis doenças e tratamentos. •Ecologia e Meio Ambiente: Sensores espalhados em florestas podem coletar informações sobre clima, espécies, índices de poluição, entre outros. A análise não supervisionada agrupa áreas em risco ou com potencial de conservação. •Educação: Plataformas de ensino online agrupam alunos com dificuldades semelhantes, recomendando materiais de estudo específicos ou organizando tutoriais que realmente os ajudem. Vantagens •Encontrar o inesperado: Sem rótulos pré-definidos, o algoritmo pode revelar padrões que ninguém imaginava existir, trazendo novas descobertas e caminhos de pesquisa. •Escalabilidade: Muitos algoritmos de aprendizado não supervisionado funcionam bem com grandes volumes de dados, o que é fundamental na era digital, onde tudo gera informação. •Automatização: Uma vez configurado, o sistema consegue organizar dados e produzir recomendações continuamente, sem intervenção humana a todo instante. Desafios •Qualidade dos Dados: Se os dados forem escassos ou não representativos, os padrões podem sair totalmente equivocados. No caso de recomendações, você pode acabar recebendo sugestões irrelevantes. •Interpretação: Identificar que “há grupos de clientes” não basta; é preciso interpretar porque eles se agrupam assim. Em aplicações sérias, como saúde, entender o que cada grupo representa é crucial. •Questões Éticas: Como não há supervisão, o algoritmo pode agrupar pessoas de forma inadequada, reforçar estereótipos ou até mesmo criar discriminações. Em sistemas de recomendação, isso pode amplificar a famosa “bolha de filtros”, em que se recebe apenas um tipo de conteúdo. 2.1.4 Por que aprender isso? Você pode se perguntar: “Ok, mas por que eu preciso entender esse assunto?” Eis alguns pontos: •Futuro Profissional: O domínio de técnicas de inteligência artificial, mesmo que de modo introdutório, é um grande diferencial. O mercado de tecnologia demanda cada vez mais profissionais que entendam de dados. 85
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO •Tomada de Decisão: Compreender como máquinas identificam padrões ajuda a desenvolver o pensamento crítico. Você passa a questionar as sugestões que recebe: “Será que isso faz sentido para mim?”, “De onde vieram esses dados?”. •Criatividade e Inovação: Quem sabe você não cria um aplicativo para ajudar seus colegas a escolherem livros ou podcasts? Ou mesmo uma maneira inteligente de reciclar na escola, agrupando materiais por tipo e reaproveitando-os de forma inovadora? •Consciência Digital: Vivemos em uma era em que cada clique gera informação. Saber como essas informações são processadas e recomendadas amplia nossa visão sobre privacidade e segurança de dados. Conhecendo um pouco mais! Quer ver de perto como funciona um sistema de recomendação simples? Pesquise por tutoriais de “recomendação de filmes em Python”. Há exemplos básicos que podem ser executados até em um navegador, usando plataformas online gratuitas. Para entender melhor a ideia de Agrupamento (Clustering), experimente separar objetos de acordo com cor, tamanho ou formato, sem usar nenhum rótulo. Perceba como surgem grupos naturalmente, e como diferentes critérios levam a agrupamentos diferentes. Prepare-se para um mundo onde as máquinas descobrem sozinhas e nos ajudam a tomar decisões mais inteligentes, seja na hora de escolher o próximo filme para assistir ou de planejar estratégias de cultivo sustentável em grandes fazendas. Boa leitura e bons experimentos! 2.2 Fundamentos de aprendizagem não-supervisionada 2.2.1 Definição e aplicações A aprendizagem não-supervisionada é uma área da ciência de dados que se dedica a encontrar estruturas ou padrões em conjuntos de dados que não possuem rótulos ou categorias previamente definidas. Em outras palavras, em vez de receber exemplos de “certo” ou “errado” (ou de uma classe específica) para orientar sua análise, o algoritmo trabalha por conta própria para identificar relacionamentos, sem instruções diretas sobre quais respostas ou grupos procurar. Essa abordagem é especialmente útil quando não se tem certeza de como os dados estão organizados ou quando é inviável ou muito caro rotular cada exemplo manualmente. A seguir, discutiremos de forma simples o conceito de aprendizagem não-supervisionada e algumas de suas aplicações em diferentes contextos. A ideia é oferecer uma visão geral para que você, enquanto estudante de ensino médio, possa compreender o que está por trás dessa metodologia, por que ela é importante e como pode ser aplicada em situações reais. O que é Aprendizagem Não-Supervisionada? Para entender melhor, vale a pena fazer uma comparação com a aprendizagem supervisionada. Na abordagem supervisionada, temos dados de entrada (por exemplo, imagens ou descrições de objetos) e o rótulo correspondente (como “gato” ou “cachorro”). Dessa forma, o algoritmo aprende a associação entre os dados de entrada e o rótulo. Já na aprendizagem não-supervisionada, não há rótulos para guiar a busca pelo padrão. O algoritmo recebe apenas o conjunto de dados e a tarefa de analisá-los, procurando maneiras de agrupá-los ou resumir suas características. 86
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO Podemos imaginar a aprendizagem não-supervisionada como alguém entrando em um cômodo cheio de caixas e sendo desafiado a organizar tudo sem conhecer o que cada caixa contém. A pessoa vai abrindo as caixas, observando o que há dentro e, a partir dessas observações, agrupa as caixas por similaridade, criando “categorias” próprias. A grande questão é que essas categorias não são definidas de antemão: elas surgem da própria análise dos dados. Principais Tarefas na Aprendizagem Não-Supervisionada Embora existam diversas técnicas e objetivos dentro da aprendizagem não-supervisionada, duas tarefas se destacam como as mais conhecidas: agrupamento (clustering) e redução de dimensionalidade. Agrupamento (Clustering) O objetivo é encontrar grupos de elementos que sejam mais similares entre si do que em relação a elementos de outros grupos. Por exemplo, se você tem uma lista de músicas com várias características (ritmo, instrumentos, duração etc.), um algoritmo de agrupamento pode descobrir automaticamente gêneros ou subgêneros baseados nas semelhanças desses atributos, mesmo que as faixas não tenham classificações prévias. Esse tipo de análise é bastante utilizado em ferramentas de recomendação. Muitas plataformas de filmes e músicas utilizam algoritmos de agrupamento para sugerir conteúdo semelhante, que outros usuários com o mesmo perfil também gostaram. Redução de Dimensionalidade Em muitos casos, é comum termos um conjunto de dados com centenas ou até milhares de variáveis (também chamadas de “dimensões”). A redução de dimensionalidade visa simplificar esse conjunto de variáveis em um número menor de componentes que ainda representem bem as informações originais. Essa simplificação ajuda, por exemplo, a visualizar dados complexos em gráficos de duas ou três dimensões, facilitando o entendimento de como eles se relacionam ou se agrupam. Também pode ser útil para preparar os dados para outras tarefas, reduzindo o ruído e otimizando o desempenho de algoritmos mais complexos. Aplicações Práticas e Exemplos A aprendizagem não-supervisionada é muito utilizada em diferentes campos e projetos de ciência de dados. Alguns exemplos: •Agrupamento de Clientes: Em mercados e lojas virtuais, profissionais de marketing utilizam esses algoritmos para identificar grupos de clientes com hábitos de consumo parecidos. Isso ajuda a criar campanhas personalizadas, ofertas especiais e até prever tendências de compra. •Detecção de Anomalias: Sistemas de segurança virtual ou detecção de fraudes em cartões de crédito podem monitorar transações e, por meio do agrupamento, perceber quais comportamentos são “normais” e quais são anômalos. Assim, é possível identificar movimentos suspeitos de forma mais ágil, mesmo sem ter exemplos prévios do que seria uma “fraude”. •Recomendação de Conteúdo: Em aplicativos de streaming de vídeos ou músicas, os algoritmos analisam o histórico de consumo dos usuários e encontram padrões de preferências musicais ou cinematográficas, sugerindo novos conteúdos que combinem com os gostos identificados. 87
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO •Compressão de Dados e Imagens: Usando redução de dimensionalidade, é possível comprimir informações, como imagens de alta resolução, em formatos menores, preservando o essencial para reconstruí-las ou analisá-las. Isso diminui a quantidade de espaço de armazenamento necessário e facilita o envio desses arquivos pela internet. •Análise de Texto: Técnicas de agrupamento podem ser aplicadas a coleções de textos (como artigos, postagens em redes sociais ou pesquisas acadêmicas), extraindo tópicos principais e classificando documentos de maneira automática, a partir das palavras que aparecem com maior frequência. A aprendizagem não-supervisionada é fundamental porque muitas vezes não temos rótulos disponíveis ou não sabemos ao certo como agrupar os dados. Na prática, isso significa que podemos descobrir insights novos e inusitados a partir de conjuntos de dados complexos e diversificados. Com a popularização do acesso a grandes volumes de informações, como registros de sites, plataformas de redes sociais, dados de sensores em cidades inteligentes, entre outros, a capacidade de “aprender sem ser instruído” torna-se cada vez mais valiosa. É importante enfatizar que a aprendizagem não-supervisionada não substitui outras formas de análise de dados, mas sim as complementam. Muitas vezes, podemos aplicar técnicas não-supervisionadas antes mesmo de usar algoritmos de aprendizagem supervisionada, para entender melhor a estrutura dos dados. Também é possível combinar as duas abordagens em projetos mais complexos, enriquecendo o processo de descoberta de conhecimento. A partir daqui, convidamos você a refletir: Quais são as áreas do seu cotidiano em que a análise não-supervisionada poderia ser aplicada? Pense em aplicativos, sites ou pesquisas escolares em que faz sentido agrupar informações sem ter um rótulo prévio. 2.3 Agrupamento K-means 2.3.1 Função de custo Conforme Géron (2023), técnicas de agrupamento como K-means permitem particionar dados em grupos baseados em similaridades, ou seja, estamos lidando com uma técnica de agrupamento cujo objetivo principal é agrupar dados em grupos. Para descobrir os melhores agrupamentos, utilizamos uma medida que indica o quão “bem” os dados estão organizados em torno de cada centroide. Essa medida é conhecida como Função Custo (cost function). De modo geral, a Função Custo de K-means mede o quanto cada ponto do conjunto de dados está distante do centroide de seu grupo. Se os pontos estiverem muito distantes dos respectivos centroides, significa que a partição não está boa. Se, ao contrário, os pontos estiverem próximos de seus centroides, quer dizer que o agrupamento é melhor. Custo neste contexto, é um valor numérico que indica o “erro” ou a “qualidade” do agrupamento. Quanto menor for esse valor, melhor está o agrupamento, ou seja, os dados estão mais bem “encaixados” nos seus grupos. Nesse método, o custo é calculado com base na soma dos quadrados das distâncias de cada ponto ao seu centroide. Para tornar as ideias mais claras, vamos usar alguns símbolos matemáticos simples. Suponha que temos um conjunto de dados X={x1,x2, . . . , xN}, onde cada xié um ponto (ou um vetor de características) em um espaço Rd. Queremos dividir esses Npontos em Kgrupos. Em K-means, cada grupo tem um centroide µj, para j= 1,2, . . . , K. Cada ponto xipertence a exatamente um desses grupos. A Função Custo de K-means, muitas vezes chamada de soma dos erros quadráticos (Sum of Squared Errors, SSE), é dada por: 88
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO Em resumo, essa soma mede o quão “espalhados” ficam os pontos em cada cluster. Agrupamentos bons tendem a ter uma soma de distâncias menor, pois cada ponto está relativamente próximo do seu centroide. No entanto, só olhar para o valor dessa soma não resolve o dilema, pois quanto mais aumentamos k, menor essa soma tende a ficar (com muitos clusters, cada grupo fica bem “apertado” em torno do centroide). Então precisamos de métodos adicionais para fazer uma escolha mais equilibrada. Método do Cotovelo - Elbow Method Uma das abordagens mais populares e intuitivas para escolher ké o método do cotovelo (Elbow Method). Eis como funciona: 1. Variar k:rodamos o k-means para valores de kdiferentes (por exemplo, de 1 a 10). 2. Calcular a soma dos quadrados das distâncias: obtemos o valor de J(C, µ)para cada k. 3. Plotar o resultado: criamos um gráfico em que o eixo horizontal representa ke o eixo vertical representa o valor da função de custo J. O comportamento esperado é que, no início quando ké pequeno, a diminuição de J seja bem grande quando aumentamos k(porque estamos passando de um grupo para dois, depois para três etc.). Porém, a partir de certo ponto, essa queda começa a ficar cada vez menor. Imagine o formato de um braço dobrado no cotovelo: o “cotovelo” do gráfico marca aproximadamente um ponto de inflexão. Esse “cotovelo” (ou joelho) costuma indicar um bom valor de k, pois dali em diante o ganho na redução do custo não compensa o aumento de complexidade de adicionar mais clusters. Na prática, esse “cotovelo” nem sempre é muito nítido; às vezes é sutil. Mesmo assim, o método costuma dar uma boa pista sobre valores de krazoáveis para explorar. Fique Alerta! Em muitos cenários de aplicações reais, costumávamos testar alguns valores de kem torno do ponto de inflexão, realizando análises qualitativas e/ou quantitativas para decidir qual deles é mais útil. Método da Silhueta - Silhouette Method Outra forma de avaliar a qualidade do agrupamento e ajudar a definir ké a Silhueta (Silhouette). A ideia, de maneira simplificada, é: Para cada ponto xi, calcular: •Coesão: a média das distâncias de xia todos os outros pontos do cluster no qual xiestá. •Separação: a média das distâncias de xiaos pontos do cluster mais próximo, ou seja, o cluster diferente em que ele teria a menor distância média. A Silhueta side cada ponto xié dada por: si=separação −coesão max(separação, coesão) Esse valor varia de -1 a +1. 95
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO • Valores próximos de +1 indicam que o ponto está bem “encaixado” em seu cluster e distante de outros clusters. • Valores próximos de 0 indicam que o ponto está próximo da fronteira entre dois clusters. • Valores negativos indicam que o ponto pode estar “errado” e pertenceria melhor a outro cluster. Para avaliar todo o conjunto, podemos calcular a média de sientre todos os pontos. Essa média nos dá um indicador global de qualidade do agrupamento. Assim como no método do cotovelo, podemos variar k(por exemplo, de 2 até 10) e medir a média das silhuetas. Geralmente, escolhemos o kque maximiza essa média. Se kfor muito pequeno, vários pontos tendem a ficar próximos de fronteiras de clusters, e se for muito grande, os clusters podem ficar muito separados ou mal configurados. A silhueta ajuda a encontrar um meio-termo. Outras Estratégias Além do Elbow Method e da Silhouette, existem outras técnicas mais avançadas para escolher k. Duas delas são: •Critério da Informação (IC, AIC, BIC) que são métodos estatísticos que penalizam a complexidade do modelo. Sempre que se aumenta k, a complexidade do modelo cresce; então esses critérios buscam um equilíbrio entre a qualidade do ajuste e a quantidade de parâmetros usados. •Método do Salto (Gap Statistic): Compara a variação interna dos dados (distâncias nos clusters) com o que se esperaria de dados “aleatórios”. Assim, podemos identificar se okescolhido realmente representa um agrupamento melhor do que um cenário “sem padrão”. Intuição Prática Uma maneira simples de criar uma intuição sobre a escolha de ké observar “manchas” ou “aglomerados” visuais em um gráfico, nos casos em que temos dados em duas dimensões, por exemplo. Nesse caso, o método do “olhômetro” pode funcionar como um primeiro passo: Se você vê claramente 3 grupos bem separados, experimente k= 3, mas se vê 2 regiões mais difusas, mas nenhuma outra concentração importante, tente k= 2. É claro que, para dados em várias dimensões (acima de 2D ou 3D), essa estratégia de “olhômetro” fica inviável, pois não conseguimos visualizar adequadamente. Ainda assim, a ideia de olhar a “distância interna” dos grupos ou a “silhueta” dos pontos segue sendo valiosa. Resumo Na prática, a melhor maneira de escolher kdepende do contexto do problema. Sempre verifique se o número de grupos faz sentido dentro do domínio em que os dados foram coletados, por exemplo, biologia, economia, geografia etc. O bom uso do k-means passa por equilibrar conhecimento da área, análise visual quando possível e indicadores numéricos para tomar a decisão sobre quantos clusters realmente são úteis. Com esses conceitos em mente, estaremos mais preparados para aplicar o k-means de forma eficiente e fundamentada, compreendendo em maior profundidade como a escolha de kpode influenciar diretamente a qualidade e a utilidade dos grupos formados. 96
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO 2.4 Exemplo prático do método k-means Iniciando o diálogo... Até agora, vimos os conceitos gerais de agrupamento, a função custo que orienta o processo de minimização da distância entre pontos e centroides, e como escolhemos e atualizamos esses centroides. Também discutimos o desafio de definir o número kde grupos. Nesta seção, vamos colocar tudo isso em prática por meio de um exemplo real de implementação do algoritmo k-means em Python. O principal objetivo é mostrar, de maneira intuitiva, como podemos agrupar um conjunto de dados em diferentes “clusters” sem precisar, necessariamente, saber a que grupo cada dado pertence de antemão. Esse é o poder do aprendizado não supervisionado! 2.4.1 Como faremos? 1. Gerar um conjunto de dados: Criaremos pontos de dados artificiais como se fossem coordenadas em um plano. 2. Aplicar o k-means: Utilizaremos uma biblioteca Python que facilita o processo, mas também revisaremos a lógica de como a distância entre pontos e centroides é utilizada para formar clusters. 3. Visualizar os resultados: É importante ver graficamente como o algoritmo agrupa os pontos e atualiza os centroides ao longo do processo. Para simplificar, vamos gerar pontos em duas dimensões (x e y). Assim, conseguiremos plotar e enxergar onde cada ponto está. Suponha que cada ponto represente, por exemplo, o tempo de estudo (em horas) e a nota em uma prova de Matemática. Vamos criar quatro grupos distintos de maneira proposital, e depois veremos se o k-means consegue recuperá-los. Copie e Teste! import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans # Gerando dados artificiais # "random_state" é usado para manter resultados reproduzíveis np.random.seed(42) # Grupo 1: média em (2, 2) grupo1 = np.random.randn(50, 2) + np.array([2, 2]) # Grupo 2: média em (8, 3) grupo2 = np.random.randn(50, 2) + np.array([8, 3]) # Grupo 3: média em (4, 7) grupo3 = np.random.randn(50, 2) + np.array([4, 7]) # Grupo 4: média em (8, 8) grupo4 = np.random.randn(50, 2) + np.array([8, 8]) # Concatenando todos os grupos em um só array X = np.vstack([grupo1, grupo2, grupo3, grupo4]) 97
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO # Plotando os pontos antes do agrupamento plt.scatter(X[:, 0], X[:, 1]) plt.title("Dados artificiais (antes do k-means)") plt.xlabel("Coordenada X") plt.ylabel("Coordenada Y") plt.show() Figura 2.2: Gráfico de dispersão dos 200 pontos de dados artificiais gerados para o experimento. Criamos 200 pontos, divididos em quatro regiões “centrais”, visualmente, esperamos que o método k-means agrupe esses pontos de acordo com sua proximidade. 2.4.2 Executando o k-means O k-means começa escolhendo kcentroides iniciais e, em seguida, ajusta constantemente esses centroides até que o processo de realocação de pontos pare de mudar muito ou até atingir um número máximo de iterações. Cada realocação de pontos visa minimizar a soma das distâncias quadráticas entre cada ponto e o centróide de seu grupo. Vamos escolher k= 4 para ver se o algoritmo consegue recuperar as “regiões” que geramos. 98
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO Copie e Teste! import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans # Gerando dados artificiais (código omitido, igual ao anterior) np.random.seed(42) grupo1 = np.random.randn(50, 2) + np.array([2, 2]) grupo2 = np.random.randn(50, 2) + np.array([8, 3]) grupo3 = np.random.randn(50, 2) + np.array([4, 7]) grupo4 = np.random.randn(50, 2) + np.array([8, 8]) X = np.vstack([grupo1, grupo2, grupo3, grupo4]) # Aplicando k-means para k=4 k = 4 kmeans = KMeans(n_clusters=k, random_state=42) kmeans.fit(X) # Atribuições finais dos pontos aos clusters labels = kmeans.labels_ # Coordenadas dos centróides finais centers = kmeans.cluster_centers_ # Plotando os pontos e os centróides plt.scatter(X[:, 0], X[:, 1], c=labels) plt.scatter(centers[:, 0], centers[:, 1], marker='*', s=200, edgecolors='black', c="#40f75c") plt.title("Agrupamento com k-means (k=4)") plt.xlabel("Coordenada X") plt.ylabel("Coordenada Y") plt.show() O que está acontecendo no código: •KMeans(n_clusters=k, random_state=42): indica que vamos agrupar em quatro clusters n_clusters = 4 e fixamos random_state para mantermos resultados iguais em cada execução. •kmeans.fit(X): executa o algoritmo k-means nos dados X. •kmeans.labels_: para cada ponto, o algoritmo atribui um rótulo (label) que indica a qual dos quatro grupos o ponto pertence. •kmeans.cluster_centers_: ao final do ajuste, o k-means retorna a posição de cada centroide. 99
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO Figura 2.3: Resultado da aplicação do algoritmo k-means com k=4. No gráfico, usamos cores diferentes (c=labels) para distinguir os pontos de cada grupo, e marcamos os centroides com uma estrela usando marker='*'. Experimente variar o número de clusters de 2 até 6. Observe como o agrupamento muda e pense em qual cenário faz mais sentido. 2.4.3 Interpretando o resultado Se o k-means foi bem-sucedido e nosso número k= 4 fez sentido, veremos que os pontos se dividiram em quatro regiões, próximas aos “centros” que geramos. Além disso, cada centroide deverá estar aproximadamente na média dos pontos de seu cluster. •Função custo: nesse processo, a soma das distâncias quadráticas entre pontos e seus centroides é minimizada. Ou seja, o algoritmo encontra a forma de agrupar que deixa os pontos “o mais próximo possível” de seus respectivos centroides. •Atualização dos centroides: a cada iteração, o centroide se move para a média dos pontos que pertencem àquele cluster. •Escolha do parâmetro k:nós “acertamos” k= 4 porque geramos quatro grupos. Na prática, podemos usar métodos de avaliação, como a “curva do cotovelo” ou o “silhouette score”, para escolher k. 100
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO 2.4.4 Conexão com o aprendizado de máquina Esse exemplo mostra como o k-means pode ser aplicado em problemas simples, mas a ideia geral pode ser levada para cenários muito mais complexos: segmentação de clientes, análise de imagens, compressão de dados etc. A intuição que queremos reforçar aqui é: • Cada ponto “pertence” ao centroide mais próximo. • Os centroides se realocam até “ficarem bons” em representar seus grupos. • O processo tende a convergir rapidamente, embora, em casos mais avançados, seja preciso retestar com diferentes pontos iniciais ou usar métodos mais sofisticados. 2.4.5 Resumo • O k-means é simples e eficiente para agrupar dados em kgrupos diferentes. • Ele depende fortemente da escolha de k. É comum testar vários valores antes de decidir o melhor. • Visualizar o resultado ajuda a entender melhor a lógica de “aproximar pontos a um centroide”. 2.5 Análise dos componentes principais (PCA) Iniciando o diálogo... Imagine que você tem um conjunto de dados com várias características ou features, a análise de componentes principais (PCA) é amplamente utilizada para reduzir dimensionalidade preservando a variância dos dados (Goodfellow; Bengio; Courville, 2016). Por exemplo, vamos considerar um estudo que tenta relacionar hábitos de estudo, horas de sono, tipos de alimentação e o desempenho de diferentes estudantes em uma prova. Cada estudante poderia ser descrito por muitas variáveis, intensidade do estudo, qualidade do sono, número de horas dormidas, variedade da dieta, idade, entre outras. Quando analisamos um conjunto de dados grande desse modo, dizemos que temos um problema de “alta dimensionalidade”, pois cada variável representa uma dimensão. A princípio, quanto mais dimensões tivermos, mais rica pode ser a descrição dos nossos dados. Entretanto, surge um desafio: fica difícil, ou mesmo impossível, analisar e visualizar todas essas dimensões ao mesmo tempo. É aqui que entra o conceito de redução de dimensionalidade, um conjunto de técnicas que nos permite “condensar” ou “resumir” as informações de um grande número de dimensões em apenas duas, três ou algumas poucas dimensões para facilitar a análise e a visualização, sem perder a maior parte do significado original. 2.5.1 Redução de Dimensionalidade Para entender o que é reduzir a dimensionalidade, vamos recorrer a um exemplo intuitivo, pense em desenhar pontos em um papel, com duas dimensões (x e y), podemos representar cada ponto num plano, com três dimensões, a representação se torna um pouco mais difícil de visualizar, pois precisaríamos de um ambiente 3D, agora, imagine termos dez dimensões, cem 101
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO dimensões ou até milhares de dimensões. Para o cérebro humano, é impossível “enxergar” diretamente essas “dimensões extras”. Entretanto, muitas dessas dimensões podem conter informações semelhantes ou até mesmo redundantes. Em outras palavras, há variáveis que se sobrepõem no que representam, elas podem estar altamente correlacionadas. Isso faz pensar: será que precisamos de todas essas variáveis para ter uma boa visão do que está acontecendo no nosso conjunto de dados? A ideia de redução de dimensionalidade é pegar um conjunto com muitas dimensões e encontrar uma forma de sintetizá-las em poucas dimensões, aproveitando as correlações, ou seja, os padrões de variabilidade entre as variáveis para “comprimir” a informação. O truque é tentar fazer isso de modo a perder o mínimo de informação possível. No caso do PCA (Principal Component Analysis), nós procuramos as direções (ou componentes principais) que concentram a maior parte da variação existente no conjunto de dados. Ao projetar os dados nessas poucas direções, conseguimos reter boa parte do que é mais relevante, em termos de variabilidade, e ignorar o que é menos importante ou redundante. 2.5.2 Relação com a Visão Gráfica Para visualizar com mais clareza, um exemplo comum é pensar em um conjunto de pontos em três dimensões (eixo X, Y e Z). Às vezes, esses pontos estão, essencialmente, distribuídos em torno de um plano. Se esse for o caso, provavelmente não precisamos de três dimensões completas para descrever os pontos, um plano 2D pode ser o suficiente. E, ao “descer” de três para duas dimensões, tornamos a visualização mais fácil, mantendo a maior parte da “estrutura” dos dados. No ensino médio, costumamos ver gráficos de funções de duas ou três variáveis. Agora, quando falamos de dezenas ou centenas de variáveis, não conseguimos mais usar o mesmo truque de “eixos” para enxergar tudo de uma só vez. O PCA e outras técnicas de redução de dimensionalidade são, portanto, nossa forma de fazer esse “zoom out”: mesmo que as variáveis sejam muitas, podemos encontrar uma projeção, ou várias projeções, que facilitem a análise, seja para fins de descrição, para preparar o terreno para outro método de aprendizado de máquina ou para resumo e comunicação dos resultados. 2.5.3 Por que reduzir a dimensionalidade é Importante? •Visualização e Exploração: Em alta dimensionalidade, é difícil criar gráficos intuitivos. Ao projetar dados em poucas dimensões, podemos gerar gráficos mais simples, como diagramas de dispersão (2D) ou representações tridimensionais, facilitando a análise inicial dos dados. •Redução de Ruído: Certas variáveis podem conter muito ruído ou pouca informação relevante. Ao compactar a informação nas direções que de fato explicam a maior variação, muitas vezes conseguimos deixar de lado esse “ruído” e nos concentrar no que realmente importa. •Economia de Recursos: Modelos de aprendizado de máquina sofrem quando têm de lidar com muitas variáveis irrelevantes ou redundantes. Reduzir as dimensões pode ajudar a treinar modelos com maior eficiência, além de evitar um problema conhecido como overfitting, que é quando o modelo se “vicia” nos detalhes específicos do conjunto de treinamento, perdendo capacidade de generalização. 102
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO •Simplicidade e Interpretabilidade: Ter um conjunto menor de variáveis derivadas (componentes principais) pode ajudar a interpretar melhor as relações existentes nos dados, embora, nesse ponto, seja preciso equilibrar a redução com a possibilidade de perder, nas novas combinações, o sentido prático das variáveis originais. 2.5.4 Formalismo Matemático Mesmo que o objetivo aqui seja dar uma visão intuitiva, vale a pena dar um passo adiante e citar de forma simples como o PCA faz essa “mágica”: 1. Matriz de Dados: Começamos organizando nossos dados em uma matriz. Cada linha representa um indivíduo ou uma observação e cada coluna, uma variável. 2. Centralizar os Dados: Depois, subtraímos da matriz a média de cada coluna, para que todas fiquem centradas em torno de zero. 3. Calcular a Covariância: Em seguida, calculamos a matriz de covariância, que mostra as correlações entre as variáveis (ou uma matriz de correlação, em alguns casos). 4. Autovalores e Autovetores: A partir dessa matriz de covariância, encontramos os autovalores e autovetores. Os autovetores são as direções (ou eixos) onde os dados variam mais, enquanto os autovalores medem a importância (quantidade de variância) que cada uma dessas direções captura. 5. Componentes Principais: Ordenamos os autovetores pela magnitude de seus autovalores do maior para o menor e, então, escolhemos apenas alguns deles, pois eles retêm a maior parte da variabilidade total dos dados. Cada autovetor selecionado corresponde a uma “direção principal” e projetar nossos dados nessas direções reduz o número de dimensões, mas conserva a maior parte da informação. 2.5.5 Um exemplo intuitivo para fixar Pense em uma sala de aula em que se queira analisar como os estudantes se agrupam em relação às suas notas em três disciplinas: Matemática, Língua Portuguesa e Ciências. Você obtém três notas por estudante. Isso forma um espaço tridimensional: cada estudante é um ponto nesse espaço, nota de Matemática no eixo X, nota de Língua Portuguesa no eixo Y, nota de Ciências no eixo Z. Porém, pode acontecer de Matemática e Ciências estarem altamente correlacionadas, porque quem se destaca em uma, muitas vezes se destaca na outra. Nesse caso, não precisamos de duas dimensões separadas para representar essas duas disciplinas de forma independente. Se projetarmos (via PCA) esses dados em duas dimensões, é provável que a primeira componente principal seja algo como o “desempenho geral em Exatas”, enquanto a segunda componente possa estar mais associada a aspectos que diferenciam Língua Portuguesa de Matemática e Ciências, por exemplo. Em outras palavras, passamos de três notas para dois “indicadores” que resumem bem a variação desses estudantes, preservando a maior parte da informação. Visualmente, deixamos de ter um ponto em 3D para ter pontos em 2D, sem perder muito de nossa capacidade de identificar padrões. 103
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO 2.5.6 Resumo Vimos como a redução de dimensionalidade surge como uma solução poderosa quando nos deparamos com conjuntos de dados grandes e complexos. A ideia de procurar as direções que mais “explicam” a variação dos dados e, assim, resumir muitas variáveis em poucas, é central no Método de Análise de Componentes Principais (PCA). A seguir, ao mergulharmos no estudo de covariância, autovalores e autovetores, veremos em detalhes como o PCA faz esse resumo de informação de maneira matemática. Depois, veremos como gerar visualizações, como o scree plot, para decidir quantos componentes principais usar. Por fim, aplicamos o método em um exemplo prático, para consolidar o aprendizado. Ou seja, se você já se perguntou por que muitas vezes vemos gráficos com apenas duas ou três dimensões quando o conjunto de dados original tem muito mais variáveis, a resposta está na redução de dimensionalidade. O PCA, em particular, é uma das ferramentas mais populares para esse fim, pois alia uma boa intuição de compressão de informação com bases matemáticas sólidas. Fique Alerta! Mesmo que a ideia de “jogar fora” algumas dimensões possa parecer assustadora, afinal, poderíamos estar perdendo dados, na prática, as dimensões descartadas tendem a explicar pouca parte da variação total. Portanto, a redução geralmente facilita nossa vida sem prejudicar a análise, desde que verifiquemos quantos componentes principais de fato precisamos para representar adequadamente a informação relevante. 2.6 Covariância, autovalores e autovetores Iniciando o diálogo... Nesta seção, vamos explorar alguns conceitos centrais para a Análise de Componentes Principais (PCA). Nosso foco será entender o papel da covariância, bem como o que são autovalores e autovetores, e por que eles são tão importantes na redução de dimensionalidade. 2.6.1 Por que medir a covariância? Quando trabalhamos com dados em várias dimensões (por exemplo, altura, peso, idade, notas de uma turma etc.), muitas vezes nos interessa descobrir se existe alguma relação entre essas variáveis. Por exemplo, se quisermos analisar a relação entre altura e peso de um grupo de estudantes, podemos querer saber se à medida que a altura aumenta, o peso também tende a aumentar, ou se não há uma relação clara. A covariância é uma medida que quantifica o grau de variação conjunta entre duas variáveis. Em termos simples, se a covariância entre duas variáveis for positiva, significa que elas tendem a crescer ou diminuir juntas, mas se a covariância for negativa, significa que quando uma variável cresce, a outra tende a diminuir, agora, se for próxima de zero, as variáveis são, sob certo ponto de vista, “independentes” no que se refere à variação linear, ou seja, não crescem ou diminuem juntas de modo consistente. 104
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO plt.show() print("Variância explicada acumulada (%):", var_acumulada) Resultado Esperado Variância explicada(%): [67.9646 95.6828 99.8385 100.0] Figura 2.5: Scree Plot - PCA nas características das frutas. O gráfico mostra o acúmulo da variância explicada conforme aumentamos o número de componentes. Neste exemplo, nossos dois primeiros componentes explicam aproximadamente 95% da variância, isso indicaria que poderíamos reduzir de 4 para apenas 2 dimensões, mantendo quase toda a informação dos dados originais. 2.7.3 Interpretação e Escolha do Número de Componentes Figura 2.6: Scree Plot - PCA nas características das frutas com destaque no ”joelho”da curva. 111
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO Um dos dilemas na aplicação do PCA é determinar quantos componentes manter para reduzir os dados sem perder informação importante. O Scree Plot auxilia bastante nessa decisão, mas não existe uma “fórmula mágica” exata. Algumas orientações práticas: •Verifique o “joelho” da curva (elbow method): Se houver um ponto em que a curva passa a diminuir muito lentamente, esse ponto (ou um pouco antes dele) costuma ser escolhido como o número de componentes adequados, observe a imagem acima com o destaque no ”joelho”. •Soma cumulativa da variância explicada: Muitas vezes, estabelecemos um patamar de “95% de variância explicada” ou outro valor definido previamente. Nesse caso, somamos as porcentagens da variância explicada componente a componente, até atingir o nível desejado. •Análise prática do contexto: Em algumas situações, podemos manter um número maior de componentes se cada componente tiver um significado interpretável. Em outras, podemos preferir soluções mais enxutas com poucos componentes, para facilitar a visualização ou processamento dos dados. A escolha final, portanto, depende do equilíbrio entre simplificar o máximo possível (menos dimensões) e preservar informação suficiente (variância explicada alta). 2.7.4 Resumo A Análise de Componentes Principais (PCA) é uma ferramenta poderosa para transformar conjuntos de dados complexos em representações gráficas mais simples e intuitivas. Por meio dela, é possível identificar padrões, relações e agrupamentos que, em um espaço com muitas variáveis, estariam ocultos. • Um dos principais recursos visuais da PCA é o Scree Plot, que mostra quanta variância cada componente principal consegue explicar. Ele ajuda a decidir de forma objetiva quantos componentes realmente valem a pena manter, indicando onde está o ponto de equilíbrio entre simplificação e perda de informação. • As visualizações em duas ou três dimensões, feitas com os primeiros componentes, tornam possível “ver” estruturas e agrupamentos que antes estavam escondidos, facilitando a análise e a interpretação dos dados. • A escolha do número de componentes deve equilibrar critérios matemáticos como a variância explicada ou o ponto de inflexão (joelho na curva) do Scree Plot, com o contexto prático e a clareza na interpretação dos resultados. Mais do que apenas reduzir variáveis, o PCA nos permite reorganizar os dados de uma forma mais compreensível. Usar essa técnica com consciência envolve entender o papel das componentes principais, interpretar o Scree Plot e transformar os resultados em algo aplicável, mesmo em contextos educacionais como o ensino médio. Assim, seja em áreas como ciências, finanças ou esportes, o PCA se torna uma forma eficaz de revelar padrões e simplificar a complexidade dos dados. 112
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO 2.8 Detecção de anomalia Iniciando o diálogo... Imagine que você trabalha em uma loja virtual e precisa monitorar milhares de transações por dia para identificar possíveis fraudes. Ou pense em um sistema de sensores instalado em uma fábrica, onde cada sensor mede a temperatura, a pressão e outras variáveis que indicam o bom funcionamento das máquinas. Em ambos os casos, queremos identificar rapidamente qualquer ponto “estranho” ou suspeito, para evitar prejuízos ou acidentes. Esse processo de identificar valores fora do comum é o que chamamos de detecção de anomalias. Existem diversas maneiras de se detectar anomalias, mas uma das mais simples e poderosas utiliza a distribuição Gaussiana (também conhecida como distribuição normal). A ideia fundamental é modelar o comportamento “normal” dos dados por meio de uma “função de probabilidade” e, em seguida, verificar quando um novo dado se afasta muito desse comportamento. 2.8.1 A Distribuição Gaussiana A distribuição Gaussiana é uma das métricas mais importantes na estatística e na ciência de dados. Ela é comumente representada pelo famoso “formato de sino” (a famosa “curva em forma de sino”). Por que “normal”? A distribuição Gaussiana é chamada de “normal” pois, em muitos casos práticos, grande parte dos fenômenos naturais e sociais tende a apresentar distribuições que se aproximam dessa forma, por exemplo: alturas de pessoas em uma população, erros de medição em experimentos etc. Embora na prática nem todo dado real siga exatamente essa distribuição, ela costuma ser um bom ponto de partida para diversos problemas de análise. Representação matemática Na forma mais simples, univariada, para um valor xmedido, a distribuição Gaussiana é descrita pela função: p(x) = 1 √2πσ2exp −(x−µ)2 2σ2 onde: •µé a média dos valores, o centro da distribuição •σ2é a variância que descreve a dispersão em torno da média; o desvio-padrão é σ Para nós, o importante é entender que essa função nos diz o “quão provável” é observar cada valor de x. Se xestiver muito distante de µ, ou seja, for um valor muito diferente do comum, a probabilidade p(x)será bem pequena. Quando utilizamos a distribuição Gaussiana para a detecção de anomalias, estamos assumindo que os dados “normais” podem ser bem representados por essa forma de distribuição. Assim, valores que tiverem probabilidade muito baixa, ou seja, estiverem “na cauda” da distribuição, podem ser considerados anômalos. 113
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO 2.8.2 Modelando Dados com Distribuição Gaussiana Suponha que você tenha um conjunto de dados históricos que acredita serem livres de anomalias, o que chamamos de conjunto de treinamento. Por exemplo, transações que foram confirmadas como legítimas, leituras de sensores sem defeitos, ou outro cenário onde se sabe que os dados representam “comportamento normal”. O processo geral é o seguinte: 1. Estimação dos parâmetros (µeσ2): • Calcular a média µde todos os valores, por exemplo, todos os valores de temperatura medidos • Calcular a variância σ2, ou seja, o quanto os valores variam em torno da média 2. Cálculo da probabilidade de um ponto (x): • Dado µeσ2, aplicamos a fórmula da Gaussiana para encontrar p(x) • Se p(x)for muito baixo, isso indica que xé bastante improvável, ou seja, potencialmente anômalo 3. Definição de um limiar (threshold): • Precisamos escolher um valor ϵ(épsilon) de probabilidade abaixo do qual consideramos que o ponto xé anômalo. Essa escolha pode ser feita de várias maneiras, como analisando a distribuição dos dados de treinamento ou validando em um conjunto de exemplos conhecidos de anomalias. Caso Univariado No caso univariado, trabalhamos apenas com um atributo. Por exemplo, apenas a temperatura de um motor. Podemos usar a curva Gaussiana para estimar a probabilidade de cada temperatura ocorrer. Quando uma nova leitura chega, calculamos p(temperatura). Se esse valor for menor que o limiar ϵ, classificamos como anômalo. Caso Multivariado Na prática, contudo, muitas vezes temos vários atributos relevantes. Por exemplo, uma transação online tem valor total, localização do comprador, horário do dia, método de pagamento etc. Um único atributo fora da curva não significa necessariamente fraude, mas uma combinação de vários fatores pode sim apontar algo suspeito. Nesse caso, podemos estender o mesmo raciocínio para a distribuição Gaussiana multivariada. Em vez de simplesmente termos média e variância, passamos a ter: • Um vetor de médias µ, onde cada componente é a média de um atributo. • Uma matriz de covariância Σ, que não só informa quão dispersos estão os dados em cada atributo, mas também descreve como eles se relacionam entre si. Matematicamente, a distribuição Gaussiana multivariada de um vetor de atributos x∈ Rné dada por: p(x) = 1 (2π)n/2|Σ|1/2 exp −1 2(x−µ)TΣ−1(x−µ) onde: 114
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO •né o número de atributos (dimensionalidade do vetor x) •Σé a matriz de covariância (n×n), e |Σ|é o determinante dela •Σ−1é a inversa de Σ Apesar de parecer complexa, a lógica é a mesma, quanto mais distante xestá de µ, levando em conta as correlações entre atributos, menor será a probabilidade p(x). 2.8.3 Escolhendo o limiar épsilon A escolha do limiar ϵé um ponto crítico. Se ϵfor muito alto, você acaba sinalizando anomalias com muita facilidade, gerando muitos “falsos positivos”, você acha que algo está errado quando na verdade não está. Se ϵfor muito baixo, você pode deixar passar pontos anômalos, gerando “falsos negativos”, você não acha nada de errado, mas na verdade há um problema ali. Uma forma prática de ajustar ϵé: 1. Separar uma parte dos dados conhecidos em um conjunto de validação, onde há exemplos tanto de casos “normais” quanto de casos “anormais”. 2. Variar ϵe medir, em cada valor, a taxa de acerto em classificar os casos do conjunto de validação. 3. Escolher o ϵque faz um bom equilíbrio entre detectar anomalias e não gerar alarmes em excesso. 2.8.4 Aplicando Modelos Gaussianos na Detecção de Anomalias 1. Coletar dados representativos do comportamento normal: Pode ser o histórico de transações legítimas, leituras de sensores com funcionamento correto etc. 2. Estimar parâmetros (univariados ou multivariados): Calcular média(s) (µou µ) e variância(s) (σ2) ou covariância (Σ), dependendo de quantos atributos você tiver. 3. Calcular a função de probabilidade para cada ponto do conjunto de treinamento: • No caso univariado, usar a fórmula da Gaussiana 1D. • No caso multivariado, usar a equação generalizada. 4. Definir e ajustar o limiar ϵ: • Analisar os valores de probabilidade calculados. • Se possível, usar um conjunto de validação que contenha exemplos já rotulados como anormais para ajudar a definir ϵ. 5. Aplicar o modelo em dados novos: • Para cada novo ponto xnovo, calcule p(xnovo) • Se p(xnovo)< ϵ, rotule como anômalo. 115
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO 2.8.5 Limitações • Se os dados “normais” não forem bem representados por uma Gaussiana, o modelo pode não performar bem. • Em casos de alta dimensionalidade (muitos atributos), a Gaussiana multivariada pode se tornar complexa de ajustar, principalmente pela dificuldade de calcular a matriz de covariância inversa e por exigir muitos dados para estimar parâmetros de forma confiável. 2.8.6 Resumo A detecção de anomalias por meio de Modelos Gaussianos é uma técnica eficiente e relativamente simples de implementar. O principal está em: • Ter dados de referência que representem bem o estado “normal”. • Aprender corretamente parâmetros como média, variância e, em casos multivariados, a matriz de covariância. • Escolher criteriosamente o limiar para decidir o que é anômalo. Com esse entendimento, você poderá não apenas aplicar Modelos Gaussianos para detecção de anomalias, mas também compreender quando essa abordagem é adequada (ou não) para determinados problemas. Depois de entender e experimentar esses conceitos, você estará mais preparado para avançar em métodos mais sofisticados, como modelos baseados em Redes Neurais, Máquinas de Vetores de Suporte (SVM) para detecção de anomalias, ou até soluções que combinem diferentes abordagens. Por ora, é essencial compreender o coração do que são e como funcionam os modelos Gaussianos. Trata-se de uma base sólida que surge constantemente em aplicações de aprendizagem de máquina, desde análises preliminares até a etapa final de tomada de decisão. 2.9 Caso Prático: Exemplo de Detecção de Anomalias no Consumo de Energia em Residências Imagine que estamos monitorando o consumo de energia elétrica em uma residência ao longo do tempo. Em geral, os valores seguem um padrão relativamente estável, variando conforme o dia da semana e o horário. No entanto, picos incomuns podem indicar problemas como aparelhos defeituosos, uso indevido ou vazamentos de corrente. Nosso objetivo é detectar automaticamente essas situações anômalas com base em dados históricos de consumo. Variáveis observadas (por hora): •Consumo total (kWh): energia total consumida no intervalo de uma hora. •Pico de demanda (kW): valor mais alto de potência registrada na hora. Vamos supor que essas duas variáveis sigam distribuições normais durante o funcionamento típico da casa. 116
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO Copie e Teste! import numpy as np import matplotlib.pyplot as plt # Gerando dados normais (comportamento típico da residência) np.random.seed(42) # Consumo total em kWh: média 2.5 kWh, desvio padrão 0.4 consumo_normal = np.random.normal(loc=2.5, scale=0.4, size=1000) # Pico de demanda em kW: média 3.0 kW, desvio padrão 0.5 pico_normal = np.random.normal(loc=3.0, scale=0.5, size=1000) # Criando dados anômalos (eventos suspeitos) # Consumo elevado: média 5.5 kWh, desvio padrão 0.3 # Pico de demanda elevado: média 6.0 kW, desvio padrão 0.4 consumo_anomalo = np.random.normal(loc=5.5, scale=0.3, size=15) pico_anomalo = np.random.normal(loc=6.0, scale=0.4, size=15) # Unindo os dados data_normal = np.column_stack((consumo_normal, pico_normal)) data_anomalo = np.column_stack((consumo_anomalo, pico_anomalo)) data_total = np.vstack((data_normal, data_anomalo)) # Estimando média e desvio padrão com base apenas nos dados normais mu_consumo, sigma_consumo = np.mean(consumo_normal), np.std( consumo_normal) mu_pico, sigma_pico = np.mean(pico_normal), np.std(pico_normal) # Funções de probabilidade def gaussian_prob(x, mu, sigma): return 1/(np.sqrt(2*np.pi)*sigma) * np.exp(-((x - mu)**2)/(2* sigma**2)) def calc_joint_prob(x1, x2, mu1, sigma1, mu2, sigma2): return gaussian_prob(x1, mu1, sigma1) * gaussian_prob(x2, mu2, sigma2) # Calculando a probabilidade para cada observação probs = calc_joint_prob( data_total[:, 0], # consumo data_total[:, 1], # pico mu_consumo, sigma_consumo, mu_pico, sigma_pico ) # Definindo limiar epsilon = 1e-4 anomalias = probs < epsilon 117
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO # Separando os dados dados_normais = data_total[~anomalias] dados_anomalias = data_total[anomalias] # Visualização plt.figure(figsize=(8, 6)) plt.scatter(dados_normais[:, 0], dados_normais[:, 1], label=' Normal', alpha=0.7) plt.scatter(dados_anomalias[:, 0], dados_anomalias[:, 1], color=' red', label='Anomalias', marker='x') plt.xlabel('Consumo total (kWh)') plt.ylabel('Pico de demanda (kW)') plt.title('Detecção de Anomalias no Consumo de Energia Residencial ') plt.legend() plt.grid(True) plt.show() # Relatório print("Total de medições:",len(data_total)) print("Total de anomalias detectadas:", np.sum(anomalias)) Resultado Esperado Total de medições: 1015 Total de anomalias detectadas: 16 118
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO O gráfico mostra um plano com duas dimensões: Eixo X: Consumo total de energia na hora (em kWh) e Eixo Y: Pico de demanda registrado na hora (em kW), onde cada ponto representa uma medição de uma hora específica. Os pontos azuis indicam comportamentos considerados normais, ou seja, dentro do padrão histórico da residência. Os pontos vermelhos com ”X”são os que o modelo identificou como anomalias, situações que fogem significativamente do padrão esperado. Visualmente, podemos perceber que essas anomalias costumam ter valores muito altos de consumo e pico, indicando um possível problema ou evento incomum (como aparelhos funcionando simultaneamente fora do horário usual, por exemplo). Isso significa que, das 1015 horas monitoradas, o modelo identificou 16 medições cujos valores eram tão improváveis segundo a distribuição normal dos dados que foram rotuladas como possíveis anomalias. O objetivo não é afirmar que houve um problema, mas chamar atenção para situações que merecem investigação. Em aplicações reais, essas detecções ajudam equipes técnicas a priorizar inspeções ou enviar alertas aos moradores, evitando desperdícios e aumentando a segurança. 2.10 Sistemas de recomendação Iniciando o diálogo... Imagine que você chega a uma livraria virtual e, logo na primeira página, encontra sugestões de livros que parecem ter tudo a ver com seus gostos literários. Ou, em um aplicativo de streaming de música, descobre uma playlist feita sob medida para você. Esses exemplos ilustram o poder dos sistemas de recomendação, que têm como principal objetivo sugerir itens relevantes para usuários, sejam esses itens filmes, músicas, produtos, livros, notícias ou qualquer outro tipo de conteúdo. Segundo Russell e Norvig (2010), sistemas de recomendação são mecanismos inteligentes que buscam maximizar a utilidade percebida pelos usuários. Num mundo com uma quantidade enorme de informação disponível, os sistemas de recomendação atuam como “curadores” digitais. Eles vasculham vastos acervos de dados para apresentar ao usuário aquilo que, segundo o modelo de análise adotado, tem a maior probabilidade de lhe interessar. E, embora por trás dessas recomendações haja algoritmos matemáticos e técnicas de processamento de dados, sua importância e utilidade tornam-se evidentes no dia a dia. Sem esses sistemas, grande parte do conteúdo online permaneceria “escondida”, seria difícil ou demorado descobrir novos itens relevantes sem que algum mecanismo automatizado filtre e ordene as opções. 2.10.1 Por que os Sistemas de Recomendação são Importantes? •Redução de Sobrecarga de Informação: Em ambientes digitais, as opções de escolha podem ser contadas na casa dos milhares ou até milhões. Por exemplo, plataformas de streaming de filmes e séries oferecem catálogos enormes. Diante de tantas possibilidades, decidir o que assistir pode se tornar um desafio. Os sistemas de recomendação aliviam essa “paralisia da escolha”, destacando os itens mais alinhados aos interesses individuais. •Melhora na Experiência do Usuário: Quando as recomendações são bem ajustadas aos gostos de cada pessoa, a interação do usuário com a plataforma se torna mais agradável. Isso não apenas estimula a volta do usuário ao serviço, mas também promove o engajamento contínuo: ele passa a confiar que o sistema oferecerá algo de valor. 119
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO •Personalização: Este é um pilar dos sistemas de recomendação. Em vez de mostrar o mesmo conteúdo para todos os usuários, esses sistemas aprendem preferências a partir de interações passadas (cliques, visualizações, avaliações, histórico de pesquisa etc.) para entregar sugestões sob medida. •Ampliação de Descobertas: Além de trazer opções “óbvias”, como mais filmes de ação para quem curte filmes de ação, os sistemas de recomendação podem ajudar o usuário a explorar novas áreas de interesse. Por exemplo, se você costuma ouvir rock e, de repente, recebe sugestões de bandas de jazz que combinam com o seu perfil, o sistema pode estar incentivando você a descobrir gostos inesperados. 2.10.2 Como os Sistemas de Recomendação funcionam? Para compreender como funcionam, podemos imaginar que existam, de um lado, usuários, pessoas que buscam os produtos, filmes, músicas etc. e, de outro, itens, os objetos que queremos recomendar. Em termos mais formais, cada usuário pode ter uma “opinião” ou preferência sobre cada item, a qual frequentemente se representa por meio de avaliações como, por exemplo, notas de 1 a 5 estrelas ou registros de comportamento, como tempo de visualização, cliques, downloads etc. Quando pensamos no conjunto dessas avaliações, podemos dispor os dados em uma matriz de avaliações. r1,1r1,2··· r1,n r2,1r2,2··· r2,n . . .. . ..... . . rm,1rm,2··· rm,n onde: •m= número de usuários •n= número de itens •ru,i = avaliação (explícita ou implícita) do usuário upara o item i No entanto, na prática, essa matriz costuma ser extremamente esparsa (repleta de “buracos”), pois poucos usuários avaliam todos os itens. Assim, o desafio do sistema de recomendação é prever quais avaliações faltantes podem ser altas, indicando que aquele usuário provavelmente gostará do item. 2.10.3 Tipos de Sistemas de Recomendação Embora existam diversas abordagens, destacamos algumas categorias principais: •Filtragem Colaborativa: Baseia-se em como diferentes usuários interagem com os itens. A ideia é que, se dois usuários têm gostos semelhantes (por exemplo, deram notas parecidas para vários itens), é provável que um goste de coisas que o outro também gostou. A filtragem colaborativa será explorada em mais detalhes no próximo tópico. •Filtragem Baseada em Conteúdo: Olha para as características ou descrições dos itens. Por exemplo, se um sistema de recomendação de filmes percebe que você frequentemente assiste a comédias românticas com atores específicos, ele vai sugerir outros filmes que tenham descrições (gênero, elenco, sinopse) parecidas. 120
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO Encontrando os K Vizinhos Mais Próximos Depois de definir a métrica de similaridade/distância, basta: 1. Comparar o usuário-alvo com cada um dos demais usuários para obter todos os valores de similaridade ou distância. 2. Ordenar esses usuários de forma decrescente pela semelhança ou crescente pela distância. 3. Selecionar os K primeiros desta lista, aqueles com maior similaridade ou menor distância. Se, por exemplo, definirmos K = 3, tomamos os 3 usuários mais próximos do usuárioalvo. Calculando a Predição de Nota Para sugerir uma nota e, assim, recomendar ou não um item para o usuário-alvo, reunimos as notas dos K vizinhos apenas para o item que desejamos estimar e fazemos uma média ponderada dessas notas, de acordo com a similaridade de cada um. Assim, vizinhos com maior similaridade têm mais influência na predição. Um modelo simples de média ponderada pode ser: ˆru,j =Pv∈V(similaridade(u, v)×rv,j) Pv∈Vsimilaridade(u, v) onde: •ˆru,j é a predição da nota do usuário upara o item j, •Vé o conjunto dos K vizinhos, •rv,j é a nota que o vizinho vdeu ao item j, • similaridade(u, v)é o grau de semelhança entre uev. Assim, chegamos a uma estimativa de qual nota o usuário daria ao item. Caso essa estimativa seja alta, o item pode ser recomendado. Caso Prático Recomendando músicas Imagine um cenário em que queremos recomendar músicas. Cada pessoa (usuário) pode ser representada como um ponto em um espaço multidimensional, em que cada eixo corresponde a uma preferência musical (por exemplo, “curtiu muito rock”, “curtiu muito pop”, etc.). Um usuário que adora rock e não gosta tanto de pop poderia ficar em uma posição do espaço, enquanto outro que gosta mais de pop estaria em uma posição bem diferente. Para saber se alguém que gosta mais de rock provavelmente gostaria de uma música nova da banda X, basta olhar para pessoas que ocupam posições próximas no “espaço de preferências”, ou seja, as que também gostam muito de rock e pouco de pop e verificar a opinião delas. Se a maioria gostou da música, é bem provável que o usuário-alvo também goste. 127
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO Copie e Teste! import numpy as np import matplotlib.pyplot as plt from sklearn.metrics.pairwise import cosine_similarity from sklearn.decomposition import PCA # 1. Matriz usuário-item com gostos musicais usuarios = { 'Alice': [5, 1, 0, 0], 'Bruno': [4, 2, 1, 0], 'Carla': [1, 5, 1, 2], 'Daniela': [0, 4, 3, 3], 'Eduardo': [1, 0, 4, 5], 'Fábio': [2, 1, 4, 4], 'Usuário-Alvo': [4, 0, 0, 0] } nomes = list(usuarios.keys()) matriz = np.array(list(usuarios.values())) # 2. Calcular similaridades do usuário-alvo com os demais similaridades = cosine_similarity([matriz[-1]], matriz[:-1])[0] # 3. Selecionar os K vizinhos mais próximos K = 3 indices_vizinhos = np.argsort(similaridades)[-K:][::-1] # 4. Supostas avaliações dos usuários para uma nova música avaliacoes_nova_musica = np.array([5, 4, 2, 3, 1, 2]) # sem o usuário-alvo avaliacoes_vizinhos = avaliacoes_nova_musica[indices_vizinhos] similaridades_vizinhos = similaridades[indices_vizinhos] # 5. Prever a nota do usuário-alvo nota_prevista = np.dot(avaliacoes_vizinhos, similaridades_vizinhos ) / sum(similaridades_vizinhos) # 6. Redução para 2D com PCA para visualização pca = PCA(n_components=2) matriz_2d = pca.fit_transform(matriz) # 7. Plotar gráfico com destaque dos vizinhos mais próximos plt.figure(figsize=(10, 6)) for i, nome in enumerate(nomes): x, y = matriz_2d[i] if i == len(nomes) - 1: plt.scatter(x, y, color='red', label='Usuário-Alvo', s =100) elif iin indices_vizinhos: plt.scatter(x, y, color='green', label='Vizinho Próximo' if 'Vizinho Próximo' not in plt.gca().get_legend_handles_labels 128
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO ()[1] else "", s=80) else: plt.scatter(x, y, color='blue', label='Outros Usuários' if 'Outros Usuários' not in plt.gca().get_legend_handles_labels() [1] else "", s=60) plt.text(x + 0.1, y, nome, fontsize=9) plt.title(f"Espaço de Preferências Musicais (Nota Prevista: { nota_prevista:.2f})") plt.xlabel("Componente Principal 1") plt.ylabel("Componente Principal 2") plt.legend() plt.grid(True) plt.tight_layout() plt.show() Figura 2.7: Gráfico ilustrando a distribuição das preferências musicais. Além disso, o gráfico gerado acima mostra os usuários posicionados em um espaço 2D de preferências musicais, criado com PCA (Análise de Componentes Principais) para facilitar a visualização. • O Usuário-Alvo aparece em vermelho. • Os usuários mais próximos (vizinhos) aparecem em verde. • É possível ver que o Usuário-Alvo está mais próximo de pessoas como Alice e Bruno, o que ajuda a justificar a previsão feita. 129
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO 2.12.3 Resumo A aplicação do método KNN em sistemas de recomendação é uma forma introdutória de Filtragem Colaborativa, porém bastante didática e intuitiva. Ela nos permite entender os conceitos de similaridade, de próximos vizinhos e de como informações de usuários “parecidos” podem guiar recomendações personalizadas. Com esta base, é possível avançar para métodos mais sofisticados, como filtros baseados em modelos de fatoração de matrizes ou técnicas híbridas. Contudo, o KNN permanece como um dos passos iniciais mais importantes para quem está começando a estudar IA e deseja criar sistemas de recomendação, pois deixa claro o papel das métricas de distância/similaridade e da manipulação de dados na matriz usuário-item. 2.13 Fatoração Matricial Iniciando o diálogo... Quando trabalhamos com dados em formato de matriz, por exemplo, notas que estudantes dão a filmes, ou a intensidade de pixels em uma imagem digital, muitas vezes essa matriz é apenas a “superfície” do problema. Por trás desses valores existem características “escondidas” que não aparecem diretamente, mas que influenciam fortemente o comportamento dos dados. Essas características escondidas são chamadas de fatores latentes ou representações latentes. Imagine que temos uma matriz onde as linhas representam pessoas e as colunas representam filmes, com cada célula indicando a nota que cada pessoa deu a cada filme. Por trás dessas notas, há diversos fatores que influenciam as preferências de cada pessoa: gosto por ação, preferência por filmes de comédia, apreciadores de animação e assim por diante. Essas dimensões, ou fatores, não aparecem explicitamente na matriz de notas, mas são fundamentais para explicar por que diferentes pessoas atribuem diferentes avaliações aos filmes. Ideia: Se conseguíssemos “descobrir” ou “extrair” essas características escondidas e representá-las numericamente, poderíamos descrever cada pessoa, ou cada filme, com base nessas dimensões de gosto. Esse é o cerne do que chamamos de representação latente. 2.13.1 Modelando dados em um espaço de fatores latentes Uma forma de pensar matematicamente nas representações latentes é supor que cada objeto (pessoa, filme, produto, item de uma base de dados etc.) tenha um conjunto de “pesos” que indicam como ele se distribui ao longo de cada fator. Por exemplo, se definirmos que existem kfatores latentes, podemos associar: • Um vetor ui∈Rka cada usuário ou linha i, no caso do nosso exemplo de recomendação de filmes. • Um vetor vj∈Rka cada item ou coluna j, no exemplo, cada filme. Seja Mij o valor que está na célula (i, j)da matriz original, por exemplo, a nota do usuário ipara o filme j. Queremos aproximar Mij por meio de uma combinação das características latentes de uievj. A forma mais simples de aproximação é: ˆ Mij =ui·vj= k X r=1 ui,rvj,r 130
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO onde: •ˆ Mij é o valor estimado (ou predito) para a célula (i, j). •ui·vjrepresenta o produto interno (ou produto escalar) entre os dois vetores. Nessa representação, cada dimensão r(de 1 a k) corresponde a um fator latente. Por exemplo, se k= 2 num caso simples de recomendação de filmes, poderíamos imaginar que o primeiro fator representa “preferência por ação” e o segundo representa “preferência por comédia”. Assim, um usuário poderia ter um valor grande na dimensão “ação” e pequeno na “comédia”, enquanto outro usuário poderia ter o oposto, e isso se refletiria nos respectivos vetores ui. 2.13.2 O problema de minimização de erro Para que as predições ˆ Mij sejam úteis, queremos que elas fiquem o mais próximo possível dos valores originais Mij observados na matriz. Em problemas práticos, muitos elementos de Mpodem até estar faltando (por exemplo, em sistemas de recomendação, um usuário não dá nota a todos os filmes), mas a ideia central permanece: ajustar uievjde modo que a diferença entre Mij eˆ Mij seja mínima. Função de custo (erro quadrático) Uma forma bem comum de mensurar quão boa é a aproximação é novamente usar o erro quadrático médio. Suponha que temos um conjunto de pares (i, j)para os quais os valores Mij são conhecidos. Definimos a função de custo: J(U,V) = X (i,j)∈Ω (Mij −ui·vj)2 onde: •Ωé o conjunto de todas as posições (i, j)da matriz para as quais os valores são conhecidos (ou seja, não faltantes). •Urepresenta todos os vetores de usuários ui. •Vrepresenta todos os vetores de itens vj. O objetivo é encontrar UeVque minimizem J(U,V). Na prática, também se adiciona uma penalização, chamada “regularização”, para controlar a complexidade dos vetores e evitar que fiquem “exagerados” e causem overfitting. Mas a ideia geral continua: queremos que a diferença entre Mij eˆ Mij seja a menor possível. 2.13.3 Por que fatores latentes ajudam a interpretar os dados? É útil pensar nos fatores latentes como dimensões de um espaço geométrico. Se escolhemos k= 2, por exemplo, estamos projetando cada usuário e cada item num plano bidimensional. Assim, podemos imaginar cada usuário como um ponto nesse plano e cada item como outro ponto, de modo que a “semelhança” entre usuário e item seja dada pela distância ou pelo produto interno entre seus vetores. 131
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO 2.13.4 Interpretação e clusterização Quando os vetores uisão bem ajustados, usuários com gostos parecidos ficam próximos uns dos outros nesse espaço, e o mesmo vale para itens semelhantes, filmes do mesmo gênero, músicas do mesmo estilo etc. Esse agrupamento (clusterização) surge naturalmente, mesmo que não tenhamos indicado explicitamente um “rótulo” de gênero ou classificação. É como se o próprio processo de minimização do erro descobrisse: • Quais filmes são mais parecidos (pois terão vetores vjmais semelhantes). • Quais pessoas têm preferências similares (pois terão vetores uimais próximos). • E, adicionalmente, como relacionar uma certa pessoa a um determinado filme (por meio do produto interno ui·vj). 2.13.5 Aplicações práticas A aplicação mais conhecida de fatoração matricial com representações latentes é nos sistemas de recomendação. Plataformas de filmes, músicas ou lojas online utilizam técnicas de fatoração matricial para prever as notas que cada usuário daria a cada item não avaliado. Assim, podem recomendar produtos ou conteúdos que provavelmente agradariam a cada usuário. Em processamento de imagens, também podemos ver uma imagem como uma matriz, ou seja, pixels em tons de cinza ou canais de cor. Alguns métodos de compressão decompondo a imagem em fatores que representam padrões locais ou globais. Esses padrões latentes são responsáveis por agrupar regiões semelhantes da imagem e permitem que o arquivo fique menor sem perder muita qualidade. Outro exemplo, é se cada linha for um documento, ou uma frase, e cada coluna for uma palavra, podemos ter uma matriz com o número de ocorrências de cada palavra em cada documento. Fatores latentes podem então representar tópicos ou temas presentes nos textos, ajudando a análise de textos ao agrupar documentos com assuntos similares. 2.13.6 O que fazer a seguir? Em técnicas mais avançadas, especialmente em redes neurais, também se buscam representações latentes, mas de uma forma mais complexa, camadas intermediárias de uma rede, por exemplo. A fatoração matricial é um ponto de partida muito instrutivo para entender como essas “representações internas” podem ser úteis na prática. E aprender a extrair fatores latentes é um passo essencial em muitos sistemas de IA, pois a capacidade de “descobrir” esses fatores equivale a aprender características importantes dos dados de forma automática. 2.13.7 Resumo A ideia de representações latentes está no cerne de vários problemas de IA. Sempre que temos uma matriz de dados, podemos nos perguntar se há fatores ou dimensões “ocultas” que explicam por que essa matriz se comporta de certa forma. A minimização de erro surge como a maneira prática de fazer com que essas dimensões, armazenadas em uievjaproximem com qualidade os valores originais Mij. Apesar de o raciocínio matemático envolver produtos internos, somas de quadrados e possíveis técnicas de regularização, a intuição é simples: descobrir padrões básicos que expliquem como os dados foram gerados. 132
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO Embora pareça “mágico” descobrir fatores latentes capazes de explicar os dados, essa mágica nada mais é do que o resultado de um bom modelo matemático e de um procedimento de otimização robusto. Com exercícios e exemplos práticos, esse processo de descoberta de padrões internos se torna claro e bastante intuitivo, mesmo para quem está começando seus estudos na área. Fique Alerta! Fatores latentes são dimensões escondidas que influenciam os valores observados em uma matriz. 2.14 Algoritmo de ALS A fatoração matricial é uma técnica muito utilizada em sistemas de recomendação, análise de dados e compressão de informações. A ideia central é representar grandes conjuntos de dados na forma de uma matriz R, por exemplo, registros de usuários (linhas) versus produtos ou itens (colunas), de modo que cada célula Ru,i guarde informações como avaliações, quantidades ou preferências. Essas matrizes costumam ser muito grandes e, muitas vezes, esparsas, cheias de células vazias ou desconhecidas. Assim, encontrar padrões diretos pode ser uma tarefa difícil. Para simplificar, recorre-se à ideia de “resumir” cada usuário e cada item em alguns poucos números chamados de fatores latentes. Se tivermos uma matriz Rde dimensões m×n(sendo mo número de usuários e no número de itens), podemos tentar aproximá-la pelo produto de duas matrizes de menor dimensão: R≈P×QT onde: •Pé uma matriz de tamanho m×k(que chamaremos de “matriz de usuários”), •Qé uma matriz de tamanho n×k(que chamaremos de “matriz de itens”), •ké a quantidade de fatores latentes que a gente escolhe. Cada usuário uagora passa a ser descrito por um “vetor de preferências” de tamanho k, que é uma linha em P. Já cada item iterá um “vetor de características” de tamanho k, que é uma linha em Q. Assim, o Pu·QT i(um produto interno entre o vetor do usuário e o vetor do item) deve se aproximar de Ru,i, a avaliação real ou outro tipo de dado. Entretanto, como ajustar esses vetores de forma a minimizar os erros de predição? É nesse contexto que entra o Algoritmo de ALS (Alternating Least Squares), que propõe uma estratégia em que ajustamos alternadamente os parâmetros dos usuários e dos itens até chegarmos a uma solução satisfatória. 2.14.1 Alternância Para compreender por que alternar ajuda, considere um exemplo simples em que temos uma expressão geral para o erro, do tipo: J(P, Q) = X (u,i)∈Ω (Ru,i −Pu·QT i)2 133
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO onde Ωé o conjunto de pares (u, i)para os quais a avaliação Ru,i é conhecida. O grande desafio está no fato de que tanto Pcomo Qaparecem ao mesmo tempo no produto interno Pu·QT i. A busca simultânea pelo Pideal e o Qideal pode ser muito complexa. Então, o Algoritmo de ALS faz o seguinte: 1. Fixa temporariamente os valores de Q, como se já estivessem dados. 2. Ajusta Pminimizando o erro Jsomente em relação aos vetores de P. 3. Em seguida, fixa os valores de P. 4. Ajusta Q, minimizando o mesmo erro, mas agora somente em relação aos vetores de Q. 5. Repete esse processo de forma iterativa, alternando entre ajustes em Pe ajustes em Q. Por isso, chama-se Alternating (alternado). O “Least Squares” (mínimos quadrados) aparece porque, para cada passo, resolvemos um problema de regressão linear minimizando o quadrado do erro de predição. 2.14.2 Passo a Passo do ALS Inicialização •Estimativa inicial de P e Q: Podemos começar com valores aleatórios pequenos para cada vetor de fator. Por exemplo, inicializar cada elemento de PeQcom valores próximos de zero, de preferência, distribuições aleatórias normais ou uniformes. •Parâmetros de controle: Definimos um número máximo de iterações, chamado de niter ou outro critério de parada, como uma certa tolerância para o erro. Também escolhemos a dimensão k, isto é, quantos fatores latentes vamos utilizar. Otimização de P Com Qfixo, cada linha Pudo Ppode ser ajustada através de um problema de regressão linear clássico. Para cada usuário u, ele tem avaliações conhecidas Ru,i para alguns itens i∈I(u). Nosso objetivo passa a ser: min PuX i∈I(u) (Ru,i −Pu·QT i)2+λ||Pu||2 onde λé um fator de regularização que ajuda a controlar a magnitude dos vetores. Como se trata de um problema quadrático em Pu(com Qfixo), é possível resolvê-lo com métodos de álgebra linear. Na prática, cada linha Pupode ser obtida resolvendo um sistema do tipo: Pu X i∈I(u) QT iQi+λI =X i∈I(u) Ru,iQi Aqui, Ié a matriz identidade de dimensão k×k. Note que, para cada usuário, temos um pequeno sistema linear de dimensão k, e como kcostuma ser bem menor do que n, isso é computacionalmente viável. 134
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO Otimização de Q Mantemos o Precém-atualizado e, então, repetimos o processo para o Q. Agora, cada linha Qié ajustada individualmente resolvendo outro sistema de equações lineares: min QiX u∈U(i) (Ru,i −Pu·QT i)2+λ||Qi||2 em que U(i)é o conjunto de usuários que avaliaram o item i. Assim, segue-se: Qi X u∈U(i) PT uPu+λI =X u∈U(i) Ru,iPu Ao resolver esse sistema, atualizamos a linha Qipara cada item, garantindo uma aproximação melhor a cada iteração. Repetição e Critério de Parada •Iteração: Repetimos o par “atualizar P→atualizar Q” diversas vezes, e o erro total tende a diminuir. •Convergência: Observa-se que, após um certo número de iterações, as mudanças em PeQpassam a ser mínimas ou o erro não melhora de forma significativa. Esse é o momento de parar o algoritmo. 2.14.3 Entendendo o ALS de um jeito simples Uma forma legal de entender como o algoritmo ALS funciona é imaginar uma situação parecida com um jogo de “acertar o ponto mais baixo de um terreno”. Pense que temos dois grupos: usuários e itens como filmes, músicas e produtos. Cada um deles tem um conjunto de números que representam suas preferências ou características. O que o ALS faz é o seguinte, primeiro, ele fixa as informações dos itens e tenta ajustar os dados dos usuários para que combinem melhor, depois, ele faz o contrário: fixa os dados dos usuários e ajusta os itens e assim vai, alternando entre um e outro, como uma dança. Visualmente, imagine uma montanha ou uma colina. Queremos achar o ponto mais baixo, onde o erro é o menor possível. Mas, em vez de descer em qualquer direção, só podemos andar primeiro para frente ou para trás, ajustando os usuários, e depois para os lados, ajustando os itens. A cada passo, chegamos um pouco mais perto do ponto mais baixo. Daí esse processo vai se repetindo até que os dois lados, usuários e itens, estejam bem ajustados e a gente tenha uma boa previsão das preferências. 2.14.4 Aplicando seus conhecimentos Neste exercício, será implementado um algoritmo de fatoração de matrizes utilizando o método ALS. Considerando uma matriz de avaliações R, onde as linhas representam usuários e as colunas representam itens, o algoritmo vai alternar entre a atualização das matrizes de usuários (U) e itens (I). O objetivo é preencher os valores ausentes da matriz de avaliações com uma aproximação das interações reais entre usuários e itens. O código a seguir apresenta a implementação do ALS, com uma matriz de avaliação inicial que contém alguns valores ausentes. Através da decomposição dessa matriz em dois 135
CAPÍTULO 2. APRENDIZAGEM NÃO-SUPERVISIONADA E SISTEMAS DE RECOMENDAÇÃO fatores latentes, podemos aproximar as avaliações faltantes, realizando uma recomendação baseada nas interações já conhecidas. O treinamento é realizado por várias iterações até que as matrizes convirjam para uma solução que melhor represente as preferências dos usuários em relação aos itens disponíveis. Copie e Teste! import numpy as np # 1. Matriz R (4 usuários x 3 itens), com np.nan indicando valores ausentes R = np.array([ [5, 3, np.nan], [4, np.nan, np.nan], [1, 1, np.nan], [np.nan, 2, 5] ]) num_users, num_items = R.shape num_factors = 2 # Número de fatores latentes # 2. Inicialização aleatória das matrizes U e I np.random.seed(42) U = np.random.rand(num_users, num_factors) # matriz de usuários (4x2) I = np.random.rand(num_items, num_factors) # matriz de itens (3x2 ) print("Matriz R (original):\n", R) print("\nMatriz U (inicial):\n", U) print("\nMatriz I (inicial):\n", I) # 3. Número de iterações de treinamento num_iterations = 100 # Definindo o número de iterações de treinamento for iteration in range(num_iterations): # Atualiza U for uin range(num_users): rated_items = ~np.isnan(R[u, :]) I_rated = I[rated_items] R_rated = R[u, rated_items] if len(R_rated) == 0: continue # Usuário não avaliou nada A = I_rated.T @ I_rated V = I_rated.T @ R_rated U[u], _, _, _ = np.linalg.lstsq(A, V, rcond=None) # Atualiza I 136
CAPÍTULO 3. APRENDIZAGEM POR REFORÇO 1. Observação do ambiente: o agente, seja um robô ou programa, identifica o estado atual em que se encontra. 2. Tomada de ação: com base em sua estratégia, conhecida como política, o agente decide qual ação executar naquele momento. 3. Resposta do ambiente: após a ação, o ambiente retorna uma nova situação, um novo estado e uma recompensa, que pode ser positiva (indicando um bom desempenho) ou negativa (sinalizando uma má escolha). 4. Atualização da política: com base na resposta recebida, o agente ajusta seus parâmetros internos para aumentar suas chances de tomar boas decisões no futuro. Com o tempo e após muitas tentativas, o agente aprende quais caminhos levam a melhores resultados, ou seja, quais ações maximizam a soma total das recompensas ao longo do tempo. Um ponto crucial da aprendizagem por reforço é a recompensa atrasada. Em muitos cenários, a consequência real de uma ação só pode ser avaliada ao final de uma sequência de decisões. Por exemplo, em uma partida de xadrez, o agente só descobre se foi bem-sucedido ao ganhar ou perder o jogo, o que só ocorre no fim. Assim, um dos maiores desafios desse tipo de aprendizagem é atribuir valor às ações intermediárias mesmo quando a recompensa só chega lá na frente. 3.1.2 Onde é aplicado? A Aprendizagem por Reforço tem uma variedade enorme de aplicações. Na indústria de jogos eletrônicos, é comum usar esses algoritmos para criar adversários virtuais mais inteligentes. Em sistemas de recomendação, é possível usar técnicas de Reforço para sugerir conteúdos ao usuário com base em suas interações, por exemplo, quanto tempo ele assiste a um determinado vídeo ou quantos cliques em um site. Outro exemplo interessante é a robótica, em que robôs aprendem tarefas complexas, como dobrar roupas ou organizar peças, a partir de repetidos experimentos. Apesar de requerer um número considerável de tentativas e muitas vezes grandes recursos computacionais, a Aprendizagem por Reforço oferece uma maneira poderosa de lidar com problemas em que não há um conjunto de respostas prontas para cada situação. Ela se mostra ideal para cenários dinâmicos, onde há interação contínua com o ambiente e onde errar faz parte natural do processo de aprendizado. A grande motivação por trás desse campo está na possibilidade de alcançar resultados surpreendentes em problemas que dependem muito da experiência prática, algo que nem sempre está disponível em outros métodos de aprendizado de máquina. Como veremos nos próximos tópicos, o sucesso em Aprendizagem por Reforço depende de noções básicas de probabilidade, estatística, algoritmos e, sobretudo, de uma mentalidade experimental, em que a exploração e a coragem de errar são partes importantes do caminho para o acerto. 3.1.3 Agente e Ambiente No contexto da aprendizagem por reforço, o mundo é dividido em duas partes fundamentais: agente e ambiente. Em sistemas de decisão sequenciais, Russell e Norvig (2010) apontam que a distinção entre agente e ambiente é fundamental para modelar interações. O agente é o ”aluno”do processo de aprendizagem, é ele quem executa ações, observa as consequências dessas ações e ajusta seu comportamento com o objetivo de melhorar seu desempenho 143
CAPÍTULO 3. APRENDIZAGEM POR REFORÇO ao longo do tempo. O ambiente, por sua vez, representa tudo o que está fora do controle do agente e com o qual ele interage. É o ambiente que responde às ações do agente, fornecendo recompensas ou penalidades e atualizando o estado observado. Uma forma simples de visualizar essa relação é imaginar o agente como um jogador interagindo com um tabuleiro, que representa o ambiente. A cada jogada, o agente observa o estado atual do tabuleiro, escolhe uma ação e recebe um retorno, que pode ser uma recompensa ou penalidade, além da informação sobre o novo estado resultante. O grande desafio e objetivo do agente é descobrir, por tentativa e erro, uma sequência de ações que leve à maximização da recompensa total ao longo do tempo. 3.1.4 Estado O estado (state) representa a situação em que o agente se encontra em um determinado momento. Pode ser algo bastante simples, como a posição do robô no labirinto. Em aplicações mais complexas, o estado pode englobar diversas variáveis, como velocidade de um carro autônomo, distância até um obstáculo ou até mesmo informações sobre outros agentes em um jogo multijogador. Em termos formais, cada estado spertence a um conjunto de estados possíveis, muitas vezes denotado por S. No entanto, para entender intuitivamente: O estado é a representação da situação atual do ambiente observada pelo agente, é a base sobre a qual ele decide qual ação tomar. Essa representação pode variar bastante dependendo do problema. No caso do labirinto, o estado pode ser simplesmente as coordenadas do robô dentro do mapa. Em um jogo de xadrez, o estado corresponde à configuração completa das peças sobre o tabuleiro, refletindo a posição e o tipo de cada peça. Já em um carro autônomo, o estado é muito mais complexo e pode incluir informações como a posição e velocidade do veículo, a presença de pedestres, sinais de trânsito, obstáculos e até condições climáticas. A qualidade dessa representação é essencial, pois determina o quanto o agente consegue perceber e reagir ao ambiente de forma eficaz. 3.1.5 Ação A ação (action) é o controle que o agente possui sobre o ambiente. É a decisão que ele toma a cada passo. No labirinto, as ações possíveis podem ser “mover para cima”, “mover para baixo”, “mover para a esquerda” ou “mover para a direita”. Em aplicações mais complexas (por exemplo, em robótica), as ações podem envolver girar articulações de um braço mecânico ou alterar a aceleração de um carro autônomo. Normalmente, em aprendizagem por reforço, cada estado stem associado um conjunto de possíveis ações A(s). Em um contexto formal, podemos dizer: Se o agente se encontra no estado s, então ele pode escolher uma ação a∈A(s). Em muitos casos simples, assumimos que o conjunto de ações disponíveis é o mesmo para todos os estados, mas isso pode variar de acordo com o problema. 3.1.6 Recompensa A recompensa é o sinal numérico que indica ao agente o quão boa (ou ruim) foi uma ação em determinado estado, ela é essencial para guiar o processo de aprendizagem. No labirinto, por exemplo, o agente pode receber +10 pontos ao alcançar a saída e -1 ponto sempre que colidir com uma parede, incentivando caminhos eficientes e evitando erros. Em um jogo de 144
CAPÍTULO 3. APRENDIZAGEM POR REFORÇO tabuleiro, a recompensa pode ser mais global: atribuída apenas ao final da partida, como +1 em caso de vitória, -1 em caso de derrota e 0 para empates, exigindo que o agente aprenda estratégias de longo prazo. Já em um sistema de controle de temperatura, a recompensa pode ser contínua, sendo negativa quando a temperatura se desvia do intervalo ideal epositiva quando se mantém estável, promovendo ajustes constantes. Cada tipo de problema exige uma forma específica de definir recompensas, e a maneira como elas são distribuídas influencia diretamente a velocidade e a qualidade do aprendizado. Essa sinalização de “bom” ou “ruim” fornecida pela recompensa é o que orienta o processo de aprendizagem do agente. Diferentemente de outros métodos de aprendizagem de máquina, em que trabalhamos com dados rotulados ou não-rotulados, a aprendizagem por reforço conta principalmente com a informação dada pela recompensa para ajustar o comportamento do agente. 3.1.7 Política A política (policy) descreve como o agente escolhe suas ações para cada estado em que se encontrar. É, em essência, a estratégia ou a “regra de decisão” do agente. Podemos pensar na política como uma função πque, para cada estado s, indica qual ação adeve ser tomada: π(s) = a(ação escolhida para o estado s) Dependendo do método de aprendizagem, a política pode ser determinística (o agente tem sempre uma ação específica para cada estado) ou estocástica (o agente escolhe ações de acordo com certas probabilidades associadas a cada estado). Em qualquer dos casos, o que o agente busca é ajustar πpara maximizar a recompensa total esperada, ao longo de várias interações. Uma maneira de pensar na política é vê-la como um conjunto de “instruções” que o agente consultaria a cada momento para saber qual ação executar. Conforme aprende, essas instruções vão sendo afinadas até que se torne possível, com sorte, alcançar o maior ganho possível de recompensas. 3.1.8 Markov Decision Processes 145
CAPÍTULO 3. APRENDIZAGEM POR REFORÇO Em um nível mais formal, costuma-se modelar problemas de aprendizagem por reforço como Processos de Decisão de Markov (Markov Decision Processes, ou MDPs). Um MDP é definido por um conjunto de estados S, um conjunto de ações A, uma função de transição de probabilidade Pque descreve a probabilidade de ir para um estado s′quando se executa a ação ano estado se uma função de recompensa R. No entanto, para muitos problemas, a formulação intuitiva “estado →ação →recompensa + próximo estado” já é suficiente para compreender a essência do aprendizado. Fique Alerta! Em MDPs grandes, o grafo fica imenso. Nesses casos, usa-se amostragem ou abstrações (agrupamento de estados) para simplificar a visualização. 3.1.9 Aplicando seus conhecimentos Ao iniciar sua jornada no campo da aprendizagem por reforço, é interessante trabalhar com cenários simples de tentativa e erro, como labirintos. O código abaixo permite simular o comportamento de um agente que navega por um labirinto, aprendendo a encontrar o objetivo enquanto recebe recompensas durante o processo. Essa abordagem oferece uma excelente oportunidade para entender melhor o papel das políticas na aprendizagem por reforço e como elas influenciam o comportamento do agente. Copie e Teste! import random import matplotlib.pyplot as plt import matplotlib.patches as patches from IPython.display import clear_output # Labirinto padrão representado por uma matriz labirinto_default = [ ['S','.','.','#','.'], ['.','#','.','.','.'], ['.','#','G','#','.'], ['.','.','.','.','.'], ['#','.','#','.','.'] ] # Variáveis globais labirinto = [] inicio = (0, 0) objetivo = (2, 2) ações = ['cima','baixo','esquerda','direita'] # Função para inicializar o labirinto def inicializar_labirinto(): global labirinto labirinto = [linha[:] for linha in labirinto_default] # Copia o labirinto padrão 146
CAPÍTULO 3. APRENDIZAGEM POR REFORÇO return labirinto # Função para desenhar o labirinto def desenhar_labirinto(): fig, ax = plt.subplots() for iin range(5): for jin range(5): if labirinto[i][j] == '#': ax.add_patch(patches.Rectangle((j, 4 - i), 1, 1, color='black')) elif labirinto[i][j] == 'S': ax.add_patch(patches.Rectangle((j, 4 - i), 1, 1, color='green')) elif labirinto[i][j] == 'G': ax.add_patch(patches.Rectangle((j, 4 - i), 1, 1, color='gold')) else: ax.add_patch(patches.Rectangle((j, 4 - i), 1, 1, edgecolor='gray', facecolor='white')) ax.set_xlim(0, 5) ax.set_ylim(0, 5) ax.set_aspect('equal') ax.axis('off') plt.show() # Função para atualizar o labirinto com a escolha do usuário def atualizar_labirinto(x, y, tipo): global labirinto, inicio, objetivo if tipo == 'inicio': labirinto[inicio[0]][inicio[1]] = '.' # Remove o marcador do início anterior inicio = (x, y) labirinto[x][y] = 'S' elif tipo == 'objetivo': labirinto[objetivo[0]][objetivo[1]] = '.' # Remove o marcador do objetivo anterior objetivo = (x, y) labirinto[x][y] = 'G' elif tipo == 'parede': labirinto[x][y] = '#' desenhar_labirinto() # Função para definir se a posição é válida def pos_valida(pos): x, y = pos return 0 <= x < 5 and 0 <= y < 5 and labirinto[x][y] != '#' # Função para mover o agente 147
CAPÍTULO 3. APRENDIZAGEM POR REFORÇO def mover(pos, ação): x, y = pos if ação == 'cima': x -= 1 elif ação == 'baixo': x += 1 elif ação == 'esquerda': y -= 1 elif ação == 'direita': y += 1 nova_pos = (x, y) return nova_pos if pos_valida(nova_pos) else pos # Função para calcular a recompensa def recompensa(pos): if pos == objetivo: return 10 elif labirinto[pos[0]][pos[1]] == '#': return -5 else: return -1 # Função para visualizar o caminho percorrido def visualizar_caminho(caminho, recompensa_total, numero_passos): fig, ax = plt.subplots(figsize=(6, 6)) for iin range(5): for jin range(5): if labirinto[i][j] == '#': ax.add_patch(patches.Rectangle((j, 4 - i), 1, 1, color='black')) elif labirinto[i][j] == 'S': ax.add_patch(patches.Rectangle((j, 4 - i), 1, 1, color='green')) elif labirinto[i][j] == 'G': ax.add_patch(patches.Rectangle((j, 4 - i), 1, 1, color='gold')) else: ax.add_patch(patches.Rectangle((j, 4 - i), 1, 1, edgecolor='gray', facecolor='white')) # Novo: mapa para registrar quantas vezes cada posição foi visitada visitas = {} for idx, (x, y) in enumerate(caminho): pos = (x, y) count = visitas.get(pos, 0) deslocamento_x = (count % 3 - 1) * 0.2 deslocamento_y = ((count // 3) % 3 - 1) * 0.2 ax.text(y + 0.5 + deslocamento_x, 4 - x + 0.5 + deslocamento_y, str(idx), 148
CAPÍTULO 3. APRENDIZAGEM POR REFORÇO ha='center', va='center', fontsize=10, color='blue ') visitas[pos] = count + 1 # Incrementa a contagem da posição ax.set_xlim(0, 5) ax.set_ylim(0, 5) ax.set_aspect('equal') ax.axis('off') # Colocando a legenda abaixo do labirinto ax.legend([f"Recompensa total: {recompensa_total}", f"Passos: {numero_passos-1}"], loc='upper center', bbox_to_anchor=(0.5, -0.02), ncol=2) plt.show() # Função para executar o episódio com a política aleatória def executar_episodio(politica='aleatoria', max_passos=30, mostrar =False): pos = inicio total_recompensa = 0 caminho = [pos] for _in range(max_passos): if politica == 'aleatoria': ação = random.choice(ações) nova_pos = mover(pos, ação) r = recompensa(nova_pos) total_recompensa += r pos = nova_pos caminho.append(pos) if pos == objetivo: break if mostrar: visualizar_caminho(caminho, total_recompensa, len(caminho) ) return total_recompensa, len(caminho), caminho # Função para rodar as simulações def rodar_simulacoes(num_episodios=2): clear_output(wait=True) politica = 'aleatoria' print(f"\nPolítica: {politica.upper()}") for _in range(num_episodios): 149
CAPÍTULO 3. APRENDIZAGEM POR REFORÇO r, passos, caminho = executar_episodio(politica, mostrar= True) # Inicializar o labirinto e rodar simulações inicializar_labirinto() rodar_simulacoes(2) # Executar 2 episódios Resultado Esperado Política: ALEATORIA Figura 3.2: Resultados de dois episódios de navegação aleatória no labirinto. Recompensa total: -30, Passos: 30 Recompensa total: -30, Passos: 30 No código, o labirinto é representado por uma matriz 5x5. Embora essa política seja simples, ela demonstra como o agente realiza escolhas baseadas nas recompensas recebidas, explorando o ambiente de maneira aleatória. A função de recompensa, que define as recompensas recebidas em diferentes estados, está assim configurada: def recompensa(pos): if pos == objetivo: return 10 elif labirinto[pos[0]][pos[1]] == '#': return -5 else: return -1 150
CAPÍTULO 3. APRENDIZAGEM POR REFORÇO Ao ajustar os valores ou a lógica dentro dessa função, por exemplo, alterando a recompensa ao passar por obstáculos ou ao encontrar o objetivo, você pode observar como isso afeta as decisões do agente, potencialmente fazendo com que ele aprenda a explorar o ambiente de maneira mais eficiente. Após a execução do código, o comportamento do agente é guiado pela política definida, que, neste caso, é aleatória. A política é implementada neste trecho: if politica == 'aleatoria': ação = random.choice(ações) Você pode modificar o comportamento do agente escolhendo diferentes políticas ou alterando a lógica de como as ações são selecionadas. Além disso, o código permite definir um número máximo de passos para cada episódio, o que pode ser ajustado no parâmetro max_passos da função executar_episodio. Para limitar o tempo de exploração do agente, por exemplo, basta reduzir esse número: r, passos, caminho = executar_episodio(politica, max_passos=20, mostrar=True) Por fim, você pode modificar o número de episódios executados na simulação ajustando o valor passado para a função rodar_simulacoes(). Por exemplo, ao chamar rodar_simulacoes(2), o agente executará 2 episódios. Se você quiser testar com mais ou menos episódios, basta alterar esse número. A quantidade de episódios pode influenciar o comportamento do agente, pois ele terá mais ou menos oportunidades de explorar e aprender no labirinto. rodar_simulacoes(10) Pronto! Agora você pode experimentar e entender melhor como o agente reage em diferentes cenários. Ao ajustar as variáveis, como as recompensas, políticas e número de passos, você verá como isso afeta o comportamento do agente e o processo de aprendizado. Continue explorando e modificando os parâmetros para aprofundar ainda mais sua compreensão sobre os conceitos de exploração, recompensa e aprendizado. Quanto mais você testar e ajustar, mais eficaz será o seu aprendizado sobre como os agentes funcionam em problemas de aprendizagem por reforço! 3.2 Funções de Valor Iniciando o diálogo... Imagine que você está treinando um robô para navegar por um labirinto em busca de recompensas. Como podemos medir “quão bom” é cada posição do labirinto, ou “quão boa” é cada ação que o robô pode tomar? É aqui que entram as funções de valor, ferramentas essenciais na aprendizagem por reforço para avaliar estados e ações ao longo do tempo. 3.2.1 Função de Valor de Estado V(s) A função de valor de estado, Vπ(s), estima o retorno esperado (soma descontada de recompensas) ao começar no estado se seguir uma política π. 151
CAPÍTULO 3. APRENDIZAGEM POR REFORÇO Definição formal: Vπ(s) = Eπ"∞ X t=0 γtrt+1 |s0=s# onde: •rt+1 é a recompensa recebida ao transitar do passo tpara t+ 1, •γ∈[0,1) é o fator de desconto, que prioriza recompensas mais próximas, • a expectativa Eπé tomada sobre trajetórias geradas pela política π. Fique Alerta! Vπ(s)depende da política π. Se πmudar, seus valores também mudam. O fator γcontrola o “horizonte” de planejamento: γ→0foca em recompensas imediatas; γ→1valoriza mais o longo prazo. 3.2.2 Função de Valor de Ação Enquanto V(s)avalia estados, a função de valor de ação,Qπ(s, a), avalia pares estadoação. Ela responde à pergunta: “Se estou em se escolho a, qual o retorno esperado ao seguir πa partir daí?” Definição formal Qπ(s, a) = Eπ"∞ X t=0 γtrt+1 |s0=s, a0=a# Caso Prático Em um labirinto simples 2×2, suponha que o robô possa escolher entre quatro ações: mover-se para o Norte (N), Sul (S), Leste (L) ou Oeste (O). Os estados possíveis em que o robô pode se encontrar, por exemplo, podem ser A, B e assim por diante. A função de valor de ação avalia qual o retorno esperado ao tomar uma determinada ação em um estado específico. Para representar isso, podemos montar uma tabela em que as linhas correspondem aos estados e as colunas às ações. Cada célula da tabela contém o valor de Qπ(s, a), ou seja, o valor esperado de tomar a ação ano estado s. Por exemplo, uma tabela poderia ser: N S L O A 0.8 0.1 0.5 0.2 B 0.7 0.4 0.3 0.9 Essa tabela está te dizendo o seguinte: • Se você está no estado A e toma a ação N, o valor do retorno é 0.8 • Se está no estado B e toma a ação O, o valor esperado é 0.9 A função de valor de ação Qπ(s, a)mede quão boa é uma ação específica em um estado específico. Ela te ajuda a escolher a melhor ação possível a partir de um estado. 152