1. Problema de Negócio

Muito tem sido dito durante os últimos anos sobre como a medicina de precisão e, mais concretamente, como o teste genético, vai provocar disrupção no tratamento de doenças como o câncer.

Mas isso ainda está acontecendo apenas parcialmente devido à enorme quantidade de trabalho manual ainda necessário. Neste projeto, tentaremos levar a medicina personalizada ao seu potencial máximo. Uma vez sequenciado, um tumor cancerígeno pode ter milhares de mutações genéticas. O desafio é distinguir as mutações que contribuem para o crescimento do tumor das mutações.

Atualmente, esta interpretação de mutações genéticas está sendo feita manualmente. Esta é uma tarefa muito demorada, onde um patologista clínico tem que revisar manualmente e classificar cada mutação genética com base em evidências da literatura clínica baseada em texto.

Para este projeto, o MSKCC (Memorial Sloan Kettering Cancer Center) está disponibilizando uma base de conhecimento anotada por especialistas, onde pesquisadores e oncologistas de nível mundial anotaram manualmente milhares de mutações.

Dataset: https://www.kaggle.com/c/msk-redefining-cancer-treatment/overview

-- Objetivos
    - Atingir 65% de precisão.
    - Log Loss menor que 1.0 .

2. Imports

2.1 Ambiente

3. Carregamento dos Dados

4. Analise Exploratoria

É analisado que possuimos valores missing para a coluna 'Text' para uma melhor generalização, e não descartar os dados iremos fazer que os dados missing sejam preenchidos pelo valor de 'Gene' + 'Variation'.

É interessante notar que possuimos 264 'Gene' diferentes e 2996 'Variation', também possuimos 1920 'Text'. Considerando que temos 3321 observações, o numero de 'Variation' unicas é muito alto, podendo prejudicar o modelo.

4.1 Analise Univariavel

Algumas classes como 3, 9 e 8 possuimos muitos poucos dados, o que pode gerar um problema no aprendizado do nosso modelo. Induzindo a determinados víes. Um balanceamento pode auxiliar.

Para melhor entendimento dos dados é interessante analisar o acumulo do numero de genes ao longo da sua distribuição, de forma não cumulativa e cumulativa. Já no segundo grafico mais uma vez é perceptivel que o grafico tende a crescer mais rapidamente no inicio, tendendo a uma forma exponencial.

No primeiro grafico é perceptivel que muitos 'Genes' concentram uma maior taxa de ocorrencia, o que tende a cair rapidamente em relação aos outros.

Analisando abaixo é perceptivel que os 10 Genes com maior frequência representam 36% das classes, assim essas possuem a maior relevancia para o nosso modelo. Porém isso significa que apenas 3.8% dos nossos genes representam 36% das classes.

Apos analisar os genes é necessário analisar a 'Variation' pois essa já foi identificada que possui mais valores unicos.

Apenas as 10 variations de maior relevancia, ou seja 0.33% dos tipos de 'Variation' representam um total de 8.85% das classes alvo.

É perceptivel que possuem algumas poucas 'Variations' que possuem uma relevancia muito maior que as outras, porém o restante possui uma relevância similar. Observando a variancia acumulada temos o mesmo comportamento, um pulo no inicio e após um crescimento que se torna constante.

4.2 Tabela de Contigencia

Analisando de forma generalizada é perceptivel qque determinados 'Gene' estão amplamente concentrados em uma categoria, o mesmo serve para 'Variation' que possui uma especificidade ainda maior.

Por exemplo, o 'Gene' ABL1 estã 92% na classe 2 e o restante, 7.69%, na classe 7. Já para 'Variation' o valor '1_2009trunc' esta 100% na classe 1.

QUI-QUADRADO

Analisando o teste do qui-quadrado, as nossas variaveis apontam uma alta taxa de confiança entre a relação de ambas as variaveis qualitativas com a variavem target.

Visto que não possuimos dados quantitativos, a analise exploratoria finaliza por aqui. Concluindo que possuimos muitos valores unicos para ambas as features qualitativas. Possuimos uma grande parcela das classes atribuidas a poucos 'Genes' e 'Variations'.

Ambas as variaveis quantitativas possuem associação com a variavel target. O nivel de confiança é alto.

5. Pre Processamento

Possuimos valores NA para a coluna 'Text', para um melhor tratamento iremos subsituir o seu valor por: 'Gene' + 'Variaton'.

Iremos executar uma série de operações para realizar a limpeza do texto e generalizar para os algoritmos:

Lemmatization:

Segue comparação abaixo entre o texto da primeira linha antes de ser processado e após ser processado.

5.1 TFIDF

Iremos calcular o TFIDF das palavras para entendermos a frequencia de ocorrencia por frase x documento. Porem iremos solicitar um df minimo para a palavra ser considerada, assim não iremos contar palavras com poucas ocorrencias, também iremos considerar que pode ser considerado: unigrama, bigrama e trigrama para uma melhor contextualização. Por ultimo iremos limitar a somente 1000 features em nosso TFIDF, assim buscando as palavras com maior impacto.

5.2 Truncated SVD

Iremos utilizar o algoritmo de TruncatedSVD para reduzir os nossos dados a componentes, a sua vantagem em relação ao PCA é que o TruncatedSVD trabalha melhor com dados esparsos. A sua diferença é que não é realizado uma centralização dos dados. Assim irá ter melhores resultados com a nossa matriz de TFIDF.

Para o nosso caso 1000 componentes será o suficiente para o nosso modelo cobrir os dados, então iremos de 100.000 features para 1000 componentes, assim reduzindo a nossa dimensionalidade.

5.3 One Hot Encoding

Iremos utilizar one hot encoding para converter as nossas classes categoricas como 'Gene' e 'Variation' em numericas. Porém essas classes não apresentam hierarquia, assim iremos optar por One Hot Encoding e não Labelencode.

Agora iremos concatenar os componentes do TruncatedSVD, gerados apartir do TFIDF no datatable final.

5.4 Salvando/Carregando Dataset

Antes de iniciarmos a fase de treino é interessante salvarmos em um aruivo '.csv' os dados, assim para execuções futuras não é necessário executar as etapas anteriores.

6 Treino, Teste e Validação

Iremos separar os nossos dados em treino, teste e validação. Onde os dados de validação serão retirados dos dados de treino e utilizados para otimização durante o treinamento. Já os dados de teste serão separados de forma que não interfiram no resultado final.

6.1 Distribuição por conjunto

7. Modelagem Preditiva

7.1 Criação de Modelos Bases

Primeiramente iremos criar os modelos bases para entender qual comportamento é melhor para os nossos modelos preditivos. Os modelos bases irão ser criados com as seguintes configurações:

- Balanceamento em treino = True or False
- Calibracao = True or False
- Conjunto de calibracao: Treino ou validacao

Para as configuracoes acima, iremos utilizar os seguintes algoritmos: Regressão Logistica, Linear SVM, Random Forest, XGBoost e KNN.

Abaixo visualizamos que os 2 melhores modelos são do mesmo algoritmo, Random Forest. A unica diferença entre eles é em relação ao balanceamento um possuo e o outro não.

Configuração do melhor modelo:

7.2 Tuning Random Forest

Com a escolha do melhor algoritmo como sendo Random Forest, iremos realizar o seu Tuning. Tentar encontrar os melhores hiperparametros.

Verificando as métricas do modelo inicial tanto em treino e teste, é perceptivel que o nosso modelo sofre de overfitting, esse pode ser um dos problemas para uma baixa precisão em dados de teste. Assim iremos ter que podar a nossa arvore para atingir melhores resultados.

8 Conclusão sobre Random Forest

Através da execução de diversos algoritmos e tuning foi observado que conforme o Log Loss aumentava conseguiamos uma maior precisão em algumas classes. Porém isso significa que estamos aumentando nossa precisão ao mesmo tempo que aumentamos a nossa taxa de incerteza sobre as previsões.

Assim sendo, foi optado por aumentar a precisão ao inves de diminuir o Log Loss. Um dos problemas observados ao longo do processo foi o overfitting que apesar de alto conseguimos reduzir um pouco.

Foi realizado testes usando dados balanceados e desbalanceados, com ou sem calibração, conjunto de validação... Foi alterado os parametros durante o pre processamento, aumentando e diminuindo o total de componentes. Também foram realizados testes com diferentes numeros de 'features' geradas pelo procedo TFIDF.

Sugestões de melhoria:

- Otimizar outros algoritmos como XGBoost e/ou SVM.

Hiper parametrização do melhor modelo:

- Algoritmo: Random Forest
   - random_state = 194
   - class_weight = 'balanced'
   - n_jobs = 4
   - criterion = 'entropy'
   - max_depth = 8
   - max_features = 'auto'
   - min_samples_leaf = 4
   - min_samples_split = 6
   - n_estimators = 1000

8.1 Execução do Melhor Modelo

8.2 Analise do Melhor Modelo Random Forest

A analise do modelo realizada abaixa comprova que os componentes gerados pelo apartir do TFIDF são de extrema importância. Assim podemos tentar aumentar a qualidade dos nossos componentes ou da extração do TFIDF. O grande problema é em relação ao custo computacional gerado com o aumento dos anteriores.

9. Treinamento XGBoost

Após verificar que o algoritmo RandomForest estava tendendo muito ao overfitting e com dificuldade de diminui-lo por hiperparametro. Foi optado por utilizar o XGBoost que já apresentou resultados melhores para casos similares.

10 Conclusão sobre XGBoost

Através do treino do algoritmo de XGBoost. Não foi possivel aumentar a precisçao do modelo, isso se da pelo sua alta complexidade, talvez seja melhor optar por modelos como SVM que podem lidar melhor com altas dimensionaliades.

Sugestões de melhoria:

- Otimizar outros algoritmos como Linear SVM e Regressão Logistica.

Hiper parametrização do melhor modelo:

- Algoritmo: XGBoost
        - 'objective': 'multi:softmax'
        - 'num_class': 10
        - 'random_state': 194
        - 'nthread': 2
        - 'colsample_bynode': 1
        - 'colsample_bytree': 1
        - 'gamma': 0.5
        - 'learning_rate': 0.5
        - 'max_depth': 6
        - 'min_child_weight': 1
        - 'subsample': 0.8
        - 'colsample_bylevel': 1

10.1 Executando Melhor Modelo XGBoost

10.2 Analise do Melhor Modelo XGBoost

O XGboost possui um comportamento diferente, onde as variaveis geradas pelo One Hot Enconde de 'Gene' e 'Variation' possuem um destaque um pouco maior. Porém o seu desempenho ainda não foi superior ao Random Forest.

11 Treinamento Regressão Logistica

Após testar dois modelos baseado em Arvores, percebemos que esses não se adaptam tão bem aos dados que possuimos. Com isso iremos tentar utilizar a Regressão Logistica. Visto que esse tende a se adaptar melhor a generalizações massivas, com probabilidades como TFIDF.

11.1 Executando Melhor Modelo Regressão Logistica

11.2 Analise Melhor Modelo Regressão Logistica

A Regressão Logistica conseguiu apresentar o menor log loss, o que é positivo. Ainda em relação aos outros algoritmos foi perceptivel que a Regressão Logistica deu mais valor a variaveis geradas pelo One Hot Encoder. Comportamento esse que já tinhamos analisado no XGBoost.

12 Conclusão

Após um trabalho grande na analise exploratoria, pre-processamento, modelagem... Foi possivel chegar a 2 modelos como os melhores. O primeiro possui overfitting elevado mais apresenta maior precisão, gerado pelo algoritmo do Random Forest e analisado anteriormente. Posteriormente foi utilizado a Regressão Logistica por suas caracteristicas em maior generalização e trabalho com features probabilisticas, onde encontramos o menor Log Loss, porém a precisão não se satisfez.

Assim, não conseguimos concluir ambos os objetivos estabelecidos no mesmo modelo. Somente em modelos separados, ainda foi visto que seria possível continuar esse trabalho com novos parametros e uma maior intensidade no pre-processamento dos dados. Infelizmente devido aos limites computacionais da maquina utilizada para o projeto, não foi possivel realizar o mesmo.