As doenças cardiovasculares hoje são a maior causadora de mortes no mundo, estimado que 31% das mortes no mundo estão relacionadas a doenças cardiovasculares. Essas doenças causam diretamente a falha do coração que levam a morte do individuo.

A maioria das doenças cardiovasculares podem ser evitadas com pequenos cuidados, porém é dificil saber se algum individuo irá possuir uma doença cardiovascular, dessa forma Machine Learning é de grande utilidade para auxiliar na prevenção dessas doenças.

O objetivo desse projeto é a previsão se o paciente irá ser levado a uma falha cardiovascular pelo desenvolvimento de alguma doença.

 -- Objetivos

  É esperado um Recall minimo de 75% para a classe 0 (DEATH_EVENT não ocorreu). Já para a classe 1 (DEATH_EVENT ocorreu) é esperado um Recall de 85%. 

  A escolha dos objetivos é baseado em algumas analises iniciais, sabendo que o nosso dataset não possui muitas observa-ções e esta desbalanceado. Dessa forma irá precisar de uma modelagem mais cuidadosa para atingir um modelo ideal. 

  Também foi escolhido que iremos priorizar que o algoritmo acerte quem irá MORRER. Dessa forma poderia ser iniciado um tratamento para o paciente antecipadamente.

Dataset: https://www.kaggle.com/andrewmvd/heart-failure-clinical-data

Variaveis

Explicação dada pelo autor no tópico: https://www.kaggle.com/andrewmvd/heart-failure-clinical-data/discussion/193109

Feature Explanation Measurement Range
Age Age of the patient Years [40,…, 95]
Anaemia Decrease of red blood cells or hemoglobin Boolean 0, 1
High blood pressure If a patient has hypertension Boolean 0, 1
Creatinine phosphokinase (CPK) Level of the CPK enzyme in the blood mcg/L [23,…, 7861]
Diabetes If the patient has diabetes Boolean 0, 1
Ejection fraction Percentage of blood leaving Percentage [14,…, 80]
Sex Woman or man Binary 0, 1
Platelets Platelets in the blood kiloplatelets/mL [25.01,…, 850.00]
Serum creatinine Level of creatinine in the blood mg/dL [0.50,…, 9.40]
Serum sodium Level of sodium in the blood mEq/L [114,…, 148]
Smoking If the patient smokes Boolean 0, 1
Time Follow-up period Days [4,…,285]
(target) death event If the patient died during the follow-up period Boolean 0, 1
    * Sex - Gender of patient Male = 1, Female =0
    * Diabetes - 0 = No, 1 = Yes
    * Anaemia - 0 = No, 1 = Yes
    * High_blood_pressure - 0 = No, 1 = Yes
    * Smoking - 0 = No, 1 = Yes
    * DEATH_EVENT - 0 = No, 1 = Yes

Imports

Ambiente

Coleta dos Dados

1. Analise Exploratoria

É verificado que possuimos apenas 299 registros, o que significa que possuimos poucos dados para trabalhar. Assim, temos que tomar cuidado com a manipulação nos dados e tentar evitar qualquer remoção de registro. É perceptivel que o dataset é composto por pessoas acima de 40 anos, e com uma média de 60 anos, levando a uma população mais velha.

É verificado que a variavel 'Age' esta classificada como float, o que pode ser um erro e iremos converter para inteiro. Já em relação as outras variaveis não tem nada errado, algumas variaveis que poderiam ser boolean estão como inteiro, mas isso não causa nenhum problema para o algoritmo.

Também é verificado que nenhuma informação é perdida com essa transformação.

Para uma melhor compreensão iremos separar o dataset em variaveis categoricas e continuas, assim podemos utilizar de tecnicas especificas para cada tipo.

Verificando o boxplot abaixo das variaveis continuas, é notavel que a variavel 'creatinine_phosphokinase', 'serum_creatinine' e 'platelets' possuem um auto numero de outliers, principalmente as duas primeiras. Esses outliers estão concentrados acima do Q3.

Para uma melhor visualização iremos tentar transformar as variaveis continuas para log.

A transformação nos levou a alguns insights, como que a variavel 'time' pode possuir outliers se convertido em log, já outras variaveis como 'creatinine_phosphokinase' passam a não ter presença significativa de outliers.

É notado que as variaveis continuas possuem uma tendência para inversamente proporcional, porém essa tendencia é fraca, mostrando valores quase que nulos para a correlação. É notado que a variavel 'creatinine_phosphokinase' e 'platelets' não aparentam possuir correlação com a variavel target.

É perceptivel que Time, esta altamente correlacionado com a variavel target, pois é uma variavel que não pode pertencer ao dataset, visto que indica o tempo em meses até a falha cardiovascular do paciente depois da consulta ao medico, visto que essa variavel não seria capturada em um cenario real deve ser removida do dataset.

É verificado que o nosso dataset possui um desbalaneamento notavel, visto que aproximadamente 66% das variaveis é da classe 0 (não ocorreu falha cardiovascular) e 33% da classe 1 (ocorreu falha cardiovascular).

Para alguns insights iremos comparar a relação por um stacked barplot entre as variaveis categoricas e target. Para os graficos abaixo a grande surpresa fica no ultimo, 'smoking' onde é percebido que os não fumantes, classe 0, morrem mais que os fumantes, classe 1. Claro, isso é uma analise de somente uma métrica, para se ter certeza teriamos que analisar mais metricas.

1.1 Distribuição dos Dados

Iremos verificar se os nossos dados possuem uma distribuição Gaussiana ou não. Dessa forma iremos entender quais metodos estatisticos utilizar. Distribuições Gaussianas utilizam de métodos estatisticos paramétricos. Já o contrário utiliza de métodos estatisticos não paramétricos. É importante entender qual método utilizar para não termos uma vissão errada sobre os dados.

Analisando as variaveis abaixo:

Age: Aparenta ser uma variavel com o comportamento Gaussiano, possui alguns pontos fora da linha mas nada muito grave.

creatinine_phosphokinase: Não apresenta comportamento Gaussiano, possui muitos pontos constantes e esta fora da linha de dados Gaussianos.

ejection_fraction: Possui um leve comportamento Gaussiano, os pontos tendem a seguir a reta, porém muitos pontos estão saindo da linha.

platelets: Possui forte comportamento Gaussiano, possui alguns pontos fora da linha mas nada grave.

serum_creatinine: Não apresenta comportamento Gaussiano, possui muitos pontos constantes e esta fora da linha de dados Gaussianos. Apesar disso parece seguir levemente a linha.

serum_sodium: Possui forte comportamento Gaussiano, possui alguns pontos fora da linha mas nada grave.

time: Apresenta fortes indicios de comportamento Gaussiano, porém os dados estão constantemente cruzando a reta.

Abaixo iremos utilizar 3 metodos estatisticos baseado em Hipotese para avalidar os nossos dados, onde:

p <= alfa: Rejeita H0, dados não são Gaussianos.

p > alfa: Falha ao rejeitar H0, dados são Gaussianos.

1.1.1 Tesde de Shapiro Wilk

O teste de Shapiro Wilk é ideal para avaliar amostras ou conjuntos menores de dados, avaliando a probabilidade de que os dados tenham sido extraidos de uma distribuição Gaussiana.

1.1.2 Teste normal de D'Agostino

O teste Normal de D'Agostino avalia se os dados são Gaussianos utilizando estatisticas resumidas como: Curtose e Skew.

1.2 Tabela de Contigencia

Analisando a tabela de contigência abaixo não é possível afirmar se uma variavel categorica possui relação para a classificação da variavel target. Para confirmarmos as nossas hipoteses, iremos seguir para a Correlação de Spearman e Qui-Quadrado.

1.3 Correlação de Spearman

Analisando a Correlação de Spearman abaixo as variaveis Categoricas possuem correlação semelhante com a de Pearson, porém um pouco menor. Isso significa que os nossos dados possuem uma correlação mais constante, entretando os nossos dados também possuem variaveis que não aumentam de forma constante.

1.4 QUI-QUADRADO

Comparando o p-value para as variaveis categorigas nós não conseguimos rejeitar a hipotese nula, concluindo que as nossas variaveis não estão correlacionadas com a target.

1.5 Cox Proportional Hazards

Iremos utilizar o algoritmo de Cox Proportional Hazards, já que é famoso por associar as variaveis preditoras corretas para aumentar a chance de sobrevivencia de um individuo. Esse algoritmo é amplamente utilizado para dados médicos, sendo assim irá ser traçado a chance de sobrevivencia pelo tempo.

O dataset utilizado possui uma variavel 'time', essa que mede o tempo da ultima consulta do paciente até a falha cardiovascular. Já que essa variavel não irá ser utilizada no dataset final, visto que não iremos saber quando o paciente irá morrer, iremos utiliza-la antes para associar as variaveis.

O modelo nos indica que as variaveis 'high_blood_pressure', 'anaemia', 'serum_creatinine', 'diabetes', 'smoking' e 'age'. Apresentam forte confiança para indicar os riscos de falha cardiovascular.

Abaixo possuimos um resumo estatistico apresentado pelo modelo:

Valores de 'p' onde (p < 0.05) indicam que as outras colunas possuem uma avaliação confiavel e possuem uma boa significancia para o modelo.

Altos valores de 'coef' indicam que o aumento dessa variavel leva ao aumento do risco de falha cardiovascular. É perceptivel esses valores para a variavel 'anaemia', 'high_blood_pressure' e 'serum_creatinine'.

O valor de 'coef', 'exp(coef)', 'exp(coef) lower 95%' e 'exp(coef) upper 95%' estão relacionados do maior valor para o menor. Por exemplo 'anaemia' é uma variavel categorica com valor 1 e 0. Então estamos relacionando a chance de ter anaemia (1) com a chance de não ter (0).

O que significa que para a variavel 'coef' o seu aumento, valor 1, aumenta o risco de falha cardiovascular.

O atributo 'exp(coef)' indica a relação de riscos covariaods a variavel. De forma que o aumento daquela variavel aponta um risco Y em um fator X, X = 'exp(coef)'. Por exemplo a variavel 'Anaemia' tem que o seu aumento é prejudicial de acordo com 'coef', e temos em 'exp(coef)' que o seu aumento é prejudicial em um fator de 58% (1 - 1.58), por outra lado a sua diminuição é 42% benéfica (1 - 0.58).

Os atributos 'exp(coef) lower 95%' e 'exp(coef) upper 95%' indicam os seus intervalos de confiança.

Já para os atributos globais, possuimos uma 'concordance' alta, o que é bom. Seguindo para 'Partial AIC' percebe-se que o modelo utilizado não apresenta resultados muito bons. Porém olhando para o 'log-likelihood ratio test' nos indica que modelos do mesmo tipo tem um ganho significativo se bem parametrizados.

Analisando as chances de sobrevivencias de dois individuos, percebemos que claramente o tempo é um fator decisivo na sua chance de sobrevivência.

Abaixo é realizado uma analise cada variavel de forma individual, de forma que o nosso objetivo é ver o impacto de cara variavel desconsiderando as outras. Assim, o ideal é olhar para as variaveis de forma unificada como foi feito anteriormente olhando o resumo estatistico.

É claramente perceptivel que aumentando a idade do individuo as suas chances de sobrevivencia são menores ao longo do tempo.

Um individuo de 35 anos após 250 dias, ainda teria quase 95% de chance de sobrevivencia, enquanto uma pessoa com 60 anos teria 76%, já uma pessoa com 75 anos teria 65%. Essa diferença vai aumentando cada vez mais apartir dos 60 anos, chegando até os 95 anos, onde no mesmo periodo de tempo uma pessoa teria 30% de chance de sobrevivencia.

É perceptivel que a maioria das pessoas com CPK no sangue até 1000 mcg/L possuem chances de sobrevivencia similares, porém com o seu aumento para 2000 já temos um grande pulo de menos 10% na chance de sobrevivencia, já para 4000 o nosso pulo é de mais de 20%.

O que faz total sentido já que um exame normal deve constar valores entre 10 e 120 mcg/L no sangue. Valores alto constumam indicar riscos de ataqque cardiaco, convulsão, delirio...

Já a variavel 'ejection_fraction' é proporcinal as chances de sobrevivencia, ou seja seu aumento é positivo para o individuo, é esperado taxas entre 50% e 75%. Menos que 50% começa a apresentar riscos a saude, e abaixo de 40% apresenta graves riscos.

Contudo é perceptivel que a variavel 'platelets' não possui grande significancia tanto para o aujmento ou diminuição nas chances de sobrevivencia do individuo.

A variavel 'serum_creatinine' aparenta possuir forte relação com as chances de sobrevivencia, visto que o seu valor em 1 mg/dl apresenta uma chance se sobrevivencia proximo a 90%, já em 3 mg/dl caimos para 75%, 5 mg/dl para 50% até chjegarmosa em 9 mg/dl com 10% de sobrevivencia.

Isso é totalmente normal, visto que o normal é um resultado entre 0.74 e 1.35 mg/dl para homens e 0.59 a 1.04 mg/dl para mulheres. Qualquer valor fora dessas margens já começa a ser preocupante, apresentando sinais de má função renal.

Por outro lado a variavel 'serum_sodium' aparenta possuir uma relação moderada com nosso alvo, considerando que valores maiores aumentam a taxa de sobrevivencia. Sendo esperado em um resultado normal valores entre 135 e 145 mEq/L. Sendo preocupante valores menores que 135 mEq/L, indicando riscos de fadiga, nausea, perda de consciência e até coma.

Visualizando a regressão para os dados categoricos é perceptivel que algumas variaveis não possuem tanto impacto em relação a outras.

A variavel 'Anaemia' possui ganho significativo. Pessoas sem 'Anaemia' possuem 10% a mais de chance de sobreviver.

A variavel 'Diabetes' não possui ganho significativo. Pessoas com 'Diabetes' não possuem chances muito maior de sobrevivencia.

A variavel 'high_blood_pressure' possui ganho significativo. Pessoas sem 'high_blood_pressure' possuem 10% a mais de chance de sobreviver.

A variavel 'sex' possui ganho pequeno. Pessoas do 'sex' 0 (Feminino) possuem 5% a menos de chance de sobreviver o 'sex' 1 (Masculino).

A variavel 'Smokinng' não possui ganho significativo. Pessoas que fumam não possuem chances muito maiores de sobrevivencia.

Devido ao time ser uma variavel que possui valores inexistentes em um cenario real, irá ser removida do dataset.

2. Avaliando a MultiColinearidade

2.1 Autovetores

Para avaliarmos a multicolinearidade iremos utilizar de correlação e atribuir aos metodos de autovetores. Onde iremos ter a variancia acumulada entre as variaveis. Para esse avaliação iremos utilizar somente as variaveis continuas.

Captando as informações é dito que possui alta correlação entre as variaveis 'age', 'ejection_fraction', 'platelets', 'serum_creatinine' e 'serum_sodium'. Portanto é importante analisar se a multicolinearidade realmente existe, pois analisando o mapa de calor essa correlação não parece ser forte, chegando a no maximo 0.25.

2.2 Visualizando Multicolinearidade

Analisando os scatterplots abaixos não é notavel uma grande correlação entre as variaveis indicadas, sendo assim não podendo determinar de imediato a existencia de multicolinearidade.

Algumas analises sobre cada variavel continua em relação com a variavel target.

Age: O seu valor tende a ser maior na classe 1, representado pela média e pelos quartis inferiores/superiores. Esse valor já era esperado devido ao aumento da vulnerabilidade na classe idosa.

Ejection_Fraction: O seu valor tende a ser menor na classe, representando um cenário onde pessoas que morrem por doenças cardiovasculares tem uma menor taxa de sangue saindo do corpo.

Serum_creatine: É visto que claramente o seu aumento no sangue leva a maiores taxas de falha cardiovascular. Esse é um fato que gera muita controversia apesar de já terem estudos que comprovem o fato, agora temos dados.

Serum_sodium: Conforme o seu valor desce maior a taxa de falha cardiovascular por doença cardiovascular. É perceptivel que apartir de valores menores que 135mEq/L a taxa da classe 1 aumenta muito, isso se da principalmente pela Hiponatremia.

Time: Claramente de acordo com o seu declineo possui um aumento avassalador na classe 1. O que faz total sentido visto que pessoas que visitam o médico mais tarde quando a doença já possui uma maior gravidade, tem menos tempo de reagir a um tratamento.

Por ulitmo, é interessante analisar o scatterplot de todas variaveis continuas e não somente as que possuem multicolinearidade. Assim conseguimos ter um overview de nossas variaveis.

3. Pre-Processamento

3.1 Detectando Outliers

Ao olharmos para a distribuição dos nossos dados para verificar se obedecem a uma distribuição normal Gaussiana, e tambem para entender a tendencia dos valores, positiva ou negativa, iremos utilizar a métrica de skew. Onde é possível verificar que os nosos dados em sua maioria obedecem a uma distribuição normal Gaussiana, alguns com tendencia positiva e outros negativos, com exceção da variavel 'serum_creatine' que aparenta não obedecer a uma distribuição normal. image.png

Para termos um contraste dos numeros apresentados, iremos trazer o histograma de cada variavel acima. É verificado que a variavel 'age' se aproxima de uma distribuição normal enquanto as outras variaveis em sua maioria seguem para uma simetria negativa.

Uma das estatisticas que pode ser de grande importância para a detecção de outliers é Exceço de Kurtosis, onde podemos entender facilmente as variaveis que possuem muitos valores distuantes (outliers). Onde a sua formula é constituiada em:

Exceço de Kurtosis = Kurtosis - 3

Mesokurtic -> Exceço de Kurtosis ~= 0: Outliers proximo a distribuição normal.

Leptokurtic -> Exceço de Kurtosis < 0: Muitos outliers, onde estão tendo peso consideravel.

Platykurtic -> Exceço de Kurtosis > 0: Poucos outliers, onde não estão tendo um peso muito consideravel.

Para um melhor entendimento sobre os numeros oferecidos pela metrica de Exceço de Kurtosis, iremos trazer o boxplot de cada uma dessas variaveis. É perceptivel que nas variaveis 'age' e 'ejection_fraction', por possuirem uma kurtosis muito negativa os seus outliers são quase que imperceptiveis, visto que não trazem peso para o problema. Porém a variavel 'creatinine_phosphokinase', 'platelets' e 'serum_creatinine' possuem muitos outliers, trazendo grande peso ao boxplot.

3.2 Removendo Outliers

Analisando novamente o Skew e o histograma, é perceptivel que os dados perderam um pouco do seu formato.

Já analisando a Kurtosis é perceptivel que os dados tiveram os seus outliers ajustados, passando a não exibirem valores extremos com frequência.

3.3 Padronização dos Dados

Para os algoritmos que iremos aplicar como K-means e SVM o ideal é utilizar a Padronização ao invés da Normalização.

4. Balanceando os Dados

É demonstrado abaixo que os dados estão desbalanceados, com aproximadamente dois terços da base sendo da classe 0. Assim o nosso modelo irá se tornar tendencioso, iremos tentar utilizar tecnicas de balanceamento como SMOTE para melhorar os resultados.

Após um balanceamento é notavel um aumento significativo de ocorrências na classe 1, que passa a conter 193 casos contra 203 para a classe 0.

5. Feature Selecting

Para aumentar a generalização do nosso modelo, evitando futuro overfitting, podemos aplicar de técnicas de Feature Selecting para a redução de algumas variaveis. Antes é importante ressaltar quais insights já foram dados ao longo da analise exploratória.

1 - A variavel 'times' já foi removida do dataset e não será utilizada visto que possui ligação direta com a variavel target, sendo uma variavel coletada somente após o evento acontecer.

2 - Age: O seu valor tende a ser maior na classe 1, representado pela média e pelos quartis inferiores/superiores. Esse valor já era esperado devido ao aumento da vulnerabilidade na classe idosa.

3 - Ejection_Fraction: O seu valor tende a ser menor na classe, representando um cenário onde pessoas que morrem por doenças cardiovasculares tem uma menor taxa de sangue saindo do corpo.

4 - Serum_creatine: É visto que claramente o seu aumento no sangue leva a maiores taxas de falha cardiovascular. Esse é um fato que gera muita controversia apesar de já terem estudos que comprovem o fato, agora temos dados.

5 - Serum_sodium: Conforme o seu valor desce maior a taxa de falha cardiovascular por doença. É perceptivel que apartir de valores menores que 135mEq/L a taxa da classe 1 aumenta muito, isso se da principalmente pela Hiponatremia.

6 - Aparenntemente as variaveis 'age', 'ejection_fraction', 'platelets', 'serum_creatinine' e 'serum_sodium' apresentam multicolinearidade, porém ao plotar as variaveis e visualizar os dados, não aparentam demonstrar muita correlação.

5.1 XGBOOST

5.2 RFE (Recursive Feature Elimination)

5.3 Extra Trees Classifier

5.4 Aplicando Feature Selecting

Analisando os 3 algoritmos de Feature Selection, sendo dois baseados em algoritmos ensemble e um em eliminação recursiva. Possuimos o seguinte cenário, os 3 modelos concordaram que as variaveis 'ejection_fraction', 'serum_creatine', 'serum_sodium' e 'age' devem ser incluidas. Após analisar a correlação das variaveis e suas distribuções foi optado por utilizar as 6 primeiras variaveis do modelo XGBOOST, além das 4 citadas anteriormente serão incluidas 'sex' e 'smoking' essas que apresentaram uma relevância importante para o modelo. Essas se encaixam nas analises também feitas estatisticamente, o que representa um bom sinal em relação a analise humana e a do algoritmo.

5.4.1 Feature Selecting Baseado em Arvore - Mantendo Multicolineares

5.4.2 Feature Selecting Baseado em Arvore - Excluindo Multicolineares

5.4.3 Feature Selecting Baseado no Cox Proportional Hazard - Mantendo Multicolineares

5.5 Visualizando Resultado do Feature Selecting

6. Modelagem Preditiva

Iniciando o ciclo de modelagem preditiva o nosso objetivo é treinar dois modelos, o primeiro modelo será o K-Means e após o SVM, primeiramente iremos utilizar o K-means para entender se o nosso modelo consegue separar as classes da forma correta, dessa forma iremos ter um melhor overview para treinar um modelo mais complexo como SVM.

6.1 K-Means

Para o modelo K-means onde o K seria o numero de classe, não iremos realizar nenhum estudo sobre o numero de classes pois já sabemos com absoluta certeza quantas classe possuimos. Para esse problema, possuimos 2 classe, 0 ou 1, mais especificamente Morto ou Vivo. O unico objetivo com esse modelo é saber se os nossos dados possuem uma boa representatividade para algoritmos de Machine Learning.

Uma métrica que iremos utilizar será 'Hopkins' que irá nos dizer se os nossos dados são clusterizaveis.

Valores > .5 significam que o dataset não é "clusterizável"

Valores < .5 significam que o dataset é "clusterizável"

Quanto mais próximo de zero melhor.

É perceptivel que os dados com normalização e feature selecting são os que possuem melhores resultado. Isso se da pois algoritmos como K-Means tendem a ter melhores resultados bons com normalização, baseando se na distância. Assim a normalização ficou com 0.14 e a padronização 0.22.

Para o primeiro modelo iremos utilizar as variaveis de x sem o balanceamento nos dados, pois esse fator não deve ter um grande impacto, visto que precisamos separar os clusters e não os classificar.

O Silhouette score varia entre -1 e 1, quanto mais próximo de 1 melhor.

O segundo modelo iremos utilizar dados balanceados.

Para a separação dos dados entre dois clusters, foi visto que o nosso modelo teve uma piora significativa em relação ao anterior após utilizar dados gerados artificialmente para forçar o balancemanto.

Analisando os resultados acima é tomada algumas conclusões. Primeiramente, como esperado não pode se esperar que um conjunto de dados para classificação possua bons resultados para clusterização. Temos isso representado no Silhouette Score de 0.41 do terceiro modelo, representando que o cluster possui tendência a não ser clusterizavel. Porém iremos seguir para um algoritmo mais complexo tentando extrair as previsões dos dados que possuimos.

Já é alertado que um dos problemas que iremos ter posteriormente é a pouca quantidade de dados, o que irá dificultar a aprendizagem do algoritmo.

Observação

Irá ser adotado a nomeclatura 'VIVER' para o paciente que não tiver uma falha cardiovascular e 'MORRER' para o que tiver, essa nomeclatura foi adotada pois lendo artigos e outras submissões de notebooks do mesmo tipo, é preferivel adotar essa nomeclatura, já que uma falha cardiovascular desse tipo teria altas chances de levar o paciente a falecer.

Essa nomeclatura também tem relacão com o nome da variavel no dataset, 'DEATH_EVENT'.

6.2 SVM

Abaixo iniciamos a modelagem utilizando o algoritmo SVM, posteriormente ainda iremos testar com o algoritmo XGBoost. Entretanto o notebook não terá mais tantas anotações, isso se da pois é uma etapa de modelagem e treinamento intenso. Caso prefira, no final do notebook ainda tem o item 7 abordando as conclusões e apresentando os resultados do modelo final utilizado.

É visualizado que os modelos que mais se destacam são a Versão 01 e 04. Em que que a versão 01 esta muito orientada pelos individios que irão morrer. Contudo, o nosso foco é saber quem irá morrer nas condições atuais, assim podemos evitar a falha cardiovascular. Para isso o modelo da Versão 04 teve uma melhora significativa.

Agora iremos utilizar o grid e random search cv, para termos uma ideia inicial dos melhores hiperparametros do algoritmo.

Após inumeros testes é perceptivel que os melhores hiperparametros escolhidos pelo GridSearchCV são:

{'C': 0.0001, 'class_weight': 'balanced', 'gamma': 'scale', 'kernel': 'rbf', 'random_state': 194}

O nosso modelo tende que a aumentar o recall para a classe 1 (MORRER) quando aumenta o 'C' e diminui o 'Gamma', porém o Recall também cai para a classe 0 (Viver). Tentando ajustar os parâmetros para ter um tradeoff ideal, não se mostrou favoravel. O problema esta na quantidade de dados.

6.3 XGBOOST

O modelo de SVM não conseguiu encontrar os melhores vetores de suporte para separar os nossos dados com uma margem consideravel. Analisando os resultados o nosso modelo não aparenta estar sofrendo de overfitting. O nosso problema esta no tamanho do nosso dataset, possuimos poucos dados, para tentar melhorar o nosso Recall, iremos utilizar o algoritmo XGBoost, esse possui desempenhos melhores em dataset menores, pois combina multiplos algoritmos para realizar as predições, esse que pertence a familia dos ensemble.

Para o algoritmo XGBoost o modelo que melhor apresentou resultado foi a terceira versão sem feature selecting,com padronização e balanceamento. Esse modelo também apresentou um aumento na sua Especificidade podendo causar um futuro overfitting. Iremos tentar otimizar os parâmetros evitando o overfitting.

7. Conclusão

Após uma vasto trabalho no problema, conseguimnos atingir um Recall que o problema. O objetivo era um Recall de 75% para a classe 0 (VIVER) e 85% para a classe 1 (MORRER), atingimos 75% e 86%, respectivamente. Ao longo do notebook foram encontrado alguns problemas com o dataset, como por exemplo o seu tamanho que é muito pequeno, 299 observações, desbalanceamento entre as classes, algumas features de baixissima qualidade...

Porém com um alto processamento nos dados, e uma modelagem intensa sobre os algoritmos de Machine Learning conseguimos reduzir o overfitting e alcançar um Recall desejado. É importante ressaltar que todos os parâmetros abaixo foram testados intensamente, tentando explorar ao maximo o espaço de hipotese.

Ao longo do treinamento foram utilizados 3 algoritmos, primeiro iniciamos vendo a disposição dos dados com o algoritmo K-Means, logo após iniciamos a modelagem com o algoritmo SVM, onde tivemos muitas dificuldades devido ao numero de observações. Assim, partimos para um algoritmo que lida melhor com menores quantidades de dados o XGBoost, onde com alta modelagem dos hiperparametros atingimos as métricas desejadas.

Abaixo segue as especificações utilizadas para o resultado final:

Abaixo segue o treinamento do modelo final e suas ultimas interpretações: