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.