Machine Learning: o que realmente importa
Recentemente, tive a feliz oportunidade de falar sobre Machine Learning para uma audiência de estudantes e profissionais de engenharia sobre os fundamentos do que hoje se conhece como Machine Learning (mas que já foi Cibernética, Reconhecimento de Padrões etc).
O Aprendizado de Máquinas está nas manchetes de jornais e nas bocas de todos aqueles que querem estar alinhadas com as mais novas tendências (apesar de essa tecnologia não ser propriamente nova). É ela que está por trás dos filmes que o NETFLIX te sugere ou nas "dicas" de livros que a Amazon manda para você na newsletter diária. Por isso, não fiquei realmente surpreso pela quantidade de pessoas interessadas no tema da palestra.
Durante a apresentação, pude perceber alguns tópicos que apresentam maior dificuldade para aqueles que, mais do que curiosos sobre o tema, realmente já tentaram alguma vez executar um projeto prático aplicando o ciclo de trabalho de Machine Learning (ML).
Quando alguém te falar sobre Aprendizado de Máquinas super empolgado com a sofisticação do algoritmo escolhido (redes neurais convolucionais, random forest, support vector machines, deep autoencoders etc), provavelmente essa pessoa terá dado pouca atenção àquilo que é o cerne de qualquer aplicação: os dados!
A principal diferença de ML para a programação tradicional de computadores é justamente o fato de toda a "inteligência" ser extraída dos dados disponíveis (chamados de dados de treinamento) em vez de ser codificada em estruturas lógicas tradicionais, como estruturas de decisão (IF... THEN ... ELSE).
Sendo assim, os dados devem ser a principal preocupação de quem deseja ter sucesso em suas aplicações práticas.
Há pelo menos três aspectos importantes quanto ao tratamento de dados para treinamento de modelos de ML:
- Quantidade de amostras no conjunto de dados (em especial quando há pouca quantidade deles)
- Desbalanceio entre diferentes classes (em problemas de classificação)
- Dimensão dos dados (isto é, quantidade e qualidade das entradas utilizadas nos modelos)
Se essas questões não são tratadas devidamente, dificilmente um algoritmo de ML, por mais sofisticado que seja, será capaz de entregar um desempenho satisfatório.
Poucos dados podem significar o encerramento precoce de um grande projeto de aprendizado de máquinas, mas há formas de remediar isso com técnicas de data augmentation, ou simplesmente aumento de dados. Basicamente, o conjunto original de dados disponíveis é usado como matéria prima para gerar novas amostras que sejam estatisticamente fieis à distribuição original, um dos maios famosos é o método de Bootstrapping.
Bootstrapping é simplesmente uma reamostragem com repetição dos dados originais até que se alcance a quantidade necessária de dados
Quando há desbalanceio entre classes em aplicações de classificação (por exemplo, decidir se o bichinho numa foto é um cachorro ou um gato), o algoritmo tenderá a prever na maior parte das vezes a classe mais bem representada no conjunto de treinamento, em detrimento das demais. A geração de amostras sintéticas por combinação de outras, como o k-médias SMOTE é uma saída usual. Nesse método, novos pontos são gerados na posição dos centroides entre subgrupos das classes com baixa representatividade.
Quanto à dimensão dos dados, nem sempre é uma boa ideia usar muitas delas, por causa da maldição da dimensionalidade que faz com que, a cada nova dimensão de entrada, seja necessário obter mais dados para garantir um bom aprendizado (e esse aumento ocorre a uma taxa exponencial!).
Deve ser determinado um número "ótimo" de entradas (chamadas comumente de features, atributos ou características) a fim de se obter o melhor desempenho do classificador. Essa operação é chamada de Redução de Dimensionalidade. Uma das formas mais populares de se conseguir isso é a Análise de Componentes Principais (frequentemente identificada pela sigla originária do inglês - PCA).
PCA executa uma transformação linear nos dados originais em termos de autovetores de sua matriz de covariância, realçando as componentes que respondem pela maior parte da variabilidade (informação) contida no conjunto de dados. Obtém-se, assim, uma ordenação do teor de relevância de cada uma das dimensões do conjunto de dados no novo espaço transformado.
No caso apresentado na figura acima, além de reduzir de três para duas dimensões, sem perda relevante de informação, as features geradas pelo método PCA no espaço transformado ainda conferem uma maior separabilidade entre as classes, facilitando o trabalho do algoritmo de aprendizagem. Vale lembrar que, de posse da matriz de transformação, é sempre possível retornar ao espaço original.
E quando as dimensões são muito reduzidas ou não possuem potencial discriminatório suficiente?
Será preciso gerar novas features a partir das dimensões originais dos dados, um exemplo simples é apresentado abaixo:
Temos duas classes (azul e vermelha), mas não se pode, por exemplo, usar apenas uma reta (o método mais simples possível) para separar duas classes. Porém, a adição de uma nova dimensão, que é calculada a partir da original (elevando esta ao quadrado), torna possível o uso de um classificador linear (reta verde):
Há ainda muitos e muitos tópicos e métodos interessantes apenas para tratar desses três pontos realçados sobre a questão dos dados de treinamento (há livros inteiros sobre o assunto), mas o objetivo deste texto é chamar a atenção para o assunto e introduzir conceitos chave.
Há alguns anos que os métodos de aprendizagem de máquinas têm sido disponibilizados em bibliotecas de linguagens amigáveis e gratuitas como Octave, R e Python, de modo que se tornam quase itens de prateleira. Isso é muito bom para a popularização do ramo de ciência de dados, pois mesmo com conhecimento intermediário da teoria de ML é possível construir aplicações interessantes.
Resta, porém, como desafio e como espaço de inovação o tratamento de dados. O fator crucial para o sucesso das aplicações será a criatividade do analista no momento de coletar seus dados e escolher ou gerar features mais eficientes.
Mal comparando uma aplicação de ML à arte de tocar violão, as posições dos acordes são como os algoritmos de aprendizagem, são tabelados e é preciso treinar para executá-los bem com a mão direita no braço do instrumento (ou esquerda para os canhotos), porém, uma vez aprendidos, são iguais para todos. Já o dedilhado, ou a batida, vai depender da interpretação de dada um, o que vai demandar criatividade, experiência e sensibilidade, assim como o tratamento dos dados no aprendizado de máquinas... E é isso que faz toda a diferença!
Automation Engineer at Petrobras
5 aExcelente post
C# .NET | Angular | AWS | Techlead @Petrobras
5 aO crash course de ML do google developers aborda exatamente o que vc explicou sobre como transformar problemas não lineares em problemas lineares. Seu artigo complementou bem o que aprendi por lá! Parabéns.
Geólogo na Petrobras
5 aBoas analogias