O que é Machine Learning?

Olá!

Nesse artigo vamos começar a aprender Machine Learning!

Por ser uma área muito complexa e extensa, esse será apenas o primeiro de muitos que falarei sobre técnicas de Aprendizado de Máquina. Vou começar introduzindo a teoria básica sobre o assunto e depois, vamos implementar um pequeno projeto com um dos algoritmos mais famosos da área, o KNN, através da linguagem de programação R.

 

Introdução

 

Machine Learning, ou Aprendizado de Máquina, certamente é um dos assuntos mais comentados hoje em dia. Seja pelas diversas empresas que estão começando a implementar esse tipo de solução aos seus problemas de negócio, ou mesmo por pessoas acharem que se trata basicamente de uma sinônimo para Inteligência Artificial.

De maneira geral, Machine Learning refere-se a um subcampo da IA que abrange um conjunto de algoritmos que recebem dados e então retornam uma previsão. O que tais algoritmos fazem, em suma, é automatizar a geração de um modelo que resolve, ou se aproxima da solução ideal, para um problema. Por modelo, eu me refiro a relação matemática (ou probabilística) existente entre variáveis distintas. Por exemplo, acredito que você se lembre da seguinte relação:

y = ax +b

O que essa equação nos diz é que x e y se relacionam através dos valores de a e b, chamados de coeficientes . Na verdade, essa é exatamente a fórmula de um dos algoritmos mais básicos de Machine Learning, a regressão linear. Uma possível aplicação para esse algoritmo seria tentar prever a nota final de um aluno. Onde tal nota seria a variável e x seria uma variável como horas de estudo em casa ou algo do tipo.

Field of study that gives computers the ability to learn without being explicity programmed.

A frase acima pertence ao pioneiro da área de Inteligência Artificial, Arthur Samuel, e sintetiza bem a explicação de Machine Learning. A programação tradicional funciona de maneira que um profissional cria um algoritmo (sequência de instruções) que gera uma saída esperada a partir de suas entradas. Já os algoritmos de Aprendizado de Máquina possuem um mecanismo diferente. Eles são alimentados com uma massa de dados, chamada de treino. Baseado no que aprendeu com os dados de treino, o algoritmo é capaz de realizar previsões quando receber novos dados, chamados de teste. Isso acontece pois, através de funções matemáticas, padrões ocultos são encontrados nos dados de treino e podem ser generalizados para os dados de teste.

Usando o exemplo anterior, da predição da nota final, podemos alimentar nosso algoritmo com uma base de dados de treino da forma:

A variável nota é o que queremos prever, é o y equação. Podemos fazer uma análise de correlação (como a que foi feita no último artigo) entre as variáveis dessa base e ver quais possuem uma relação mais forte (lembrar que correlação não implica causalidade). Escolhemos a coluna “Horas de Estudo Casa” para ser a variável independente, o x. Suponha que essa base de dados possui 1000 registros. Escolhemos aleatoriamente uma amostra de 700 registros para treino e deixamos os outros 300 para o teste. Alimentamos o algoritmo com a base de treino e com isso ele aprende e cria uma modelo de predição desse problema. Em seguida, colocamos nossa base de teste (sem a coluna da nota, obviamente) para testar a acurácia do modelo. A saída do algoritmo será uma nova base de dados, agora contendo a coluna referente a nota, com os valores previstos. Esse é o passo-a-passo básico de um algoritmo de Machine Learning. Existem etapas posteriores como de melhorar a precisão do modelo dentre outras, que serão discutidas mais a frente.

 

Algoritmos

 

Os algoritmos de Machine Learning podem ser divididos em dois grandes grupos: Supervisionados e Não-Supervisionados (existe um terceiro grupo que fica entre esses dois mas neste primeiro artigo não falaremos dele).

Na categoria de Supervisionados, os dados de entrada (treino) possuem o item que se deseja prever, no exemplo anterior era a nota final. O treinamento do algoritmo dura até que um modelo seja elaborado, mapeando os padrões encontrados. Após essa etapa, o algoritmo deve classificar os próximos dados que receber baseado no que aprendeu.

Os algoritmos de aprendizagem supervisionada podem ser divididos em dois subgrupos:

  1. Classificação: quando o resultado possui característica booleana, ou seja, 0 ou 1, verdadeiro ou falso.
  2. Regressão: quando o resultado possui característica numérica e contínua. Pode ser usado para saber como o valor de uma variável irá se comportar ao longo do tempo, por exemplo.

Os principais algoritmos supervisionados são: Decision Trees, Näive Bayes, Logistic Regression, SVM, KNN.

Já os algoritmos de aprendizagem Não-Supervisionada recebem os dados de entrada e fica a cargo deles descobrir relacionamentos entre as variáveis, ou seja, não há conhecimento prévio do resultado esperado. O termo Não-Supervisionado vem justamente do fato de não haver treinamento. Podem ser divididos entre os seguintes subgrupos:

  1. Agrupamentos (Clustering): o objetivo é descobrir subgrupos presentes nos dados, de forma que a similaridade intra grupo seja a menor possível enquanto que a dissimilaridade inter grupo seja a maior possível.
  2. Regras de associação: o objetivo é criar associações entre itens.  Exemplos de uso desse tipo de categoria são pessoas que compram X também costumam comprar Y; ou pessoas que assistem a um filme K também assistem o filme Z.

Os principais algoritmos Não-Supervisionados são: K-Means, Apriori, PCA, Hierarchical Clustering.

Com tantos algoritmos disponíveis e uma gama enorme de aplicações, parece ser uma tarefa difícil saber qual algoritmo utilizar. Essa resposta depende de fatores como:

  • Tamanho da massa de dados
  • Natureza dos dados
  • Capacidade computacional disponível
  • Urgência na solução do problema
  • Objetivo com a análise

Abaixo segue um infográfico que pode ser muito útil na hora de escolher qual algoritmo usar:

 

Machine Learning na prática

 

Para este projeto, usaremos dados reais, que estão disponíveis no repositório da UCI (University of California)  para estudos sobre Machine Learning. Para baixar o dataset  em formato csv basta acessar este link. A base de dados foi gerada a partir de uma pesquisa feita pela University of Winsconsin, em novembro de 1995, com pacientes que tiveram um tumor identificado (maligno ou benigno).

Uma breve explicação sobre como um tumor é diagnosticado: é feita uma análise de nódulos (massas anormais) no tecido da mama. Caso um nódulo seja encontrado, uma biópsia de aspiração é feita, com objetivo de extrair uma pequena amostra de células. Então um profissional realiza uma verificação no microscópio para identificar se a massa é maligna ou benigna.

O objetivo do projeto é aplicar um algoritmo de Machine Learning (no caso o KNN) para analisar as medições de células de biópsias de mulheres com nódulos anormais. A base de dados é constituída de 32 colunas, a primeira sendo um ID de cada paciente, a segunda sendo o diagnóstico (B ou M)  e as outras medidas de exames laboratoriais. O dataset possui 569 registros. Vamos dar uma olhada nas primeiras linhas das 9 primeiras colunas:

Como disse, para este projeto vou utilizar a linguagem R, através da IDE Rstudio. Mas com certeza ele também pode ser feito usando o Python. Vamos começar importando a base de dados:

Antes de começar aplicar o algoritmo propriamente dito, devemos preparar a base de dados para ele. Para isso, vamos nos certificar de 4 coisas:

  1. Tirar a coluna ID. Deve-se excluir esse tipo de coluna de qualquer aplicação usando Machine Learning pois uma identificação única de cada linha pode levar a resultados errados, devido ao fato que o algoritmo iria prever cada registro. Ou seja, o modelo perderia toda sua capacidade de generalização.
  2. Certificar que não existe na (dados faltantes). Algoritmos de Machine Learning não conseguem lidar com bases que possuem ausência de dados. Todas as colunas e linhas devem estar preenchidas.
  3. Converter a variável a ser prevista (no caso, a coluna diagnosis) para o tipo factor. Esse tipo refere-se à dados categóricos. Alguns algoritmos de Machine Learning, como KNN,  requerem que a variável a ser prevista pelo modelo seja do tipo categórica e não numérica.
  4. Normalizar as colunas numéricas. Analisando-se a base de dados, é perceptível que existem colunas com escalas completamente diferentes, por exemplo: “area_mean” possui valores que passam 2500 ao passo que a coluna “smoothness_mean” possui valor máximo de 0.16340. Para o KNN, é importante que todos os valores numéricos estejam na mesma escala pois o KNN depende da escala nos dados para calcular a distância entre eles.

Para realizar os 4 passos descritos, vamos utilizar o código abaixo:

Como vocês verão daqui para a frente, de maneira geral, implementar um algoritmo de Machine Learning não é uma tarefa muito difícil. O que gera valor a esse trabalho é a interpretação que profissional faz do resultado do algoritmo. Agora, vamos entrar na análise propriamente dita. Para isso, vamos começar instalando e importando o pacote class, do R, que possui a função KNN.

Agora vamos criar os dados de treino e de teste, ambos oriundos do dataframe normalizado que acabamos de criar (dados_norm). É importante atentar para o fato que para os dados de treino e teste, devem ser selecionadas amostras aleatórias. Com isso, é válido usar alguma das técnicas de amostragem disponíveis no R. Porém, essa base de dados foi montada de forma aleatória e por conta disso podemos fazer um silicing normal:

Vamos então criar os labels, que basicamente é a variável que se deseja prever, no caso, é a primeira coluna, diagnosis:

E agora, vamos enfim criar a primeira versão do nosso modelo de predição. Digo primeira versão pois sempre é aconselhável criar várias versões, mudando alguns parâmetros (como o k no nosso exemplo) e depois avaliar qual versão obteve um desempenho melhor.

Agora vamos à parte mais importante, avaliar o modelo criado. Para isso vamos fazer uso da função CrossTable, do pacote gmodels. Para esta função, nós vamos passar os nossos dados de teste (os labels) e também o nosso modelo. Ou seja, uma vez que o modelo foi treinado nos dados de treino, iremos usar o modelo para prever os dados de teste (lembrem que temos o “gabarito” com a respostas) com isso, vamos poder ver como foi o desempenho do modelo criado. A avaliação é feita através do uso de uma matriz de confusão, que a CrossTable cria. A imagem abaixo ilustrada bem o que é uma matriz de confusão.

A matriz de confusão é basicamente uma ferramenta que conta quantos valores de Verdadeiros Positivos, Verdadeiros Negativos (precisam ser os valores mais altos) e valores de Falso Positivo e Falso Negativo (minimizar esses ao máximo) foram gerados. Executando o comando abaixo vamos criar a matriz de confusão do nosso modelo:

Temos então o seguinte output:

Com esse resultado, podemos avaliar a acurácia do nosso modelo. Comparando o output com a matriz de confusão mais acima, podemos ver que o nosso modelo errou em apenas dois casos, temos 98% de acerto. Isso até seria um bom resultado não fosse a aplicação que estamos fazendo, que é prever a ocorrência de câncer. Ou seja, errar 2 casos significa que 2 mulheres foram para a casa achando que não possuem câncer mas na verdade possuem. Com isso, temos que trabalhar para melhorar o nosso modelo.

Você deve ter percebido que implementar uma solução usando Machine Learning é um processo bem interativo, com passos bem definidos. Tratamos os dados, criamos o modelo, avaliamos, otimizamos o modelo e esse ciclo macro se repete até o desempenho do modelo ser satisfatório. Para o nosso projeto, vamos avaliar o que a mudança do valor de k acarreta (começamos com k=21). Mas antes, o que significa exatamente esse valor?

O KNN significa K Nearest Neighbors (K Vizinhos mais próximos) e ele funciona classificando os dados de acordo com os dados mais próximos de suas características. As observações mais próximas são definidas como aquelas com a menor distancia euclidiana ao ponto em consideração. A imagem abaixo ilustra como é calculada a distância euclidiana.

d= √(x2-x1)^2+(y2-y1)^2

De maneira geral, o KNN realiza as seguintes etapas:

  • Armazena os dados
  • Calcula a distância d para todos os pontos de dados
  • Ordena os pontos dentro dos seus dados aumentando a distância para d
  • Prevê a maioria de valores de k próxima aos pontos

O valor de k determina as classes:

O grande desafio do KNN é encontrar o valor de k de forma que enquadre melhor os nossos dados.

Para encontrar o melhor valor de K, vamos utilizar o código abaixo para calcular a taxa de erro em valores de K entre 1 e 20.

Temos o seguinte gráfico como output:

Ou seja, conforme vamos aumentando o valor de K, a taxa de erro diminui. Como usamos o valor de K = 21, já possuímos a menor taxa de erro, embora ela não seja totalmente satisfatória. Você deve estar pensando, como podemos melhorar o modelo então?

Poderíamos usar mais dados ou mesmo escolher um outro algoritmo para se trabalhar. Usamos apenas uma pequena quantidade de dados para este projeto mas poderíamos usar muito mais. Como falei neste artigo, vivemos na era do Big Data, onde as ferramentas para se trabalhar com Inteligência Artificial são alimentadas com cada vez mais dados e com isso, estão em constante processo de melhoria 🙂

E esse foi o segundo artigo-tutorial do blog pessoal. Espero que tenham curtido. Qualquer dúvida podem entrar em contato comigo.

Abraço

 

Referências

Galera, usei estes artigos como referência:

E para o projeto, me basei nas aulas do curso de Formação Cientista de Dados da Data Science Academy. Para todos que querem se capacitar em Inteligência Artificial e Data Science, precisam dar uma olhada no site deles!

Article By :