Projeto de Machine Learning — Previsão de preço de seguro médico: uma abordagem bem completa

Pandas Couple
17 min readNov 22, 2021

--

Neste projeto, iremos analisar um projeto de ponta a ponta como cientistas de dados em uma empresa. Para essa tarefa, iremos seguir os seguintes passos:

  1. Analisar o panorama geral — Entendendo o problema do negócio;
  2. Obter os dados;
  3. Análise Exploratória dos dados;
  4. Limpeza e preparação dos dados;
  5. Selecionar e treinar um modelo de machine learning;
  6. Aperfeiçoar o modelo;
  7. Apresentar a solução.

Vamos abordando cada passo descrito acima detalhadamente em tópicos. Vamos lá!

1 — Analisar o Panorama Geral

1.1 — Abordar o problema

Em primeiro lugar, você deve entender a motivação do problema. Você deve se perguntar e perguntar ao responsável qual é exatamente o objetivo do negócio? Como a empresa espera usar e se beneficiar desse modelo? Saber isso é importante para guiar a forma que você abordará o problema, quais algoritmos irá escolher, qual indicador de desempenho utilizará para avaliar seu modelo.

No caso desse projeto, o objetivo do negócio é: Prever o preço do seguro médico.

image: Freepik.com

A empresa vai se beneficiar desse modelo, visto que, com ele em mãos, conseguirá fornecer um preço de seguro ao seus clientes de forma rápida, prática e assertiva, economizando uma das coisas mais importantes para uma empresa, dinheiro. A empresa pode também, usar o modelo para redefinir o preço do seguro de um cliente já existente, deixando de perder dinheiro também. Você irá precisar de todas essas informações acima para prosseguir com a solução.

Com a posse desse conhecimento inicial, você deve ainda responder a outras perguntas como:

  • Quais são as soluções/alternativas atuais (caso existam)?
  • Como você deve abordar este problema (aprendizado supervisionado/não supervisionado; online/offline; baseado em instância ou em modelo)?
  • Como o desempenho deve ser medido? Ele está alinhado com o objetivo do negócio?
  • Qual seria o desempenho mínimo necessário para alcançar o objetivo do negócio?
  • Você pode reutilizar experiências ou ferramentas de outros projetos similares?
  • Tem expertise humana disponível?

É claro que essas perguntas podem variar de projeto para projeto, podem ser colocadas outras questões além destas ou, nem todas essas listadas, precisam necessariamente serem respondidas. Não é uma receita de bolo, mas essas listadas costumam servir para a maioria dos projetos de ciência de dados.

No caso desse projeto, claramente temos uma tarefa típica de aprendizado supervisionado, uma vez que há exemplos rotulados de treinamento. Além do mais, também é uma típica tarefa de regressão, pois, estamos tentando prever um valor contínuo. Em termos específicos, trata-se de um problema de regressão linear múltipla univariada. Por fim, podemos utilizar o sistema de aprendizagem offline ou em batch com instância baseada em modelo.

1.2 — Escolha uma medida de desempenho

O próximo passo é escolher uma medida de desempenho. Um modelo de Machine Learning deve ser quantificável, seja em termos de desempenho ou precisão. No caso de modelos de regressão, vamos testar o desempenho do modelo em cima do nosso conjunto de validação e teste usando as métricas abaixo:

  • R2 Score — métrica popularmente usada para calcular a acurácia do seu modelo. Basicamente, calcula como o seu modelo se encaixa aos seus dados, quantificando a qualidade entre 0 e 1. No caso, a melhor pontuação que seu modelo pode atingir é 1.
  • Mean Absolut Error (MAE) — é a média absoluta do erro, representada pela média das somas dos erros individuais (distâncias entre pontos e retas).
  • Mean Squared Error (MSE) — é a média dos quadrados dos erros e provavelmente a métrica mais conhecida. Tende a penalizar exponencialmente os erros, tratando diferentemente erros pequenos e grandes.

1.3 — Verifique as hipóteses

Por último, uma boa prática é enumerar e verificar as hipóteses feitas até agora (por você ou por outros, assim fica fácil identificar os problemas logo de início). Você não vai querer descobrir potenciais problemas após trabalhar semanas ou meses em um modelo equivocado.

image: Freepik.com

2 — Obter os Dados

Hora de colocar a mão na massa! Os dados desse projeto foram extraídos do Kaggle.

Em ambientes tradicionais, os dados estariam disponíveis em um banco de dados relacional (ou em algum outro data store) e distribuídos por várias tabelas/documentos/arquivos. Neste projeto as coisas são bem mais simples: Vamos fazer o download dos dados que estão em um formato csv e transformá-los em um dataframe pandas para começar a trabalhar!

2.1 — Uma rápida olhada na estrutura dos dados

Antes de separar o conjunto em treino e teste e realizar uma análise exploratória mais aprofundada, vamos dar uma olhada rápida no nosso conjunto de dados.

  • Verificar as 5 primeiras linhas do conjunto de dados

Cada linha representa um cliente da empresa que paga pelo serviço de seguro cujo valor está representado na coluna ‘charges’. Essa variável será a nossa variável alvo ou dependente.

O restante das colunas serão as nossas variáveis independentes que representam algumas características básicas dos clientes e que tentarão prever com precisão os valores da variável alvo ‘charges’.

  • Verificar o tamanho, tipo e valores nulos dos dados

Temos um conjunto de dados relativamente pequeno, com 1338 entradas, colunas de diversos tipos (int, floats e strings) que em etapas posteriores teremos que aplicar algum tipo de tratamento e não temos nenhum valor nulo o que é muito bom para a análise.

  • Verificar o resumo estatístico dos dados

Os dados parecem estar de acordo, sem nenhum outlier. Essas medidas estatísticas em questão nos permitem ver como os dados estão distribuidos em termos de posição.

Outra maneira rápida de se ter uma ideia do tipo de dados com os quais você está lidando, é plotar um um histograma para cada atributo numérico.

  • Gráfico histograma

Você deve perceber algumas coisas nesses histogramas:

  1. As variáveis ‘age’ e ‘children’ possuem saídas discretas com alguns picos em determinados valores;
  2. Esses atributos tem escalas muito diferentes. Analisaremos isso mais adiante, quando explorarmos o escalonamento das variáveis;
  3. O histograma da variável ‘bmi’ se assemelha a uma normal, com uma cauda um pouco mais longa a direita;
  4. O histograma da variável ‘charges’ apresenta uma longa cauda a direita, isso pode dificultar a detecção de padrões em alguns algoritmos de machine learning.

Tentaremos transformar esses atributos posteriormente, a fim de conseguirmos mais distribuições em forma de sino (normais).

2.2 — Criando um conjunto de testes

Pode parecer estranho separar o conjunto de dados nessa altura do campeonato. Você apenas deu uma rápida olhada na estrutura dos dados e claramente precisa se aprofundar mais nessa etapa de exploração. A verdade é que nosso cérebro detecta padrões muito facilmente, ou seja, somos propensos ao overfitting: Se você se aprofundar na exploração do conjunto de testes, pode bater o olho em algum padrão interessante, o que o levará a escolha de um algoritmo específico.

Quando você for estimar o erro de generalização, usando o conjunto de testes, sua estimativa será otimista demais e você acabará disponibilizando em produção um sistema que não terá o desempenho esperado. Isso se chama data snooping bias.

3 — Análise Exploratória

Até o momento, você teve um pequeno vislumbre de como as coisas funcionam para entender o conjunto de dados que você está manipulando. Agora o objetivo é aprofundar um pouco mais.

Vamos explorar mais a fundo todo o conjunto de dados de treino.

3.1 — Transformar variáveis qualitativas

Em diversos conjuntos de dados, esse tipo de transformação é necessária, já que os modelos de machine learning não entendem variáveis qualitativas. Nesse caso, iremos transformá-las em quantitativas, para que o modelo possa ser alimentado.

Estamos fazendo transformações nessa etapa, pois, iremos fazer uma análise exploratória e quero que essas variáveis também façam parte dessa análise.

Agora sim, o conjunto de dados será explorado de forma completa, além de estar no formato correto para alimentar os algoritmos de machine learning.

3.2 — Buscando correlações

A correlação mede o grau em que dois fenômenos estão relacionados entre si. O poder da correlação como uma ferramenta estatística é que podemos encapsular uma associação entre duas variáveis ​​em uma única estatística descritiva: O coeficiente de correlação.

Duas variáveis ​​são positivamente correlacionadas se uma variação em uma delas estiver associada a uma variação na outra na mesma direção. Da mesma forma, são negativamente correlacionados se uma variação em uma delas estiver associada a uma variação na outra na direção oposta.

O coeficiente de correlação é um único número que varia de -1 a 1. Uma correlação de 1 é chamada de correlação positiva perfeita. Uma correlação de -1 é chamada de correlação negativa perfeita. Uma correlação de 0 significa que as variáveis ​​não têm associação significativa entre si.

Uma coisa excelente sobre o coeficiente de correlação é que ele não está vinculado a nenhuma unidade.

O aspecto complicado deste tipo de associação é que nem todos os pontos de dados necessariamente se encaixam no padrão.

Não vemos relações tão significativas entre as variáveis independentes, o que é bom, pois, não temos variáveis colineares (redundantes). Também não vemos relações significativas das variáveis independentes com a variável dependente, exceto a variável ‘smoker’ que possui forte correlação. Vamos plotar essas relações com a variável dependente junto do p-value, para vermos o grau de certeza que temos nestes valores.

Além do coeficiente de correlação, podemos usar o p-value para garantir que as correlações que estamos vendo no gráfico são significativas.

As variáveis que possuem forte relações lineares positivas com a ‘charges’ são: ‘age’, ‘bmi’ e ‘smoker’, com destaque para essa última. O restante não possui forte correlação linear, já que os coeficientes deram todos próximos de 0.

Uma outra forma de ver essa relações seria plotando um gráfico de dispersão.

Graficamente confirmamos o que vimos acima, apenas as variáveis ‘age’, ‘bmi’ e ‘smoker’ possuem fortes relações lineares com a variável ‘charges’.

Os atributos mais promissores para prever o valor das cobranças (charges) são esses citados acima.

3.3 — Testando combinações de atributo

Espero que os itens anteriores tenham lhe passado uma boa noção no que diz respeito a algumas formas de explorar e obter informações úteis. Foi possível observar também, que alguns atributos tem uma cauda longa de distribuição, assim sendo, talvez você queira transformá-los (por exemplo utilizando o logaritmo). Obviamente que sua linha de atuação será diferente em cada projeto, mas as ideias gerais são semelhantes.

Uma última coisa que você pode querer fazer antes de preparar os dados para os algoritmos de machine learning é identificar diversas combinações de atributos, como uma espécie de feature engineering. Nesse exemplo aqui, podemos discretizar a variável ‘bmi’ a fim de tentar melhorar a explicabilidade do modelo.

Deixei a ideia aqui para você aplicar nos seus projetos. Falaremos mais sobre feature engineering no próximo tópico.

4 — Limpeza e preparação dos dados

É hora de preparar os dados para seus algoritmos de machine learning. Você deve escrever funções para as seguintes razões:

  • Isso lhe possibilitará reproduzir essas transformações facilmente em qualquer conjunto de dados;
  • Você construirá aos poucos uma biblioteca de funções de transformação que poderão ser reutilizadas em projetos futuros;
  • Você pode usar essas funções em seu sistema ativo para transformar os dados novos, antes de fornecê-los aos algoritmos;
  • Isso lhe possibilitará testar várias transformações facilmente e identificar qual combinação funciona melhor.

4.1 — Limpando os dados

A limpeza dos dados consiste em:

  • Corrigir ou remover outliers (caso necessário);
  • Preencher os valores ausentes ou eliminar suas linhas ou colunas (caso necessário).

No nosso caso não temos nenhum valor ausente, mas acredito que temos alguns outliers na variável ‘bmi’ devido a cauda presente no histograma visto no tópico 2. Vamos eliminá-los.

Veja só, com as nossas funções conseguimos eliminar diversos outliers e substituí-los pela mediana. Optei pela mediana, justamente por ela ser menos sensível a outliers.

Para fazer isso, utilizamos duas funções:

  1. A primeira, é a função de eliminação dos outliers que estão a 2,7 desvios-padrões acima e abaixo da respectiva variável.

Uma das distribuições mais comuns, importantes e úteis em estatística é a distribuição normal. Dados distribuídos normalmente são simétricos em torno da sua média, num formato de sino, conforme gráfico acima.

Continuando nossa análise do desvio padrão, numa distribuição normal conhecemos exatamente que proporção das observações cai dentro de um desvio padrão da média (68,2%), dentro de dois desvios padrões da média (95,4%), dentro de três desvios padrões (99,7%) e assim por diante. Este é o alicerce sobre qual se fundamenta grande parte da estatística.

Vimos no tópico 2, que o histograma da variável ‘bmi’ se assemelhava a uma normal, por isso utilizamos essa estratégia aqui.

  1. A segunda, foi uma função de imputação. A SimpleImputer se encarrega dos valores ausentes. Originalmente não tínhamos nenhum valor ausente no conjunto de dados, mas ao aplicar a primeira função (descrita acima) os valores que eram outliers ficaram nulos, e então utilizamos a função de imputação para preenchê-los com a mediana do conjunto.

Vale ressaltar, que a ‘imputer’ simplesmente calculou a média de cada variável e armazenou o resultado em sua variável ‘statistics_’. Somente a variável ‘bmi’ tinha valores ausentes, mas não podemos ter certeza de que não haverá valores ausentes nos dados novos, uma vez que o sistema entre em produção, por isso é mais seguro aplicar a ‘imputer’ a todos os atributos numéricos.

4.2 — Feature Engineering

Feature Engineering é usar dados, dentro do domínio do conhecimento, e criar features novas para o seu conjunto de dados. Quando você entende esse conceito e aplica corretamente as técnicas de engenharia, melhora ainda mais a capacidade de previsão do seu modelo de machine learning.

The algorithms we used are very standard for Kagglers. […] We spent most of our efforts in feature engineering (Xavier Conort)

Utilizamos essa técnica geralmente para:

  • Discretizar características contínuas;
  • Decompor as características (categóricas, data/hora, etc.);
  • Adicionar transformações promissoras de características (log(x), sqrt(x), x², etc.);
  • Agregar características em novas características promissoras com base em seu conhecimento de negócio.

No nosso caso aqui, iremos apenas discretizar a variável ‘bmi’, ou seja, atualmente ela é uma variável contínua, vamos passa-la para categórica.

Veja a nossa nova coluna ‘weight_Condition’. Agora vamos aplicar outra função que transforme suas entradas qualitativas em quantitativas, para que nosso algoritmo de machine learning aceite suas entradas.

Nosso conjunto de dados está praticamente pronto para alimentar os algoritmos de machine learning, vamos seguir para uma última etapa extremamente importante.

4.3 — Escalonamento das características

Uma das transformações fundamentais que você precisa aplicar aos dados é o escalonamento de características. Salvo raras exceções, os algoritmos de machine learning não funcionam bem quando variáveis numéricas de entrada tem escalas muito diferentes.

Geralmente não é necessário escalonar as entradas da variável alvo.

Há duas formas comuns de todas as variáveis terem a mesma escala: min-max scaler e standard scaler.

O escalonamento min-max (muitos chamam de normalização) é bastante simples: os valores são basicamente deslocados e reescalonados de modo que acabam variando de 0 a 1.

Com a padronização (standard scaler) a coisa é diferente: ela não vincula valores a um intervalo específico, o que pode ser um problema para alguns algoritmos (por exemplo as redes neurais, que geralmente esperam um valor de entrada que varia de 0 a 1). No entanto, a padronização não é tão afetada pelos outliers.

Pipelines

Como você pode ver, existem muitas etapas de transformação de dados que precisam ser executadas na ordem correta. Felizmente a Scikit-Learn fornece a classe Pipeline para ajudar com essas sequências de transformações.

5 — Selecionar e treinar um modelo

Você abordou o problema, obteve os dados e os explorou, gerou uma amostra de um conjunto de treinamento e de um conjunto de testes e escreveu funções e/ou pipelines de transformação para limpar e preparar seus dados para os algoritmos de machine learning. Agora chegou o momento de escolher e treinar um modelo de machine learning.

5.1 — Baseline

Gosto de começar essa seleção de algoritmos definindo um baseline. Esse modelo base, será uma espécie de guia, o desempenho a ser batido. Faremos esse modelo com um algoritmo rápido e simples, a regressão linear.

Avaliaremos os modelos utilizando a validação cruzada para evitar o overfitting, uma boa alternativa é usar o método k-fold. O código a seguir divide aleatoriamente o conjunto de treinamento em cinco subconjuntos distintos chamados folds, depois treina e avalia o modelo cinco vezes, escolhendo sempre um fold diferente para avaliação e treinamento dos outros quatro folds. O resultado é um array que contém cinco classificações de avaliação.

Esse é o desempenho base, que vamos tentar melhorar com outros modelos.

5.2 — Avaliando outros modelos

Você deve testar muitos outros modelos de diversas categorias de algoritmos de machine learning, sem despender muito tempo aprimorando os hiperparâmetros. O objetivo é selecionar alguns (dois a cinco) modelos promissores.

Conseguimos melhorar ainda mais nosso desempenho, veja os modelos Random Forest e o Gradient Boosting, eles tiveram um desempenho bem melhor em comparação aos outros modelos e ao baseline. Nesse caso, não há dúvidas sobre quais modelos prosseguir com a otimização do desempenho, é hora de aperfeiçoar ainda mais.

5.3 — Salvar o modelo

Você deve salvar todos os modelos testados de modo que possa usá-los facilmente depois. Salve os hiperparâmetros e os parâmetros treinados, bem como os scores de validação cruzada. Isso possibilitará que você compare facilmente os scores entre os tipos de modelo e os tipos de erro que eles cometem.

6 — Aperfeiçoe seu modelo

Supondo que você já tenha uma lista restrita de modelos promissores e, agora, você tem que aperfeiçoá-los. Vejamos alguns modos de fazer isso. No nosso caso temos o Random Forest e o Gradient Boosting.

Temos basicamente dois métodos mais utilizados para aperfeiçoar os hiperparâmetros dos modelos que são o Grid Search e o Randomized Search.

Utilizarei o Grid Search para otimizar os hiperparâmetros do Random Forest e o Randomized Search para o Gradient Boosting.

6.1 — Grid search

Esse é um método de otimização exaustiva, onde você passa quais hiperparâmetros e valores deseja que ele teste, e ele avaliará todas as combinações de valores possíveis por meio da validação cruzada. Lembrando que esse é um método caro computacionalmente.

Veja que foi possível melhorar um pouco o score do modelo.

6.2 — Randomized search

A abordagem do grid search é boa quando você está explorando poucas combinações, já que é um modelo exaustivo. Quando o espaço de pesquisa de hiperparâmetro é grande, geralmente é preferível usar a RandomizedSearchCV. Essa classe pode ser usada da mesma maneira que o GridSearchCV, no entanto, em vez de testar todas as combinações possíveis, ela avalia um determinado número de combinações aleatórias, ao selecionar um valor aleatório para cada hiperparâmetro a cada iteração.

Com o RandomizedSearchCV você consegue obter mais controle computacional, basta definir o número de iterações.

6.3 — Analise os melhores modelos e seus erros

Muitas vezes, você obtém informações reveladoras sobre o problema inspecionando os melhores modelos. Por exemplo, o RandomForestRegressor pode indicar a importância relativa de cada variável para realizar predições precisas.

Vamos exibir esses scores de importância ao lado dos nomes de atributos correspondentes.

Com essa informação em mãos, você pode tentar descartar algumas das variáveis menos úteis. Você também deve analisar os erros específicos cometidos pelo sistema, depois tentar compreender porque ele comete tais erros e o que poderia solucionar o problema (feature engineering, descartar as variáveis não informativas, limpar outliers, escalonar a variável alvo, etc.).

Vale ressaltar uma informação interessante aqui. Vimos acima métodos de otimização de hiperparâmetros, mas uma outra forma de fazer esse trabalho é: conhecendo bem o seu negócio, você pode otimizar hiperparâmetros específicos com o seu conhecimento sobre a área.

7 — Avalie seu modelo no conjunto de teste

Depois de ajustar seus modelos por um tempo, você finalmente terá um modelo com desempenho suficiente. Agora, é hora de avaliar o modelo final no conjunto de testes.

Desempenho do modelo no conjunto de teste

Em alguns casos, essa estimativa pontual do erro de generalização não será o bastante para convencê-lo a implementar. E se for apenas 0,1% melhor do que o modelo atualmente em produção? Você pode ter uma ideia da precisão dessa estimativa. Para isso, é possível calcular um intervalo de confiança de 95% para o erro de generalização.

Intervalo de confiança do desempenho no conjunto de teste

Esse é o intervalo de confiança do desempenho do nosso modelo em estudo.

Se você fez muito ajustes de hiperparâmetro, o desempenho geralmente será um pouco pior do que o que calculou usando a validação cruzada (porque seu modelo acaba sendo aperfeiçoado para ter um bom desempenho no conjunto de validação e provavelmente não terá um bom desempenho em um conjunto de dados desconhecido).

Não foi o caso desse exemplo, mas quando isso ocorre, você deve resistir a tentação de ajustar os hiperparâmetros para fazer com que os números pareçam bons no conjunto de teste. É improvável que as melhorias façam generalizações para os dados novos.

7.1 — Pré-lançamento do projeto

Agora você precisa apresentar sua solução, ressaltando o que aprendeu, o que funcionou e o que não funcionou, quais suposições foram feitas e quais são as limitações do seu sistema.

É interessante documentar tudo e elaborar apresentações legais com visualizações claras.

image: Freepik.com

Se achar necessário você deve realizar novos ciclos do projeto (passando por todas as etapas feitas aqui novamente) a nível de tentar melhorar ainda mais o desempenho do modelo, isso é possível, pois, você notou que aprendemos muito até aqui e ainda podem ser feitos muitos outros testes.

Por fim, a ideia agora é implementar, monitorar e fazer a manutenção do seu modelo, etapa que não iremos detalhar aqui.

Conclusão

Passamos aqui por todas as etapas de um projeto de ciência de dados que foram:

  1. Analisar o panorama geral — Entendendo o problema do negócio;
  2. Obter os dados;
  3. Análise Exploratória dos dados;
  4. Limpeza e preparação dos dados;
  5. Selecionar e treinar um modelo de machine learning;
  6. Aperfeiçoar o modelo;
  7. Avaliação do modelo no conjunto de teste e apresentar a solução.

Ressalto que, o que foi feito aqui, não necessariamente servirá cem por cento para seu projeto, mas pode servir como uma espécie de guia. Você deve entender seu problema e adaptar a sua solução a ele, cada caso é um caso.

Referências bibliográficas

  • Mãos a obra: Aprendizado de máquina com scikit-learn, keras e tensor flow, Aurélien Géron;
  • Estatística: O que é, para que serve, como funciona, Charles Wheelan;

--

--

Pandas Couple
Pandas Couple

Written by Pandas Couple

Casal de Cientistas de Dados, contribuindo para a comunidade de Data Science.

No responses yet