Alura > Cursos de Data Science > Cursos de Machine Learning > Conteúdos de Machine Learning > Primeiras aulas do curso Machine Learning: lidando com dados de muitas dimensões

Machine Learning: lidando com dados de muitas dimensões

Dados com muitas dimensões - Apresentação

Olá, tudo bem? Meu nome é Thiago e lhe dou as boas vindas a mais um curso de Machine Learning da Alura, no qual aprenderemos o que é a dimensão de um dado, o que são dados de alta dimensionalidade e como lidar com eles.

Nosso projeto tem a proposta de desenvolver a Alura_care, uma startup fictícia que tem por objetivo reduzir o número de exames necessários para o diagnóstico de um tipo específico de câncer. Para isso, iniciaremos um pré-processamento dos dados, aprendendo a identificar, por exemplo, células vazias, e como lidar com esse tipo de problema. Também identificaremos valores constantes nos dados e como eles podem impactar ou não no processo de classificação, além de como a correlação influe neste mesmo processo.

Feito isso, iniciaremos os métodos de seleção de features automáticos, como o SelectKBest e o RFE. Além disso, conseguiremos determinar qual o conjunto que nos gerará o melhor resultado possível no processo de classificação, quantas features precisaremos e quais são essas features.

Por último, aprenderemos como visualizar em um plano um dado de alta dimensionalidade, reduzindo a dimensão mas mantendo o maior número possível de informações.

Dados com muitas dimensões - A dimensionalidade dos dados

Nesse curso de Machine Learning aprenderemos a lidar com dados de alta dimensionalidade. Na construção de um modelo de Machine Learning, começamos com a entrada de dados. Após essa etapa, precisamos fazer um pré-processamento e a transformação dos dados recebidos para torná-los acessíveis aos algoritmos de Machine Learning. Depois, realizamos a segregação entre dados de teste e dados de treinamento.

Com os dados de treinamento, iniciamos a construção do modelo de Machine Learning. Feita essa construção, realizamos um teste e uma validação do modelo. Caso os resultados não sejam os esperados, retornamos para a construção do modelo, entrando em um loop chamado de "loop de treino e teste". Já se atingimos o resultado esperado, partimos para a implementação do modelo.

Nosso curso passará por praticamente todo o fluxo da construção de um modelo de Machine Learning, com foco principalmente no pré-processamento e na transformação de dados com alta dimensionalidade. Mas o que são dimensões de um dado?

Temos uma base de dados contendo diagnóstico, glicemia, pressão, tipo sanguíneo e idade. Essa base de dados representa a sala de triagem do hospital, na qual uma enfermeira coleta algumas informações e passa um diagnóstico positivo, caso seja necessário um atendimento de emergência, ou negativo caso esse atendimento possa aguardar.

DiagnósticoGlicemiaPressãoTipo SanguíneoIdade
Positivo13014/10A43
Negativo9012/08B73

Cada propriedade que caracteriza um diagnóstico como positivo ou negativo é uma dimensão. Sendo assim, glicemia, pressão, tipo sanguíneo e idade são dimensões. Um dado com alta dimensionalidade nada mais é do que um dado com muitas dimensões. Na nossa base de dados, isso está representado por três pontos (...), o que significa que a enfermeira coletou diversas outras informações para chegar a um diagnóstico.

DiagnósticoGlicemiaPressão...Tipo SanguíneoIdade
Positivo13014/10...A43
Negativo9012/08...B73

Quando temos dados com alta dimensionalidade, uma das coisas que precisamos fazer é reduzir o número de dimensões, isto é, diminuir a dimensionalidade do dado. Mas por que?

Para os algoritmos de Machine Learning, quanto maior o número de dimensões, mais lento é o processo e mais espaço de armazenamento é necessário. Além disso, a alta dimensionalidade pode superajustar os nossos modelos aos dados do treinamento.

Aproveitamento esse exemplo na área médica, criaremos um projeto chamado Alura Care, uma startup fictícia do segmento de saúde que tem por objetivo tornar mais rápida e efetiva a detecção de determinados tipos de câncer. A Alura Care possui uma base de dados contendo o diagnóstico do tipo de câncer, que pode ser maligno (M) ou benigno (B), e diversos exames/dimensões que caracterizam esse diagnóstico.

DiagnósticoExame 1Exame 2...Exame 32Exame 33
M52.12314.983...93.54374.634
B50.12811.934...97.76272.961
..................
B43.12312.983...98.54373.634
M50.12816.934...93.76273.961

Temos 33 dimensões nessa base de dados, e a questão que a Alura Care deseja responder é: será possível reduzirmos a necessidade de tantos exames para chegar a um diagnóstico de maneira efetiva? Juntos, responderemos essa questão!

Dados com muitas dimensões - Problema na classificação

Para realizarmos esse curso, usaremos o Jupyter Notebook, mas você pode, se preferir, utilizar qualquer outro Notebook Python da sua preferência, como o Google Colab ou o Kaggle. De início, precisaremos base de dados disponibiliza neste link. Acessando essa página, basta clicar em "Clone or Download" e em seguida em "Download".

Caso você tenha o Git instalado, poderá abrir o Prompt de Comando, selecionar um diretório para armazenar os dados e executar git clone https://github.com/alura-cursos/reducao-dimensionalidade.

Esse é um conjunto de dados fictício criado com base no Breast Cancer Wisconsin (Diagnostic) Data Set, uma base de dados real, que usaremos durante o curso para demonstrar os algoritmos e passar por todos os processos da redução de dimensionalidade.

Para importarmos essa base de dados, usaremos o pd.read_csv() da biblioteca Pandas, passando o diretório do arquivo baixadop. Em seguida, plotaremos os dados na tela.

import pandas as pd

resultados_exames = pd.read_csv("Dataset-master/exames.csv")
resultados_exames

Teremos uma tabela com colunas representando o "id", o "diagnostico" e todos os exames realizados para identificar o tipo de câncer. Ao final da tabela, podemos verificar que existem nessa base de dados 569 linhas (ou seja, 569 diagnósticos) e 35 colunas, das quais 33 são exames. Queremos ter um valor como base, e para isso teremos que criar um modelo com todos os dados de exames e medí-lo. Tal valor base será usado como comparativo em nosso processo de redução de dimensionalidade.

Começaremos, então, segregando nossos dados em treino e teste. Usaremos a função train_test_split() do SKlearn, que nos retornará os dados de treino, os dados de teste, as labels de treino e as labels de teste (no nosso caso, os diagnósticos). Importaremos essa função do módulo sklearn.model_selection e criaremos quatro variáveis que armazenarão os retornos dela.

from sklearn.model_selection import train_test_split

treino_x, teste_x, treino_y, teste_y = train_test_split()

Passaremos como parâmetros de train_test_split() os valores dos exames (valores_exames) e os diagnósticos (diagnostico). Essa função também recebe um valor de aleatoriedade, chamado SEED, que precisa ser setado para conseguirmos reproduzir os mesmos testes futuramente. Para isso, importaremos a função random do Numpy e criaremos um SEED com valor aleatório, como 123143. Em seguida, chamaremos random.seed() pasando esse SEED como parâmetro.

from sklearn.model_selection import train_test_split
from numpy import random

SEED = 123143
random.seed(SEED)

treino_x, teste_x, treino_y, teste_y = train_test_split(valores_exames, diagnostico)

A variável valores_exames receberá toda a nossa base de dados, excluindo as colunas "id" e "diagnostico". Sendo assim, removeremos essas colunas com um drop(), passando as colunas especificadas.

valores_exames = resultados_exames.drop(columns=["id", "diagnostico"])

Dessa forma, obteremos a variável valores_exames. Ainda precisamos do diagnostico, qe conseguiremos com resultados_exames.diagnostico, ou seja, somente a coluna "diagnostico" do nosso conjunto de dados.

valores_exames = resultados_exames.drop(columns=["id", "diagnostico"])
diagnostico = resultados_exames.diagnostico

Teremos então, o seguinte código:

from sklearn.model_selection import train_test_split
from numpy import random

SEED = 123143
random.seed(SEED)

valores_exames = resultados_exames.drop(columns=["id", "diagnostico"])
diagnostico = resultados_exames.diagnostico

treino_x, teste_x, treino_y, teste_y = train_test_split(valores_exames, diagnostico)

Executando, separaremos os dados corretamente. Com treino_x.head(), podemos analisar uma amostra dos dados de treino. Isso também pode ser feito com as outras variáveis que criamos.

O próximo passo será criarmos um modelo de classificação. Nesse curso, utilizaremos um modelo chamado "Random forest", que nada mais é do que um conjunto de árvores de decisão. É um algoritmo muito bom para ser utilizado em processos de classificação.

Importaremos o RandomForestClassifier do módulo sklearn.ensemble e atribuiremos a chamada de RandomForestClassifier() a uma variável classificador. Teremos que passar para o RandomForestClassifier() um parâmetro n_estimators, que define quantas árvores de decisão construiremos no modelo. Por padrão, na versão 0.20 do RFC, são construídas 10 árvores de decisão, número que mudará para 100 na versão 0.22. No nosso caso, usaremos o número 100.

from sklearn.ensemble import RandomForestClassifier

classificador = RandomForestClassifier(n_estimators = 100)

Feito o setup do algoritmo, pediremos que o modelo se ajuste aos nossos dados de treinamento utilizando o fit():

from sklearn.ensemble import RandomForestClassifier

classificador = RandomForestClassifier(n_estimators = 100)
classificador.fit(treino_x, treino_y)

Para obtermos o resultado aplicado aos dados de teste, utilizaremos o método score(). Esse método recebe os dados de teste (teste_x e teste_y) e nos retorna uma acurácia, que será utilizada para medirmos os resultados. Por fim, mostraremos o essa acurácia na tela com o print().

from sklearn.ensemble import RandomForestClassifier

classificador = RandomForestClassifier(n_estimators = 100)
classificador.fit(treino_x, treino_y)
print(classificador.score(teste_x, teste_y))

Executando o código dessa forma, teremos como retorno um erro:

ValueError: Input contains NaN, infinity or a value too large for dtype('float32').

Isso significa que, no nosso conjunto de dados, ou temos um Not a Number (ou seja, uma célula sem um número) ou temos um número muito grande para o tipo float32. Se analisarmos os dados da nossa tabela, veremos que a coluna "exame_33", por exemplo, possui alguns dados vazios. E quantas outras colunas possuem dados vazios?

Teremos que, de alguma forma, ratear todos os valores vazios, para então decidirmos o que fazer com eles.

Sobre o curso Machine Learning: lidando com dados de muitas dimensões

O curso Machine Learning: lidando com dados de muitas dimensões possui 143 minutos de vídeos, em um total de 38 atividades. Gostou? Conheça nossos outros cursos de Machine Learning em Data Science, ou leia nossos artigos de Data Science.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Machine Learning acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas