Analista de Machine Learning IGTI — Entendendo o desafio do módulo 3

Ricardo Guerra
Ensinando Máquinas
6 min readOct 27, 2020
Photo by Mehdi Babousan on Unsplash

Neste desafio, vamos fazer um apanhado geral de tudo que foi visto no módulo. Vamos usar a tarefa de classificação para validar um modelo, otimizar os hiperparâmetros desse modelo e avaliar o resultado encontrado de acordo com algumas métricas de desempenho vistas durante o módulo.

O dataset a ser trabalho neste desafio se encontra aqui e se trata de dados de pessoas com problemas hepáticos(fígado) ou não e deveremos usar estes dados para realizar as seguintes tarefas:

1. Obter informações relativas a número de features e amostras;
2. Verificar a necessidade de tratamento de dados categóricos e valores faltantes;
3. Modelar o SVC e o Random Forest Classifier, com Random Search para sintonia de hiperparâmetros e validação cruzada estratificada.

Ok, vamos começar! Antes de trabalhar em cima das perguntas, iremos montar nossos modelos de acordo com o que foi solicitado no desafio.

Primeiramente, após carregar os dados em um dataframe (por favor, não esquece de importar o pandas) iremos visualizar as primeiras linhas para entender se ta tudo ok através de um pd.head(). Adiantamos aqui que o atributo V2, que trata do sexo (masculino ou feminino) é um atributo categórico e então deveremos fazer uma modificação para que ele fique numérico (0 ou 1). Poderemos fazer isso através do método map do proprio pandas, criando um dicionário ({‘Female’:0, ‘Male’: 1}) e aplicando o método. Maiores explicações aqui.

Em seguida vamos separar nossas features que serão utilizadas no modelo da feature objetivo (classe), para não enviesar o modelo.

X = df.drop('Class',axis=1)
y = df.Class

Continuando, foi requerido que seja realizada a modelagem de modelos SVM e Random Forest com sintonia dos hiperparâmetros através do método random search com uma validação cruzada estratificada. Podemos realizar todas essas tarefas utilizando apenas o scikit-learn.

Primeiro iremos importar as classes necessárias:

from sklearn.ensemble import RandomForestClassifier 
from sklearn.svm import SVC
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import RandomizedSearchCV
from sklearn.metrics import f1_score, make_scorer
from scipy.stats import uniform
from scipy.stats import randint

Os hiperparâmetros são os parâmetros intrísecos ao modelo, no caso do SVM nós iremos trabalhar nos parâmetros kernel, C e gamma, para saber mais sobre qual o papel de cada um, clique aqui.

Agora vamos entender a lógica do negócio… Vou começar explicando o SVM e o mesmo pode ser replicado para o Random Forest. Nós teremos que ter um modelo SVM de classificação criado, realizar uma separação do nosso conjuto em 10 partes estratificada e realizar uma busca validação cruzada com teste randômico de parâmetros. Nos foi passado ainda que deveriamos utilizar 5 iterações no teste de parâmetros, com random state = 42 e especialmente para o SVM, possibilitar o teste dos kernels ‘rbf’ e ‘sigmoidal’ e o C em um range de 0 a 10. Na figura abaixo temos o código e a explicação da criação.

Agora, para o Random Forest, basta fazer a mesma coisa, modificando os hiperparâmetros que iremos testar. Lembrando que para este desafio foi requerido a utilização dos seguintes parâmetros para o Random Forest: numero de árvores=valores aleatórios entre 100 e 200, bootstrap=True ou False e criterion= Gini ou Entropy.

Tudo feito, vamos agora analisar as perguntas!

Começando do simples, análise do dataset! Após carregar o conjunto em um dataframe pandas e realizar um df.head() já seria possível identificar se a afirmação é verdadeira ou não. Além disso, quando entramos no site para baixar o dataset podemos ler sobre cada feature e saber o que cada uma representa.

Aqui, resolvemos utilizando o método do pandas shape e assim conseguiremos obter a resposta e mais uma vez podemos checar com o site do dataset para ter certeza da nossa resposta.

Atributos categóricos são aqueles atributos que são qualitativos e não quantitativos… Geralmente são os atributos não numéricos. Para responder a questão poderemos utilizar o método .dtypes() do pandas, este método vai nos retormar os tipos de variáveis presentes no nosso dataset e assim poderemos dizer quantos são categóricos ou numéricos.

Para responder essa pergunta, eu prefiro utilizar o método do pandas .info() pois ele nos trás uma resposta mais completa, porém, existem os métodos .isna() (retorna os valores faltantes[none]) ou então .isnull() (mesma coisa do isna).

Lembra que utilizamos lá atrás o F1 como nossa métrica? Agora, existe um atributo do nosso objeto do RandomizedSearchCV chamado best_score_ que nos retorna o melhor F1 da busca. No nosso caso, um exemplo seria assim:

print(‘Melhor resultado f1:’, svm_rsCV.best_score_)

Para sabermos o melhor parâmetro encontrado pela busca, utilizamos o atributo best_params_ e assim teremos a resposta da questão.

print('\n\nMelhor configuração de hiperparâmetros:', svm_rsCV.best_params_)

O retorno da chamada da questão anterior já nos dá essa resposta.

Apesar de ser uma continuação das análises das duas questões anteriores, existe um atributo do nosso objeto chamado best_estimator_ que nos retorna todos os estimadores ótimos dessa busca que fizemos. Então vamos usar este para ver como funciona.

print( ‘\n\nConfigurações de todos os hiperparâmetros do melhor estimado encontrado pelo GridSearch: \n’, svm_rsCV.best_estimator_)

Aqui nós iremos agora responder as questões em relação ao nosso modelo Random Forest, se tivermos executado tudo certinho, basta utilizar os mesmos passos do SVM e as respostas nos serão dadas.

print('Melhor resultado f1:', rf_rsCV.best_score_)

Vamos verificar nossos melhores parâmetros:

print('\n\nMelhor configuração de hiperparâmetros:', rf_rsCV.best_params_)

Mesma coisa da anterior!

Utilizando o .best_estimator_:

print( ‘\n\nConfigurações de todos os hiperparâmetros do melhor estimado encontrado pelo GridSearch: \n’, rf_rsCV.best_estimator_)

A questão diz que não poderemos mais fazer nada em relação aos modelos, não podemos voltar atrás e testar outros parâmetros nem fazer modificações e devemos escolher o melhor. As alternativas trazem algumas opções que tratam um modelo melhor que o outro de acordo com algum hiperparâmetro escolhido, porém hiperparâmetros não são métricas de desempenho de um modelo.

Lembrem que utilizamos o F1 como a métrica de desempenho dos nossos modelos, então teremos que verificar qual dos dois modelos tiveram um F1 mais alto e responder a questão.

Realmente, os scores dos dois modelos ficaram bem próximos, como realizamos um trabalho de otimização de hiperparâmetros e ainda utilizamos um cross-validation com 10 folds e tendo em vista que utilizamos dois modelos diferentes e ainda assim obtivemos resultados próximos, na prática os modelos devem se generalizar semelhantemente.

Entendam que realizamos um random search, ou seja, tentamos otimizar os hiperparâmetros através de uma busca aleatória onde nem todas as combinações foram testadas. Ainda assim, algumas análises poderiam ser feitas para otimização dos atributos (limpeza de outliers por exemplo), realização de feature engineering e outras coisas. Então, se muito mais poderia ainda ser feito, você acha que podemos afirmar que essa configuração é a melhor possível?

Escrevi esse post para ajudar as pessoas com dificuldade neste desafio, tentando ser o mais didático possível. Caso ainda reste alguma dúvida, pode deixar um comentário ou me enviar um e-mail, terei o maior prazer em ajudar.

Aqui embaixo temos o notebook no colab para que vocês possam acompanhar o código que escrevi para responder as questões. Até mais!

--

--