domingo, 11 de junho de 2023

Machine Learning: escolha dos hiperparâmetros e ensamble

Introdução

Nesta semana, implementamos uma solução de machine learning para o conhecido problema "Titanic - Machine Learning From Disaster", disponibilizado em forma de competição permanente no Kaggle, conhecido portal com conteúdo voltado para a Ciência de Dados. 

Seguimos os seguintes passos: 1) importação das bibliotecas necessárias; 2) leitura do dataset (disponibilizado no Kaggle); 3) pré-processamento dos dados; 4) criação de "features"; 5) seleção de "features"; 6) visualização; 7) agrupamento por sobreviventes (o que permitiu observar quais "features" eram mais relevantes para o resultado); 8) criação da tabela pivô (em relação à "feature" "Pclass"); 9) padronização das variáveis; 10 ) utilização dos modelos (Logistic Regression, Naive Bayes para Classificação, KNN para Classificação, SVM para Classificação, Decision Tree e Random Forest) e avaliação de seus respectivos desempenhos, obtidos por validação cruzada (método sklearn.model_selection.cross_val_score).

Dois aspectos do trabalho mereceram maior atenção: a escolha dos hiperparâmetros (tuning) e o e ensamble (conjugação) dos modelos.

Escolha dos hiperparâmetros

A otimização dos hiperparâmetros (tuning) foi feita com o método gp_minize da biblioteca scikit-optimize (skop). O método implementa a otimização bayesiana, usando processos gaussianos , para encontrar os hiperparâmetros ótimos, sendo computacionalmente mais eficiente do que a classe GridSearchCV, do Sklearn, que faz a busca exaustiva.

A biblioteca pode ser instalada com:

!pip install scikit-optimize

A função que nos retorna a métrica e a lista da parâmetros ótimos é a seguinte:

def treinar_modelo_dtc (parametros_dtc):

  model_dtc = DecisionTreeClassifier(criterion = parametros_dtc[0], 

                                     max_depth = parametros_dtc[1],

                                     min_samples_split = parametros_dtc[2], 

                                     min_samples_leaf = parametros_dtc[3],

                                     random_state = 0)  

  score = cross_val_score(model_dtc, X_train_sc, y_train, cv = 10)  

  mean_score = np.mean(score)

  print(np.mean(score))

  return -mean_score

parametros_dtc= [['gini', 'entropy', 'log_loss'], 

                  (2, 6), 

                  (2, 5), 

                  (1, 3),

                  ]

otimos_dtc = gp_minimize(treinar_modelo_dtc, parametros_dtc, random_state = 0, verbose = 1, n_calls = 30, n_random_starts = 10)

print(otimos_dtc.fun, otimos_dtc.x)

# -0.8181772784019975 ['entropy', 3, 3, 2]


Ensamble dos modelos

Para o ensamble dos modelos, após a obtenção dos hiperparâmetros ótimos, usamos a classe VotingClassifier.

A implementação foi feita da seguinte forma:

from sklearn.ensemble import VotingClassifier

model_voting = VotingClassifier(estimators = [('RF', model_rf),

                                              ('SVC', model_svc),

                                              ('DTC', model_dtc)], 

                                weights=[1, 2, 1],

                                voting='hard' )

model_voting.fit(X_train_sc, y_train)

score = cross_val_score(model_voting, X_train_sc, y_train, cv = 10)

print(np.mean(score))

# sem weights: 0.8339200998751561

# com weights: 0.8350062421972535


Resultado

O modelo combinado obteve o score de 0.77751 no Kaggle, conferindo-nos a posição nº 4499 no ranking,  às 11h54min de 9 jun. 2023.



Referências

ANIFOWOSE, Fatai. Ensemble Machine Learning Explained in Simple Terms. Disponível em: <https://jpt.spe.org/twa/ensemble-machine-learning-explained-simple-terms>. Acesso em 10 jun. 2023.

CODERSCOLUMN. Scikit-Optimize: Simple Guide to Hyperparameters Tunning / Optimization. Disponível em: <https://coderzcolumn.com/tutorials/machine-learning/scikit-optimize-guide-to-hyperparameters-optimization>. Acesso em 10 jun. 2023.

KUMAR, Satyam. Use Voting Classifier to improve the performance of your ML model [Towardsdatascience]. Disponível em: <https://towardsdatascience.com/use-voting-classifier-to-improve-the-performance-of-your-ml-model-805345f9de0e>. Acesso em: 10 jun. 2023.

SCIKIT-LEARN. Ensemble Methods. Disponível em: <https://scikit-learn.org/stable/modules/ensemble.html>. Acesso em 10 jun. 2023.

SCIKIT-OPTIMIZE. Disponível em <https://scikit-optimize.github.io/stable/modules/generated/skopt.gp_minimize.html#>. Acesso em 10 jun. 2023.

VALENTE, Domingos Sárvio Magalhães. ELT579 - Aula 8 VotingModel. Disponível em: <https://youtu.be/Fo5QLR8fyZw> . Acesso em 10 jun. 2023.