Rede Neural para classificar dígitos manuscritos com Python e sklearn
Criação de uma MLP em Python para classificação utilizando a biblioteca sklearn.
A biblioteca sklearn é uma das mais conhecidas para tarefas que envolvem problemas classificação, regressão e clustering, tarefas que geralmente estão associadas a algoritmos de Machine Learning. Nesse artigo vou abordar o uso da biblioteca para a criação de um modelo de Rede Neural para a tarefa de classificação de números.
Let’s bora!!!
Sklearn e Redes Neurais???
Redes Neurais é um assunto bastante discutido nos últimos tempos, e seu uso se faz presente em inúmeras áreas que os algoritmos clássicos de Machine Learning não possuem um resultado muito satisfatório, como visão computacional. Para essas tarefas que exigem o uso de redes neurais existem muitos frameworks que auxiliam no desenvolvimento, dentre os mais utilizados estão Tensorflow, Pytorch e Keras. Sklearn, apesar de ser, na maior parte das vezes, utilizada para modelos clássicos de Machine Learning, possui um módulo que nos permite usar um modelo de Rede Neural simples, mais precisamente uma MLP, que é tratado como uma caixa preta, um dos motivos pelo qual a biblioteca não está entre as mais utilizadas para esse fim.
O Dataset que iremos utilizar
Usaremos nesse artigo o famoso dataset MNIST criado por um dos principais nomes do campo cientifico que trata com Redes Neurais, Yann LeCun. O dataset conta com números escritos a mão, originalmente imagens com resolução 28x28, porém utilizaremos uma versão discretizada, que usa 785 colunas indicando a intensidade de cor no pixel (0–255), já que são imagens em preto e branco. Ele é encontrado na competição do Kaggle, a qual eu participo com o código (kernel completo) presente no artigo.
Bora fazer uma baguncinha…
Para carregar o dataset e manipular ele utilizei a biblioteca Pandas, bastante utilizada pelo pessoal que trata com dados de tamanhos pequenos.
Dividindo todos os pixels de todas as imagens pelo maior número possível (255) temos uma simples normalização, garantindo que nosso dataset não assuma valores tão esparsos, sendo valores na faixa de 0 a 1, e não mais de 0 a 255.
A biblioteca tem uma função que pode ser usada para essa separação dos dados em dois conjuntos distintos, um para o treinamento e outro para avaliarmos o quão bom está nosso modelo, mas nesse caso eu fiz manualmente.
Vamos montar nosso modelo e botar ele pra rodar
Utilizando o módulo de Redes Neurais presente na biblioteca, usaremos a função que nos possibilitará criar um modelo para a tarefa de classificação.
Precisamos apenas passar alguns hiperparâmetros (termo usado para parâmetros passados externamente para o modelo) para termos nosso modelo pronto para uso. Quais hiperparâmetros podem ser usados e seu significado pode ser consultado na referência do módulo. O treinamento também se dá de forma simples, apenas chamamos a função fit. Um dos problemas que a biblioteca enfrenta, e ainda mais para o uso em uma rede neural, mesmo que simples, é o não uso de GPU, fazendo que o uso de uma Rede Neural mais funda demore muito, e que não seja útil o uso nessas condições.
Chegou a hora da verdade
Utilizando algumas métricas presentes na biblioteca, podemos analisar o nosso custo de treinamento (quanto menor melhor).
Vamos dar uma olhada na nossa matriz de confusão, assunto que já foi abordado por outro DataHacker.
Hm… Nos parece okay. Vamos dar mais uma olhada nos nossos resultados e checar a acurácia, que vai nos dizer, por fim, o quão bom é nosso modelo.
Atingimos 98% de acurácia no nosso modelo simples escrito em poucas linhas de código, o que é um bom resultado.
Sou Lukas, um aspirante à carreira de dados terminando a graduação em Ciência da Computação na UFPel. Entrei recentemente na comunidade do Data Hackers e tem sido um grande ponto para o ganho de conhecimento e experiência. Se tiver algum feedback deixe aqui nos comentários. Posso ser encontrado no Github e no Kaggle também.