Trabalhando com Tensorflow Decision Forests-Parte 2

Jéssica Costa
A Garota do TI
Published in
4 min readAug 15, 2023

Demorei um pouco, outros textos saíram na frente, mas agora vem a parte 2 do artigo Trabalhando com Tensorflow Decision Forests-Parte 1. Recomendo fortemente a leitura da parte 1 para o entendimento do presente artigo. Dessa vez vamos falar da problema do balanceamento e da avaliação de resultados de uma classificação binária e multiclasse nas árvores de decisão.

Imagem Autoral

O primeiro ponto que gostaria de falar hoje é sobre balanceamento. No mundo real, provavelmente, você vai se deparar com datasets desbalanceados, principalmente quando você não tem muito dado sobre aquele assunto que você está trabalhando. Embora falemos tanto de Big Data, tem assuntos que possuem muitos dados, outros dados ruins e tem aqueles que você tem pouco dado mesmo. E nestes casos de pouco dado, problemas de classificação são bem afetados. Em geral, você tem duas saídas: balancear os dados ou ajustar hiperparâmetros nos modelos. Neste artigo vamos falar da primeira opção.

Técnicas de Balanceamento

Balancear significa basicamente equilibrar. No melhor cenário, você teria como acrescentar dados reais ao grupo menor. Mas como sempre digo, a realidade bate a porta, nem sempre isso é possível. Então você recorrer a alguns métodos:

  • Diminuir a classe ou as classes que estão majoritárias, a isso damos o nome de Undersampling;
  • Aumentar a classe ou as classes minoritárias com dados sintéticos, a isso damos o nome de Oversampling;
  • Combinar os dois métodos, ou seja, baseado em algum critério, você vai diminuir classes majoritárias e aumentar classes minoritárias.

Muita gente vai pensar logo no SMOTE (Synthetic Minority Oversampling Technique), mas não existe somente este modo de fazer Oversampling. E nem sempre usar um SMOTE é a solução para seu dataset desbalanceado. Às vezes caímos no lugar comum de que aumentar a quantidade de dados sempre funciona. O que não é verdade. Em alguns casos, diminuir traz melhores resultados. Mas como faz isso? Gostaria de apresentar uma biblioteca open source que uso bastante chamada Imbalanced-learn.

Nela você vai encontrar uma documentação vasta sobre técnicas de balanceamento, não só de código mas até teórica. Existem métodos baseados em distância, randômicos, em clusters, e até técnicas que combinam métodos, como a SMOTEENN. Esta é uma técnica que usa SMOTE de Oversampling combinada com a técnica Edited Nearest Neighbours(ENN) de Undersampling que remove amostras próximas a um limite de decisão.

O que recomendo é testar várias técnicas e ver a que traz melhores resultados. Só que não recomendo usar a acurácia como métrica principal. Em datasets desbalanceados é muito comum se conseguir acurácia alta, mas isso é devido a classe majoritária, a minoritária provavelmente está ruim. Por isso avalie precisão, recall e F-1 score para avaliar adequadamente seu modelo. Agora vamos falar de avaliação?

Avaliação de Resultados

Voltando a falar dos modelos do Tensorflow Decision Forests (TFDF), vamos falar um pouco sobre avaliação de modelos. Como já mencionei anteriormente, acurácia não deve ser a única métrica avaliada em modelos com datasets desbalanceados. Recomendo usar outras métricas, como precisão, recall e F-1, AUC e ROC (bem usada em modelos biológicos). Por padrão, o TFDF usa acurácia e perda(loss) para avaliar, mas você consegue acrescentar mais métricas como no código abaixo.

METRICS = [ 
keras.metrics.BinaryAccuracy(name='accuracy'),
keras.metrics.Precision(name='precision'),
keras.metrics.Recall(name='recall'),
keras.metrics.AUC(name='auc')
]

model.compile(metrics=[METRICS])

results = model.evaluate(test_ds, return_dict=True, verbose=0)

Mas e seu quiser fazer um relatório de avaliação do modelo, um classification report? Como fazer isso no TFDF? Vamos lá.

Antes de mais nada você precisa importar o classification report do Scikit-learn. Uma particularidade sobre o TFDF é que quando você realizar previsões, ele não te traz resultados discretos como 0, 1, 2 que indicam a classe. Ele te traz a probabilidade de ser uma determinada classe. Numa classificação binária ele traz um “vetor” com a probabilidade de ser a classe positiva, a 1. Já na classificação multiclasse, ele retorna uma “matriz” com a probabilidade de cada classe. E como eu “decido a classe”? O módulo do Tensorflow possui algumas funções matemáticas que ajudam nessa tarefa de decisão.

import tensorflow as tf
from sklearn.metrics import classification_report

# Realizando predições
predict_prob = model.predict(test_ds)

# Para classificação binária (Maior que 0.5 é 1)
test_predictions = tf.math.round(predict_prob)

# Para classificação multiclasse (retorna o índice da coluna com maior valor)
test_predictions = tf.math.argmax(predict_prob, axis=1)

# Transformando em array sua coluna de labels
test_values = np.array(test_ds_pd[seu_label])

# Comparando valores de teste e as predições para o relatório
print(classification_report(test_values,test_predictions))

A função round realiza arredondamento e a função argmax retorna o índice com o maior valor entre os eixos de um tensor, ambas as funções são do módulo tf.math do Tensorflow. Dessa forma, você já consegue tant realizar predições para comparar com os dados de teste, como realizar predições com outros objetivos. Você também pode retornar as probabilidades e usar como resposta para a predição de seus modelos. Como sempre digo, tudo em Machine Learning depende do que você quer fazer.

Este artigo teve o objetivo de trazer uma solução de como resolver algumas questões que aparecem no mundo real em problemas de classificação em Machine Learning. Mas você sempre pode criar outra solução. Abaixo vou deixar algumas referências que utilizei para que vocês consultem. Essa é ponta do iceberg, porque ele é bem maior. Mas é um mundo que tem inúmeras possibilidades, divirta-se.

Links Úteis:
https://imbalanced-learn.org/stable/index.html
https://www.tensorflow.org/api_docs/python/tf/math
https://www.tensorflow.org/decision_forests/tutorials/beginner_colab?hl=pt-br

--

--

Jéssica Costa
A Garota do TI

Mestre em Ciência da Computação, GDE em Machine Learning e Cientista de Dados