DEV Community

Cover image for Dataset na construção de um modelo de Machine Learning
Matheus Musa
Matheus Musa

Posted on

Dataset na construção de um modelo de Machine Learning

Talvez uma das maiores dificuldades de quem está começando a estudar Machine Learning seja trabalhar, tratando os dados fazer pequenas inferências, para então montar o seu modelo.

Nesse artigo vou exemplificar como analisar um dataset para uma melhor construção de um modelo de Machine Learning passando por:

  1. Breve explicação do que é Machine Learning
  2. Tipos e diferenças de Aprendizados
  3. Entender e retirar informações importantes do dataset
  4. Tratar dados de um dataset
  5. Diferenças entre algoritmos de um modelo
  6. Construção de um modelo de Regressão Linear

Mas vamos partir do princípio, para podermos contextualizar, o que é Machine Learning (ML)?

ML é um dos diversos ramos da Inteligência Artificial (IA), assim como Redes Neurais ou Robótica, e outros. O tipo do aprendizado da maquina depende de como os dados estão estruturados, com isso podem ser divididos em diversos tipos, a partir dai criar um modelo. O modelo de um ML é criado usando algoritmos que processam os dados de entrada e aprendem a prever ou classificar os resultados.

A Importância de um Dataset

Para criar um modelo de ML precisamos de um conjunto de dados (dataset), dentro do dataset tem que estar as nossas características (features) de entrada, que é basicamente todo o nosso dataset exceto pela coluna target a depender do nosso tipo de aprendizado, se ele for um aprendizado Supervisionado o dataset deve conter os targets, ou rótulos, ou respostas corretas, já que vai usar essa informação para o treino e teste do modelo.
Alguns tipos de aprendizado e a estrutura do dataset para eles:

  • Aprendizado Supervisionado: Aqui o modelo aprende através de um conjunto de dados rotulados, já com saídas corretas fornecidas, sendo assim o modelo tem como objetivo aprender a associar entradas e saídas para poder fazer suas previsões corretamente para os novos dados.
  • Aprendizado não supervisionado: O treinamento do modelo é feito com dados não rotulados, não tem uma saída correta associada a entrada, assim o objetivo do modelo é identificar padrões e agrupamentos nos dados.
  • Aprendizado por Reforço: Nesse o modelo aprende a partir da interação com o ambiente. Ele vai tomar ações no ambiente e receber recompensa por ações corretas ou receber penalidade por ações erradas, tendo como objetivo maximizar por completo as recompensas a longo prazo maximizando o comportamento que levou a executar ações corretas.

Sendo assim o dataset basicamente define todo o comportamento e processo de aprendizado do modelo gerado pela maquina.
Para seguir com os exemplos usarei um dataset com rótulos, exemplificando um modelo com um Aprendizado Supervisionado, onde o objetivo será definir o valor da mensalidade de um seguro de vida para um determinado publico.

Vamos começar carregando o nosso dataset e ver suas primeiras linhas.

import pandas as pd

data = pd.read_csv('../dataset_seguro_vida.csv')
data.head()
Enter fullscreen mode Exit fullscreen mode

Image description

Vamos detalhar um pouco mais os nossos dados, podemos ver seu formato, e descobrindo o numero de linhas e colunas do dataset.

data.shape
Enter fullscreen mode Exit fullscreen mode

Image description

Temos aqui uma estrutura de dados de 500 linhas e 9 colunas.

Agora vamos ver os tipos de dados que temos e se temos algum dado faltando.

data.info()
Enter fullscreen mode Exit fullscreen mode

Image description

Temos aqui 3 colunas numéricas dentre eles 2 int (números inteiros) e 1 float (números com casas decimais), e as outra 6 são object. Sendo assim podemos passar para o próximo passo de tratar um pouco os dados.

Trabalhando o Dataset

Um bom passo para o melhorar o nosso dataset, é entender que alguns tipos de dados são processados e até entendido mais facilmente pelo modelo do que outros. Por exemplo os dados que são do tipo object são mais pesados e até limitados para se trabalhar, dessa forma é melhor transforma-los para category, já que isso nos permite ter diversos ganhos desde desempenho a eficiência no uso de memória (no fim podemos ainda melhorar mais isso fazendo mais uma transformação, mas hora que chegar o momento explico melhor).

object_columns = data.select_dtypes(include='object').columns

for col in object_columns:
    data[col] = data[col].astype('category')

data.dtypes
Enter fullscreen mode Exit fullscreen mode

Image description

Como o nosso objetivo é conseguir estipular o valor da mensalidade de um seguro de vida, vamos dar uma olhada melhor nas nossas variáveis numéricas usando a transposição.

data.describe().T
Enter fullscreen mode Exit fullscreen mode

Image description

Podemos aqui ver alguns detalhes e valores dos nossos inputs numéricos, como a média aritmética, o valor mínimo e máximo. Através desses dados podemos fazer a separação desses valores em grupos baseados em algum input de categoria, por gênero, se fuma ou não, entre outros, como demonstração vamos fazer a separação por sexo, para visualizar a media aritmética das colunas divididas por sexo.

value_based_on_sex = data.groupby("Sexo").mean("PrecoSeguro")
value_based_on_sex
Enter fullscreen mode Exit fullscreen mode

Image description

Como podemos ver que no nosso dataset os homens acabam pagando um preço maior de seguro (lembrando que esse dataset é fictício).

Podemos ter uma melhor visualização dos dados através do seaborn, é uma biblioteca construída com base no matplotlib usada especificamente para plotar gráficos estatísticos.

import seaborn as sns

sns.set_style("whitegrid")

sns.pairplot(
    data[["Idade", "Salario", "PrecoSeguro", "Sexo"]],
    hue = "Sexo",
    height = 3,
    palette = "Set1")
Enter fullscreen mode Exit fullscreen mode

Image description

Aqui podemos visualizar a distribuição desses valores através dos gráficos ficando mais claro a separação do conjunto, com base no grupo que escolhemos, como um teste você pode tentar fazer um agrupamento diferente e ver como os gráficos vão ficar.

Vamos criar uma matriz de correlação, sendo essa uma outra forma de visualizar a relação das variáveis numéricas do dataset, com o auxilio visual de um heatmap.

numeric_data = data.select_dtypes(include=['float64', 'int64'])

corr_matrix = numeric_data.corr()
sns.heatmap(corr_matrix, annot= True)
Enter fullscreen mode Exit fullscreen mode

Image description

Essa matriz transposta nos mostra quais variáveis numéricas influenciam mais no nosso modelo, é um pouco intuitivo quando você olha para a imagem, podemos observar que a idade é a que mais vai interferir no preço do seguro.
Basicamente essa matriz funciona assim:

Os valores variam entre -1 e 1:
1: Correlação perfeita positiva - Quando uma variável aumenta, a outra também aumenta proporcionalmente.
0: Nenhuma correlação - Não há relação linear entre as variáveis.
-1: Correlação perfeita negativa - Quando uma variável aumenta, a outra diminui proporcionalmente.

Lembra da transformada que fizemos de object para category nos dados, agora vem a outra melhoria comentada, com os dados que viraram category faremos mais uma transformada, dessa vez a ideia é transformar essa variáveis categóricas em representações numéricas, isso nos permitirá ter um ganho incrível com o desempenho do modelo já que ele entende muito melhor essas variáveis numéricas.

Conseguimos fazer isso facilmente com a lib do pandas, o que ele faz é criar nova colunas binarias para valores distintos, o pandas é uma biblioteca voltada principalmente para analise de dados e estrutura de dados, então ela já possui diversas funcionalidades que nos auxiliam nos processo de tratamento do dataset.

data = pd.get_dummies(data)
Enter fullscreen mode Exit fullscreen mode

Image description

Pronto agora temos nossas novas colunas para as categorias.

Decidindo o Algoritmo

Para a construção do melhor modelo, devemos saber qual o algoritmo ideal para o propósito da ML, na tabela seguinte vou deixar um resumo simplificado de como analisar seu problema e fazer a melhor escolha.

Image description

Olhando a tabela podemos ver que o problema que temos que resolver é o de regressão. Aqui vai mais uma dica, sempre comesse simples e vá incrementando seu e fazendo os ajustes necessários até os valores de previsibilidade do modelo ser satisfatório.

Para o nosso exemplo vamos montar um modelo de Regressão Linear, já que temos uma linearidade entre os nossos inputs e temos como target uma variável numérica.

Sabemos que a nossa variável target é a coluna PrecoSeguro , as outras são nossos inputs. Os inputs em estatísticas são chamadas de variável independente e o target de variável dependente, pelos nomes fica claro que a ideia é que o nosso target é uma variável que depende dos nosso inputs, se os inputs variam nosso target tem que vai variar também.

Vamos definir nosso y com o target

y = data["PrecoSeguro"]
E para x vamos remover a coluna target e inserir todas as outras
X = data.drop("PrecoSeguro", axis = 1)
Enter fullscreen mode Exit fullscreen mode

Antes de montarmos o modelo, nosso dataset precisa ser dividido uma parte para teste e outra para o treino, para fazer isso vamos usar do scikit-learn o método train_test_split.

from sklearn.model_selection import train_test_split

X_train,X_test,y_train,y_test=train_test_split(
    X,y, 
    train_size = 0.80, 
    random_state = 1)
Enter fullscreen mode Exit fullscreen mode

Aqui dividimos o nosso dataset em 80% para treino e 20% para testes. Agora podemos montar o nosso modelo.

from sklearn.linear_model import LinearRegression

lr = LinearRegression()

lr.fit(X_train,y_train)
Enter fullscreen mode Exit fullscreen mode

Modelo montado agora podemos avaliar seu desempenho

lr.score(X_test, y_test).
lr.score(X_train, y_train)
Enter fullscreen mode Exit fullscreen mode

Aqui podemos analisar a o coeficiente de determinação do nosso modelo para testes e para o treinamento.

Podemos usar um outro método para poder descobrir o desvio padrão do nosso modelo, e entender a estabilidade e a confiabilidade do desempenho do modelo para a amostra

from sklearn.metrics import mean_squared_error
import math

y_pred = lr.predict(X_test)
math.sqrt(mean_squared_error(y_test, y_pred))
Enter fullscreen mode Exit fullscreen mode

Considerações

O valor perfeito do coeficiente de determinação é 1, quanto mais próximo desse valor, teoricamente melhor seria o nosso modelo, mas um ponto de atenção é basicamente impossível você conseguir um modelo perfeito, até mesmo algo acima de 0.95 é de se desconfiar.
Se você tiver trabalhando com dados reais e conseguir um valor desse é bom analisar o seu modelo, testar outras abordagens e até mesmo revisar seu dataset, pois seu modelo pode estar sofrendo um overfitting e por isso apresenta esse resultado quase que perfeitos.
Aqui como montamos um dataset com valores irreais e sem nenhum embasamento é normal termos esses valores quase que perfeitos.

Deixarei aqui um link para o github do código e dataset usados nesse post

Top comments (0)