- View
2.2 Programação baseada em dados
A importância de grandes quantidades de dados na Machine Learning
No domínio da Machine Learning (ML), os dados são muitas vezes referidos como o "combustível" que alimenta algoritmos e modelos. A eficácia e a precisão dos sistemas de ML dependem fortemente da disponibilidade de grandes quantidades de dados de alta qualidade. Esta seção enfatiza a importância dos dados em ML, introduz o conceito de programação orientada por dados e explica conceitos fundamentais, como conjuntos de dados, instâncias, atributos, variáveis de entrada e modelos.
O papel dos dados na Machine Learning
Os dados servem como base sobre a qual os modelos de ML são construídos. Sem dados suficientes, os algoritmos não podem aprender padrões ou fazer previsões de forma eficaz. A importância de grandes conjuntos de dados pode ser resumida nos seguintes pontos:
- Aprender com exemplos: A ML baseia-se, essencialmente, em aprender a partir de exemplos. Grandes conjuntos de dados oferecem uma variedade diversificada de exemplos que auxiliam os algoritmos a reconhecer padrões e relações presentes na informação.
- Precisão aprimorada: Modelos treinados com conjuntos de dados maiores tendem a generalizar melhor para dados nunca antes vistos, resultando em previsões mais precisas. Isto é especialmente importante em aplicações como diagnóstico na área da saúde ou previsão financeira, onde a fiabilidade das previsões é fundamental.
- Robustez: Um conjunto de dados abrangente, que inclui diversos cenários, permite aos modelos lidar de forma mais eficaz com casos extremos e anomalias. Esta robustez é essencial em aplicações do mundo real, onde os dados podem ser ruidosos ou incompletos.
- Representação de características: Grandes conjuntos de dados permitem extrair características relevantes que podem melhorar consideravelmente o desempenho do modelo. Com mais dados, os algoritmos conseguem aprender representações complexas que captam as tendências subjacentes.
- Mitigação do Overfitting: Ter uma quantidade substancial de dados de treino ajuda a evitar o overfitting, uma situação em que o modelo aprende o ruído dos dados em vez de captar os padrões reais. Um conjunto de dados mais alargado permite uma aproximação mais fidedigna à distribuição real dos dados, promovendo uma melhor capacidade de generalização por parte do modelo.
Programação orientada por dados
Programação orientada por dados é uma abordagem que enfatiza o uso dos dados como principal motor para a tomada de decisões e desenvolvimento de algoritmos. Neste paradigma, os programadores focam-se em recolher, analisar e utilizar dados para orientar as suas práticas de codificação, em vez de depender exclusivamente de regras ou lógica predefinidas.
Por que precisamos de programação orientada por dados
- Adaptabilidade: A programação baseada em dados permite que os sistemas se adaptem às condições em mudança, aprendendo continuamente com novas entradas de dados.
- Tomada de decisão aprimorada: Ao utilizar grandes conjuntos de dados, os programadores conseguem desenvolver algoritmos mais informados, que conduzem a resultados mais eficazes.
- Automação: As abordagens baseadas em dados facilitam a automação, permitindo que as máquinas aprendam com dados históricos e realizem previsões sem necessidade de intervenção humana.
- Escalabilidade: À medida que mais dados se tornam disponíveis, os sistemas conseguem escalar os seus recursos sem necessidade de alterações significativas na arquitetura subjacente.
Conceitos Básicos de Machine Learning
1. Conjunto de dados
Um conjunto de dados é uma coleção estruturada de dados usada para treinar modelos de aprendizado de máquina. Consiste em várias instâncias (pontos de dados) organizadas em linhas e colunas, onde cada coluna representa um atributo ou recurso.
2. Instância
Uma instância refere-se a um único registro ou observação dentro de um conjunto de dados. Cada instância contém valores para vários atributos que descrevem suas características.
3. Atributo
Os atributos são variáveis ou características individuais que descrevem uma instância num conjunto de dados. Podem ser numéricos (por exemplo, idade, salário) ou categóricos (por exemplo, sexo, cor). Os atributos são fundamentais para definir o espaço de entrada utilizado pelos algoritmos de ML.
4. Variáveis de entrada
As variáveis de entrada são atributos específicos usados como preditores num modelo de ML. Fornecem as informações necessárias para que o modelo identifique padrões e consiga fazer previsões sobre as variáveis de saída (também chamadas de variáveis-alvo ou metas).
5. Variáveis de saída
As variáveis de saída são os valores-alvo que o modelo pretende prever com base nas variáveis de entrada. Por exemplo, num modelo de previsão do preço de habitação, as variáveis de entrada podem incluir a área útil e a localização, enquanto a variável de saída será o preço estimado da habitação.
O conceito de um modelo
Na ML, um modelo é uma representação matemática que estabelece uma relação entre variáveis de entrada e variáveis de saída, com base em padrões aprendidos a partir dos dados de treino. O processo envolve várias etapas:
-
Treino: Durante o treino, o modelo aprende a partir de instâncias rotuladas no conjunto de dados, ajustando os seus parâmetros para minimizar os erros de previsão.
-
Mapeamento: Uma vez treinado, o modelo consegue receber novas variáveis de entrada e gerar previsões correspondentes com base nos padrões aprendidos.
-
Avaliação: O desempenho do modelo é avaliado através de métricas como acurácia, precisão, recall e pontuação F1, geralmente aplicadas a conjuntos de validação ou teste.
A importância de dispor de grandes quantidades de dados adequados na ML não pode ser subestimada. É essencial para treinar modelos eficazes, capazes de realizar previsões precisas em aplicações do mundo real. A programação orientada por dados surge como uma metodologia fundamental, que aproveita essa abundância de dados para apoiar o desenvolvimento de algoritmos e os processos de tomada de decisão.
A compreensão de conceitos fundamentais como conjuntos de dados, instâncias, atributos, variáveis de entrada, variáveis de saída e modelos estabelece as bases para uma exploração mais aprofundada das técnicas de ML e das suas aplicações em diversos domínios.
À medida que continuamos a explorar o poder dos dados na ML, é imperativo priorizar práticas de recolha e gestão de dados de qualidade, de forma a garantir resultados robustos e fiáveis em sistemas de inteligência artificial.
Vamos começar com um desafio...
Imagina um quebra-cabeças. Tenta descobrir, a partir dos números apresentados na coluna da esquerda (vamos chamá-los de entradas), como se relacionam com os números da coluna da direita (as saídas). Que padrão consegues identificar?
|
Entrada |
Saída |
|---|---|
|
1 , 9, 5, 4 |
19 |
|
3 , 8, 11 |
22 |
|
6 , 7, 9, 2, 2 |
26 |
|
2 , 3, 6 |
11 |
Assumimos que esta tarefa não lhe causou grande dificuldade e que, logo na segunda ou terceira linha da tabela, surgiu a ideia de que os números na segunda coluna — ou seja, a saída — representam a soma dos números que estão na coluna da esquerda, ou seja, a entrada.
Para esta tarefa, também já saberá como escrever um algoritmo (mesmo que de olhos semicerrados!) que o conduza à solução.
Por exemplo, na linguagem de programação Python, podemos calcular a soma dos elementos da lista [1, 9, 5, 4] começando por declarar a soma como zero e, em seguida, adicionando um elemento de cada vez até chegarmos ao final da lista:
numbers = [1, 9, 5, 4]
sum = 0
for element in numbers:
sum = sum + element
(A função integrada de soma calcula isso rapidamente por nós — e, na verdade, é a que usamos com mais frequência.)
Agora experimente resolver o próximo desafio: neste quebra-cabeças, terá de descobrir como as entradas e as saídas estão relacionadas.
Desta vez, as entradas são imagens de animais, e as saídas são os números 0 ou 1.
|
Input |
Output |
|
|
1 |
|
|
0 |
|
|
0 |
|
|
1 |
|
|
0 |
Certamente que lhe ocorreram muitas ideias — e é bem possível que todas sejam válidas!
No entanto, como os uns (1) aparecem ao lado das fotos dos gatos, e os zeros (0) ao lado das restantes fotos de animais, pretendíamos que chegasse à conclusão de que esta é uma tarefa em que precisa de reconhecer se há ou não um gato na imagem.
Ou seja:
Se houver um gato na imagem de entrada, o valor de saída será 1;
Se não houver um gato na imagem de entrada, a saída será 0.
Verá, um pouco mais adiante, que este tipo de problema se chama tarefa de classificação binária — e é extremamente comum no campo da ML.
Será possível criar um algoritmo para resolver este problema? Concordará que é importante sermos capazes de identificar o que está nas imagens, pois isso facilita a sua pesquisa e análise.
Poderá tentar elaborar uma lista de dezenas de regras para determinar se há um gato na imagem ou não. Não se esqueça de considerar aspetos como o fundo, a iluminação, o ângulo de visão, bem como o facto de existirem mais de 50 tipos diferentes de gatos.
Na verdade, existem muitos problemas como este em que, mesmo que nos esforcemos (imagine nomear 1000 regras!), não conseguimos escrever algoritmos que os resolvam com precisão. Outros exemplos incluem a tradução de um idioma para outro e a deteção de rostos em fotografias.
Concordará que estas tarefas também são importantes, pois nos permitem compreender conteúdos escritos numa língua que não falamos ou melhorar a segurança.
É por isso que estes problemas são descritos através de conjuntos de dados — pares de entradas e saídas esperadas — e são resolvidos por técnicas de programação orientada por dados.
No caso da tarefa de reconhecimento de gatos (e de qualquer outro objeto), um conjunto de dados adequado pode ser organizado de forma semelhante ao nosso exemplo, com imagens como entradas e valores 0 ou 1 como saída.
Para uma tarefa de tradução, os pares podem ser frases em ambas as línguas, enquanto numa tarefa de deteção facial, podem ser pares de imagens — uma sem rostos marcados como entrada e outra com os rostos assinalados como saída.
Aqui está um exemplo.
|
Input |
Output |
|---|---|
|
|
|
Os conjuntos de dados que utilizamos para descrever problemas podem ser criados a partir de atividades do dia a dia. Por exemplo, após examinar um paciente no seu registo digital, um médico regista informações sobre o paciente, como idade, sexo, sintomas e alergias a medicamentos — todos estes valores constituem as entradas — e o código correspondente ao seu diagnóstico, que será a saída.
De forma semelhante, nos aeroportos, para cada voo, são conhecidas informações como a hora de partida, a companhia aérea, o tipo de avião, entre outras — todas estas como entradas — e a informação sobre se o voo sofreu ou não atraso, que corresponde à saída.
Os conjuntos de dados também podem ser criados especificamente para resolver uma tarefa específica. Por exemplo, o conjunto de dados que usamos para identificar gatos poderia ter sido criado por uma equipe de voluntários que olharam para as imagens que tínhamos e seguiram nossas diretrizes, por exemplo, se houver um gato na imagem, escreva 1, escreva 0, digite 1 ou 0 na coluna de saída. Para conjuntos de dados de domínio, por exemplo, reconhecendo mudanças em raios-X, especialistas médicos precisariam ser contratados que tenham as habilidades e conhecimentos apropriados para tomar decisões. Um pouco mais tarde, você aprenderá mais sobre como os conjuntos de dados são criados.
Provavelmente estará a perguntar-se: como é que aprendemos a ligação entre a entrada e a saída num conjunto de dados?
Assim como existe uma área dedicada ao desenvolvimento de algoritmos clássicos de programação e à análise das suas propriedades, também existe uma área focada no desenvolvimento de algoritmos orientados por dados e no estudo das suas características. Esta área chama-se ML (ou machine learning).
A ML está no centro de todas as áreas modernas da inteligência artificial, pois está intimamente ligada aos dados e às formas de extrair conhecimento a partir deles.
Na próxima lição, a ML responderá à questão que mais lhe interessa.
É importante ressalvar que existem outras áreas que lidam com dados. Entre elas, a mais antiga é certamente a estatística, um ramo da matemática que trata da recolha, descrição e análise de dados, bem como da extração de conclusões a partir desses dados. As técnicas estatísticas estão na base de muitos algoritmos de ML.
A Ciência de Dados é uma disciplina que surgiu devido à incapacidade das áreas individuais responderem a muitas questões complexas. Por exemplo, todas as empresas enfrentam o desafio de como melhorar os seus serviços. Para isso, podem analisar os comentários dos utilizadores nas redes sociais ou em sites de vendas.
Para processar estes comentários, é necessário recolhê-los num único local e armazená-los numa base de dados, organizá-los — por exemplo, separando comentários positivos e negativos — e, depois, analisar cada um desses conjuntos com maior detalhe, para determinar o que os utilizadores consideram negativo ou positivo, como um modelo específico de produto ou alguma funcionalidade.
Esta informação deve ser partilhada com a direção da empresa, para que esta possa decidir os próximos passos.
A resposta à questão inicial é, como vê, extensa e requer conhecimentos e ferramentas para descarregar conteúdo da web (os chamados scrapers), trabalhar com bases de dados, processamento de linguagem natural, assim como técnicas de visualização de dados que sejam claras e úteis para os especialistas na área.
Em todos estes exemplos, a ML é uma parte indispensável do percurso para o conhecimento.
Antes de prosseguirmos, vamos resumir como é a resolução de problemas com a programação clássica e a programação orientada por dados.
Quando resolvemos um problema usando técnicas clássicas de programação, por exemplo, encontrando o maior elemento em uma sequência de números, primeiro pensamos no problema e nas restrições espaciais e temporais que temos, depois projetamos um algoritmo para resolvê-lo (por exemplo, merge sorting), e então o programamos em uma linguagem de programação e salvamos o código. Verificamos a precisão da implementação em algumas entradas aleatórias até nos certificarmos de que tudo funciona exatamente como esperamos.
Quando precisamos classificar uma nova string, podemos usar o programa que escrevemos, executá-lo e obter a solução apropriada.
Quando dependemos da programação orientada por dados, inicialmente temos apenas dados — por exemplo, milhares de pares de entradas e saídas. Mais uma vez, é sensato pensar primeiro no problema. É isso que fazemos agora, ao conhecer o conjunto de dados.
Para isso, utilizamos técnicas de análise exploratória de dados, que serão discutidas mais à frente no curso, e que nos podem dar uma ideia de que caminho seguir para encontrar uma solução.
Em vez de criar um algoritmo que resolva diretamente o problema, projetamos um algoritmo que aprende a resolver o problema.
Isto significa que, se precisarmos de aprender a ligação entre entrada e saída, e alterarmos o conjunto de dados, o algoritmo pode voltar a encontrar a melhor ligação entre eles.
A ligação que existe entre entrada e saída depende dos dados (não é algo fixo!), e, por isso, é necessário aprendê-la — não a definimos diretamente.
Quando projetamos e programamos um algoritmo deste tipo, precisamos de usar os dados para avaliar o seu funcionamento.
Se os resultados não forem satisfatórios, temos de recuar e corrigir o algoritmo, ou até regressar ao início para verificar se há algo mais nos dados que possa ser importante para resolver o problema.
Ao contrário da programação clássica, esta iteratividade está muito presente na programação orientada por dados.






