Aprendizado de máquina (do inglês, Machine Learning) é a subárea da Inteligência Artificial (IA) dedicada a estudar como os computadores podem aprender a executar tarefas sem que essas tarefas tenham sido explicitamente programadas no computador. Essa área se baseia na forma como nós seres humanos aprendemos. Algum dia, alguém chegou perto de você e lhe disse:

  • “Este é o Mickey; aquela é a Minnie.”;
  • “Isso é uma maçã; aquilo é uma laranja.”;
  • “Esses símbolos no papel são letras; aqueles outros são números.”; e coisas desse tipo.

Depois de tanto observar essas diferenças, você sabe distinguir tudo isso e talvez nem se lembre do momento em que aprendeu. Ou seja, aprendemos com base em informações que nos são passadas sobre determinado assunto e qual é a resposta para aquilo.

Ainda assim, existem coisas que são difíceis para um ser humano aprender. As três flores da imagem principal desse texto são de uma espécie chamada Iris. Apesar disso, são de sub-espécies diferentes, sendo elas: Iris Setosa (à esquerda), Iris Versicolor (à direita e acima) e Iris Virginica (à direita e abaixo). Em 1936, o estatístico R.A. Fisher publicou um artigo em que apresentava dados sobre essas plantas com base em medidas de suas pétalas e sépalas. Neste texto, vamos estudar um pouco aprendizado de máquina e como implementar um programa que: 1) recebe as medidas de pétalas e sépalas como no estudo de R.A. Fisher; 2) aprende a identificar qual a sub-espécie correta; e 3) comprova o aprendizado com um teste.

Aprendizado Supervisionado e Aprendizado Não Supervisionado

Na IA, o aprendizado de máquina é classificado quanto à forma em que é executado, as classes de aprendizado de máquina mais mencionadas nos livros são: aprendizado supervisionado e aprendizado não supervisionado, que são descritos da seguinte forma:

  1. No aprendizado supervisionado, o sistema recebe um conjunto de dados com m observações, sendo que cada uma das observações possui n características (do inglês, features) e uma etiqueta (do inglês, label) que determina o que significam aquelas características (Figura 1). Como analogia, podemos comparar com quando estudamos com livros-texto e temos exercícios para fazer. às vezes temos também uma página de soluções para esses exercícios no final do livro. Podemos treinar com esses exercícios até que nos tornemos aptos para responder como o autor do livro nos ensina determinada disciplina. Depois disso, em algum momento somos testados para verificar se pudemos aprender. Ou seja, voltando à definição, usaremos uma fração de das m observações para treinar (digamos 66,66%) e o restante (neste caso, 33,33%) para testar se o sistema aprendeu.
    1. Ainda considerando o aprendizado supervisionado, se as etiquetas são dadas por valores discretos e finitos, dizemos que o problema é de classificação. Todos os exemplos do início do texto são dessa categoria.
    2. Por outro lado, se as etiquetas contém valores contínuos, o problema é de regressão. Um exemplo comum é tentar prever o valor de uma casa com base em características como metros quadrado, número cômodos, região onde o imóvel está localizado, etc.

      matriz
      Figura 1 – Representação de n características de m observações como uma matriz m x n. As etiquetas podem ser vistas como um vetor de tamanho m x 1.
  2. No aprendizado não supervisionado, o sistema também recebe um conjunto de dados com m observações, sendo n características por observação e queremos que o sistema aprenda algo sobre cada uma delas.
    1. Neste caso, o sistema não recebe etiquetas (as respostas para cada observação) e por isso uma forma de aprender é realizando agrupamentos (do inglês, clustering) de acordo com a similaridade de diferentes observações com base em suas características.
    2. Uma outra forma de aprendizado não supervisionado é usar a estimativa de densidade (do inglês, density estimation) dentro dos dados de entrada, i.e., tentar estimar como os dados aparecem, com que frequência, tentando descobrir as probabilidades de cada observação.

Faz parte da introdução de aprendizado de máquina eu mencionar o aprendizado não supervisionado, mas neste texto trataremos principalmente o problema de classificação do aprendizado supervisionado. Ao mesmo tempo, vou apresentando conceitos envolvidos e onde entra o Python nisso tudo.

Processo de aprendizado supervisionado por ajuste de parâmetros e seus desafios

O aprendizado de máquina supervisionado se baseia em um conjunto de técnicas para ajustar parâmetros de funções para que essas funções satisfaçam algumas condições que são dadas pelos valores das etiquetas. Quando temos esses parâmetros ajustados e já sabemos qual função estamos tentando calcular, dizemos que temos um modelo.

Para isso, os algoritmos de aprendizado de máquina realizam o ajuste do modelo (do inglês, model fit), que ocorre enquanto ele está sendo treinado com base nos dados para que se torne possível realizar previsões com o modelo (do inglês, model predict) conforme treinado usando as etiquetas. Com isso, podemos definir outros dois conceitos:

  • O sobreajuste (do inglês, overfit) ocorre quando o modelo se adaptou muito bem aos dados com os quais está sendo treinado; porém, não generaliza bem para novos dados. Ou seja, o modelo “decorou” o conjunto de dados de treino, mas não aprendeu de fato o que diferencia aqueles dados para quando precisar enfrentar novos testes.
  • Por outro lado, o sub-ajuste (do inglês, underfit) ocorre quando o modelo não se adaptou bem sequer aos dados com os quais foi treinado.

No aprendizado de máquina tentamos encontrar um modelo balanceado (do inglês, balanced), i.e., um modelo que se adapte bem tanto aos dados de treinamento (model fit) quanto a dados que nunca usou(model predict). Em síntese, queremos um modelo que não está sobreajustado e nem sub-ajustado. A Figura 2 mostra essas situações de forma que os pontos vermelhos representam as etiquetas. Observe que no modelo sobreajustado, a curva vermelha passa exatamente sobre as etiquetas; no modelo sub-ajustado, a reta azul passa distante das etiquetas; e  por fim, no modelo balanceado, a curva verde passa próximo das etiquetas se adequando inclusive se novos pontos forem colocados próximos aos pontos já existentes.

underfit_overfit_balanced
Figura 2 – Situações de ajuste de modelos.

Opinião sobre o cenário atual com relação ao Aprendizado de Máquina

Nos dias atuais, muitas empresas estão começando a investir em Data Science, uma área que tem surgido da mescla de diversas disciplinas como: estatística, probabilidade, álgebra linear, ciência da computação, bancos de dados (relacionais ou não), data mining, big data e aprendizado de máquina. O cientista de dados é responsável por obter dados de diferentes fontes com relação à companhia em que atua ou setor, tentar inferir novas infomações que possam ser úteis para gerência e diretoria com base nas disciplinas citadas anteriormente e saber como visualizar e comunicar esses dados aos interessados. Como o aprendizado de máquina é uma subárea estudada por IA há muitos anos e esse blog é sobre IA, senti que estava devendo um texto sobre isso.

Eu mesmo tenho me preparado para trabalhar com este assunto porque acredito que das subáreas da IA, esta e robótica são as mais promissoras para os dias atuais. Não que as outras não sejam, mas acredito que o momento é dessas áreas.

Assim como outras áreas relacionadas com a ciência da computação, usar uma linguagem de programação é fundamental. Pelo que vejo, as linguagens de programação favoritas dos cientistas de dados são Python, R, Java e Scala. Digo isso com base em algumas pesquisas que realizei, parte delas inclusive podem ser vistas no texto Software Livre em IA.

Com base nisso, comecei a estudar Python e vou começar a escrever textos que usem essa linguagem ou Java [já que esta última é minha linguagem default :)]. Mas por que implementar com Python/Java e descartar as linguagens R/Scala? Eu não conheço R e Scala, não posso apontar pontos positivos ou negativos dessas linguagens, mas posso falar bem de Python. Eu vejo que Python possui muitas bibliotecas para desenvolvimento tradicional (IO/Image), Web (Django) e científico (NumPy/SciPy/Pandas/Matplotlib/etc). Acredito que essa variedade faça com que a linguagem venha a crescer muito nos próximos anos. Além de tudo isso, a linguagem Python é muito agradável e simples de se programar, mas sem deixar de ser poderosa [The Force May Be With You :)]. Além disso tudo, suas bibliotecas são muito bem documentadas.

Outro fator interessante, é que há um consenso de que algumas bibliotecas base do Python para computação científica sejam adotadas e isso faz com que as bibliotecas funcionem muito bem em conjunto. Algumas dessas bibliotecas base são: NumPy (para representação eficiente de arrays e matrizes), SciPy (construída sobre NumPy e usada para realizar computação sobre matrizes, arrays, além de cálculos numéricos, resolução sistemas de equações lineares, etc), Pandas (também construída sobre NumPy e que permite gerenciar os dados antes de usar técnicas de aprendizado de máquina) e Matplotlib (usada para visualizar os dados em gráficos).

Como se eu já não tivesse elogiado demais a linguagem Python… essa linguagem possui uma boa variedade de bibliotecas especializadas em aprendizado de máquina, entre elas, acredito que as principais sejam:

  • Scikit-Learn: essa talvez seja a biblioteca mais usada para aprendizado de máquina supervisionado e não supervisionado com suporte à linguagem Python;
  • Tensor Flow: uma biblioteca desenvolvida pelo Google que foi disponibilizada para todos como open source, que possui algoritmos de aprendizado de máquina, aprendizado profundo (do inglês, Deep Learning) e ainda permite a computação utilizando GPU para maior desempenho;
  • Theano: essa foi a primeira biblioteca Python cujo destaque se encontrava nos modelos para aprendizado profundo e no melhor desempenho por se basear na utilização da GPU; e
  • Caffe: essa que na minha opinião tem o melhor nome, é uma outra biblioteca que se destaca por dar suporte ao aprendizado profundo e foi desenvolvida na Berkeley Vision and Learning Center (BVLC).

Embora eu tenha mencionado as principais bibliotecas, neste texto irei utilizar apenas a Scikit-Learn. Como esse texto ainda é uma introdução ao aprendizado de máquina, acho que ainda não faz sentido já começar a falar de aprendizado profundo (e confesso que ainda não estou apto para isso). Mas se você queria ler sobre isso, não se preocupe, a intenção é falar do assunto em um texto caprichado em breve.

Vamos começar com a diversão?

Classificação de Flores Iris com Python e Scikit-Learn

O conjunto de dados Iris representa um problema em que são dadas n=4 características das espécies de flores Iris, e o objetivo dos algoritmos de classificação quando aplicados nesse conjunto é descobrir de qual das sub-espécies se tratam as características. As sub-espécies apresentadas são Iris Setosa, Iris Versicolor e Iris Virginica.

Para mim, que sou leigo, as 3 são iguais (LOL! =D). Mas para algoritmos de classificação, é possível distinguir uma da outra por meio de 4 medidas: comprimento da pétala, largura da pétala, comprimento da sépala e largura da sépala.

É interessante estudar problemas como o IRIS em exemplos porque o Scikit-Learn já disponibiliza um conjunto de dados para esse problema, de forma que os cientistas de dados possam testar seus classificadores. Para este problema, implementei um dos exemplos da documentação do Scikit-Learn. Para isso, usamos máquinas de vetores de suporte (do inglês, Support Vector Machines – SVMs), uma das técnicas existentes para classificação no aprendizado supervisionado. De acordo com a Wikipédia, SVMs são classificadores lineares binários não-probabilísticos (fico devendo uma explicação melhor sobre isso em um próximo texto).

Enfim, vamos ver como criar um classificador SVM para o problema Iris usando o Scikit-Learn. Nas linhas de código-fonte abaixo, aquelas que começam com Hashtag (#), são comentários ignorados pelo interpretador Python:

# Código Python
# Se seu computador não tem as bibliotecas, faça o download do PIP, que é 
# um gerenciador de pacotes do Python. 

# Importa os conjuntos de dados com problemas de exemplo do Scikit-Learn
from sklearn import datasets

# Importa o classificador SVM
from sklearn import svm

# Carrega os dados do problema Iris
iris = datasets.load_iris()

# Instancia um classificador baseado em SVMs.
classificador = svm.SVC(gamma=0.001, C=100.)

# Treina o classificador com m-1 observações e m-1 etiquetas.
classificador.fit(iris.data[:-1], iris.target[:-1])

# Realiza a previsão da última observação (que não foi usada 
# durante a fase de treino).
previsao = classificador.predict(iris.data[-1:])

# Valor previsto é igual ao valor da etiqueta para a última observação?
# True ou False?
previsao == iris.target[-1:]

Curiosidade: Por que uma máquina precisa saber distinguir flores? (contém Spoiler de Wall-E)

Se você gosta de ficção científica e animações, recomendo que assista Wall-E. No filme, seres humanos abandonaram a Terra porque ela está inabitável, existem pilhas e pilhas de lixo por todo lugar. Muito tempo depois de deixar Wall-E limpando toda a sujeira deixada para trás, é enviado um outro robô, chamado EVA para verificar se a Terra já se tornou habitável novamente.

Uma maneira de saber se a Terra é habitável na história do filme é saber detectar o que é uma planta e verificar se existe alguma planta no planeta. Talvez você não acredite que a Terra venha a ficar daquele jeito, mas imagine que estamos tentando encontrar vida em outro planeta. Se um robô da NASA algum dia encontrar algo que pareça uma planta, isso pode significar bastante.

O exemplo talvez não seja dos melhores, mas o filme é divertido. Se você ainda não viu, não deixe de assistir.

Wall_E

Para aprender mais

Se você tem interesse em aprender mais sobre aprendizado de máquina e ciência de dados, recomendo que estude as disciplinas mencionadas no início do texto. Algumas maneiras de fazer isso são: ler as referências desse texto, baixar e testar as bibliotecas mencionadas e fazer cursos como os da Alura, Udemy e Coursera. Mas mais do que tudo isso, escolher uma direção (linguagem/framework) e praticar bastante.

Para praticar, recomendo que comecem resolvendo o problema MNIST do Scikit-Learn. Depois de resolvê-lo, teste o desempenho de classificadores baseados em diferentes técnicas. O Kaggle é uma ótima fonte de aprendizado, dados, desafios e competições.

Eu comecei a usar o Kaggle semana passada, é recomendado começar pelo problema Titanic: Machine Learning from Disaster. Neste problema, você tem dados de treino e teste sobre sobreviventes e vítimas do navio mais famoso do mundo. Seu objetivo é treinar um classificador com os dados de treino e submeter as previsões do seu classificador obtidas a partir de uma base de dados de teste. Quanto mais acertos seu classificador tiver, melhor sua classificação no ranking do site. A minha solução ainda não é ótima, foi avaliada em aproximadamente 75% de exatidão (você pode baixar e tentar obter uma taxa de acertos maior). Mas está sendo legal porque estou vendo que os dados do mundo real quase nunca vêm “redondinhos” como esses do problema Iris. Entre outras coisas, eu tive que usar bastante a biblioteca Pandas para conhecer e limpar os dados, além de Feature Engineering para poder aumentar a quantidade de características usadas no treino do modelo.

Espero que tenham gostado do texto.
Não deixem de comentar, divirtam-se e até o próximo texto!

Referências

  1. Curso de Aprendizado de Máquina do Coursera (com Andrew Ng).
  2. Cursos de Aprendizado de Máquina da Alura.
  3. Data Science do Zero. Primeiras Regras com o Python . Grus, J.
  4. Tutorial do Scikit-Learn.
  5. 15 Python Libraries for Data Science.
  6. 7 Steps to Machine Learning with Python.
  7. The use of multiple measurements in taxonomic problems. R. A. Fisher.
  8. Titanic: Machine Learning from Disaster.
  9. Basic Feature Engineering with Titanic Data.
Anúncios