Optativa 2: Classificação

A classificação é uma das tarefas base no aprendizado de máquina supervisionado, essencial para a formação de qualquer cientista de dados. Segundo Mitchell (1997), o aprendizado de máquina ocorre quando um programa de computador melhora seu desempenho em uma tarefa específica através da experiência. No contexto da classificação, essa “experiência” traduz-se por meio do treinamento de um modelo com dados previamente rotulados, permitindo que o sistema aprenda a mapear variáveis de entrada para categorias discretas de saída.

O objetivo central da classificação é a construção de um modelo capaz de prever a classe de novos dados que surgirem no conjunto, ou seja, que ainda não foram observados, com a maior precisão possível.

Conforme explicam Tan, Steinbach e Kumar (2019), a classificação distingue-se da regressão pelo fato de sua variável alvo ser categórica, ou seja, ela consiste em um conjunto finito de rótulos, como “sim” ou “não”, ou tipos específicos de objetos. A meta é descobrir uma função alvo que separe os dados em diferentes classes baseando-se nos atributos disponíveis.

Benefícios da classificação

Os benefícios da aplicação de algoritmos de classificação são vastos, mas vamos começar destacando a capacidade de automatizar decisões complexas e processar grandes volumes de dados com eficiência.

Bishop (2006) ressalta que, ao generalizar padrões a partir de um conjunto de treinamento finito, esses modelos permitem lidar com a variabilidade de novos dados em aplicações reais, como diagnósticos médicos, detecção de fraudes e reconhecimento de padrões visuais, reduzindo a carga de trabalho manual e aumentando a consistência das decisões.

Além da automação e precisão, Tan, Steinbach e Kumar (2019) enfatizam que a classificação é uma ferramenta interessante para a descoberta de conhecimento. A análise dos modelos gerados revela relações ocultas e estruturas subjacentes nos dados que seriam imperceptíveis à análise humana direta.

Exemplo de código

Antes de começarmos o exemplo, precisamos fazer um disclaimer: este artigo não está focado em explicar a base matemática e/ou conceitual da técnica. Vamos apenas mostrar a aplicação de código em python. Por isso, pode ser que você se sinta perdido em relação aos passos do código e aos resultados que são encontrados após a execução do algoritmo.

Recomendamos que você procure livros, vídeos e outros materiais para complementar sua experiência educativa. Comece pelas referências que estão disponíveis no final desse artigo, assista ao vídeo introdutório abaixo e procure outras fontes.

Disclaimer feito, seguimos…

Neste artigo seguiremos com o conjunto 'spotify_hits_dataset_complete.tsv' que pode ser baixado aqui. O nosso objetivo com este código é transformar a popularidade em uma classe binária para que possamos criar um modelo de classificação que consiga determinar se um registro de música tem alto índice de popularidade ou não.

O código que construímos na Figura 1 começa com a importação das bibliotecas que utilizaremos para manipular os dados. Na tarefa de classificação, especialmente, faremos uso da scikit-learn (ou sklearn), que é uma biblioteca open-source para Python capaz de oferecer ferramentas para classificação, regressão, agrupamento (clustering), seleção de modelos e pré-processamento de dados.

Após a leitura do arquivo e exibição da estrutura geral dele, selecionamos na linha 18 apenas as colunas (ou atributos, ou variáveis) numéricas para trabalhar e inserimos elas na dataframe df_numericos. Neste dataframe realizamos um pré-processamento simples para eliminar campos ausentes.

Da linha 26 até a linha 38 estamos adaptando o dataset para a tarefa de classificação. Primeiro, criamos uma coluna (ou atributo, ou variável) binária para servir como rótulo de classificação no modelo. Músicas com mais de 60 no índice de popularidade são categorizados com 1, enquanto músicas com índice menor são categorizados com 0.

Em seguida, criamos o conjunto de dados de entrada (X_class) e de saída (y_class). Os atributos de entrada servirão como variáveis preditoras para categorizar corretamente um novo dado como música popular (alto índice de popularidade e valor 1 no campo 'popular_class') ou não popular (baixo índice de popularidade e valor 0 no campo 'popular_class').

Finalizando este bloco do código, criamos os subconjuntos de treinamento e teste, tanto para os dados de entrada quanto para os dados de saída. Assim, as estruturas X_train e X_test são os subconjuntos de entrada e as estruturas y_train e y_test são os subconjuntos de saída.

Figura 1 – Código completo para aplicação da técnica de classificação em um conjunto de dados real.
Fonte: Autoria própria.

Com os subconjuntos para treinamento e teste preparados, precisamos fazer uma nova rodada de pré-processamento. Para garantir eficiência do modelo na predição, precisamos transformar os dados para que fiquem todos na mesma escala. É exatamente isso que estamos fazendo nas linhas 42, 45 e 48. Pegamos os conjuntos de entrada apenas para padronizá-los na mesma escala. A saída (y_train ou y_test) não precisa de padronização, pois os valores são binários, ou seja, estão na mesma escala de dimensão.

Encaminhando para o final, nas linhas 54 e 55 criamos o modelo com 1000 iterações e treinamos ele com nosso conjunto de treino para entrada e saída. Queremos que o modelo aprenda a relacionar as variáveis preditoras (X_train_scaled) com os valores esperados de saída (y_train).

Na linha 58 estamos finalmente testando o modelo a fim de validar o quão eficiente ele está em classificar os registros sem o controle dos rótulos previamente definidos. O model_clf aciona o método predict, que recebe como parâmetro o conjunto de entradas de teste (X_test_scaled).

Finalizando o código, nas linhas 61 e 62 apresentamos a acurácia e algumas outras métricas de avaliação da performance do modelo na classificação desse problema. A saída que recebemos ao final está contida na Tabela 1.

Acurácia: 0.9260700389105059

precisionrecallf1-scoresupport
00.800.650.7237
10.940.970.96220
accuracy0.93257
macro avg0.870.810.84257
weighted avg0.920.930.92257
Tabela 1 – Respostas que o algoritmo retorna ao final da execução dos testes do modelo.
Fonte: Autoria própria.

Os resultados disponíveis na Tabela 1 são típicos da biblioteca scikit-learn e mostram como o modelo se comporta ao distinguir entre duas classes (0 e 1). Para interpretar corretamente, olhe primeiro para a coluna support. Ela revela que temos um conjunto de dados desbalanceado, com apenas 37 exemplos da classe 0 contra 220 da classe 1.

Conforme alertam Müller e Guido (2016), em datasets desbalanceados a acurácia global (accuracy) pode ser enganosa, pois o modelo pode alcançar uma pontuação alta apenas chutando a classe majoritária (a classe 1, neste caso). Isso significa que a acurácia aparentemente boa (0.9260700389105059) pode estar enviesada e não ser tão boa quanto pensávamos.

Considerando que temos uma classe minoritária (0), vamos focar na performance dela. O recall de 0.65 indica que o modelo detectou apenas 65% dos casos reais da classe 0, deixando escapar muitos exemplos. Já a precision de 0.80 mostra que, quando o modelo previu que era 0, ele acertou 80% das vezes. Este resultado corrobora com a opinião de Provost e Fawcett (2013) sobre a existência de um trade-off fundamental: para aumentar a captura de casos (recall), frequentemente perde-se na precisão dos acertos.

A métrica f1-score (0.72 para a classe 0) funciona como uma média harmônica entre a precisão (precision) e o recall, sendo um indicador mais confiável de qualidade para a classe específica do que a acurácia geral. Em outras palavras, se tivéssemos definido que o objetivo do problema era não deixar passar nenhum caso da classe 0, esse modelo atual poderia ser considerado conservador demais.

Antes de encerrarmos efetivamente, mais um disclaimer: este código não foi construído pensando em ser otimizado, em ser um modelo de classificação altamente eficiente ou aplicar determinada boa prática de programação. É bem possível que você encontre pontos que podem ser melhorados no código e, neste caso, recomendamos que pratique aplicando-os para melhorar o modelo e algoritmo como um todo.

Considerações finais

A classificação consolida-se como um solução muto útil para aplicações práticas de alto valor. O domínio desta técnica capacita o futuro cientista de dados não apenas a implementar modelos preditivos, mas também a extrair inteligência acionável de grandes volumes de informação.

Conforme você avançar em seus estudos, a compreensão profunda desses algoritmos e de seus fundamentos estatísticos será importante para enfrentar os desafios cada vez mais complexos do mercado atual.

Obrigado pela leitura e bons estudos.

Referências

BISHOP, C. M. Pattern Recognition and Machine Learning. New York: Springer, 2006.

MITCHELL, T. M. Machine Learning. New York: McGraw-Hill, 1997.

MÜLLER, Andreas C.; GUIDO, Sarah. Introduction to machine learning with Python: a guide for data scientists. Sebastopol: O’Reilly Media, 2016.

PROVOST, Foster; FAWCETT, Tom. Data science for business: what you need to know about data mining and data-analytic thinking. Sebastopol: O’Reilly Media, 2013.

TAN, P.-N.; STEINBACH, M.; KUMAR, V. Introduction to Data Mining. 2. ed. New York: Pearson, 2019.