ÍNDICE DE CONTEÚDO
- Introdução ao Machine Learning: Conceitos Básicos
- Tarefas do Aprendizado de Máquina
- Datasets: O que são e para que servem no Aprendizado de Máquina
- Explorando os Datasets — Parte 1
- Estatística Descritiva — Parte 1
- Estatística Descritiva – Parte 2
- Pré-Processamento Dos Dados
- Limpeza Dos Dados
- Transformação De Dados
- Classificação X Regressão
- O Algoritmo Dos K Vizinhos Mais Próximos
- Regressão Linear – Parte 1
Nesse artigo vamos entender sobre limpeza dos dados. Vamos entender melhor quais os problemas existentes nos dados e como podemos resolvê-los.
Tipos De Problemas Nos Dados
Os problemas existentes no dados podem ser categorizados em quatro tipos: dados redundantes, incompleto, ruidosos ou inconsistentes. Nós vamos ver cada um deles separadamente. É importante lembrar que esses problemas podem ser causado por vários fatores, desde a coleta por uma máquina ou pessoa, até o compartilhamento das informações entre pessoas (famoso telefone sem fio)! Ainda que existam algoritmos capazes de lidar com alguns desses problemas de forma satisfatória, é inegável que a qualidade do resultado também será afetada. Além disso, dependendo do domínio do problema, pode até mesmo levar a conclusões erradas e consequencias graves. Então, a melhor coisa é tentar minimizar esses problemas antes de inputar os dados em um algoritmo. Se necessário, consultar um especialista do domínio para ajudar a indentificar estes problemas também é uma opção.
Dados Inconsistentes
Esses dados, quando presentes no conjunto, contradizem os valores de outros atributos da mesma instância, portanto existe um conflito. Esta situação podo ocorrer tanto nos atributos de entrada, quanto nos de saída. Um caso bem fácil de entender a gravidade disto é: considere um dataset com informações de pacientes. Neste dataset existem dois pacientes diferentes. Eles possuem atributos de entrada com os mesmos valores, mas o atributo de saída é diferente. Isso indica que um dos dois está errado, mas qual?
Quando há integração de dados, as inconsistências podem aparecer, isto é, ao se juntar vários arquivos de dados em um só, pode haver uma pequena confusão nessa mesclagem, e várias inconsistências aparecerem. Isto se aplica também aos outros tipos de problemas de dados. Se o conjunto de dados não for muito grande, as inconsistências podem ser removidas manualmente. Mas caso contrário, é melhor usar algum algoritmo específico para isso, ou dependendo do problema que se tem em mãos, desenvolver um script que o fará.
Vamos considerar este dataset aqui para exemplificar este problema:
Fiz o download deste dataset neste link: https://www.kaggle.com/datasets/yasserh/heart-disease-dataset?select=heart.csv. Como este dataset já foi limpo e organizado para ser utilizado, então eu mesma adicionei alguns problemas nele para usar como exemplo aqui. Este é um dataset que contém características de pacientes que vão dizer se ele tem ou não uma doença no coração, portanto, a última coluna é o atributo-alvo, ou atributo de saída, ou ainda o TARGET, RÓTULO, CLASSE, CATEGORIA. Os outros atributos são os atributos de entrada. Eu também traduzi alguns nomes das colunas para o português pra gente poder se localizar.
As instâncias marcadas com essa cor meio rosa mate, ilustram a cara de um dado inconsistente. Dois pacientes com exatamente as mesmas características, mas com diagnóstico diferente. Qual dos dois é o correto? Onde foi que o ocorreu o problema? Foi na hora de digitar os valores no computador? Ou na hora de pedir para alguém preencher isto? Ou será que o equipamento está descalibrado? Vejam, se for um problema de equipamento médico, então o problema é ainda mais grave. Talvez, se ninguém prestar atenção, diagnósticos podem estar sendo dados de maneira errada, não só por erros humano, mas também por erro tecnológico.
Dados Ruidosos
Neste tipo de problema os valores são diferentes do esperado. Se inputarmos um dataset ruidoso, o modelo gerado poderá sofrer de overfitting, já que o modelo será induzido a aprender esses ruídos e não os dados verdadeiros. Se excluirmos todos os ruídos, pode ser também que informação importante seja perdida, isto é, alguns atributos que podem contribuir para o aprendizado acabam não sendo considerados.
Há algum meio de termos certeza absoluta de que aquele valor que estou “vendo” como um ruído é de fato um ruído? Infelizmente não, mas você pode fazer uma análise estatística descritiva básica para se familiar com os dados e, assim, ter uma noção de que aquele valor parece não ser correto para aquele atributo. Lembram-se dos outliers? Pois bem, você pode fazer uma análise de outlier e assim identificar ruídos. Alguns ruídos são fáceis de se identificar, por exemplo, o Peso de uma pessoa que tenha o valor acima de 300 kg. Mas em outros casos, talvez você precise confirmar com um especialista do domínio. Vamos pegar o nosso exemplo que classifica se um paciente tem ou não doença no coração. O dataset tem 304 instâncias e 14 atributos, sendo 13 atributos de entrada e 1 de saída (última coluna). Segue a descrição dos atributos para entendermos melhor o contexto do dataset
Idade: idade em anos;
Sexo: 1 = masculino e 0 = feminino;
CP: tipo de dor no peito, sendo 3 no total: 1 = angina típica; 2 = angina atípica; 3 = dor não anginosa; 4 = assintomático;
Colesterol = colesterol sérico em mg/dl;
Trestbps: pressão arterial em repouso, em mm Hg na admissão ao hospital;
FBS (fasting blood sugar): se o nível de açúcar no sangue for maior que 120 mg/dl então é igual a 1, 0 caso contrário;
RestECG: resultados eletrocardiográficos em repouso onde: 0 = normal; 1 = com ST-T; 2 = hipertrofia;
Thalach: frequência máxima atingida;
Exang: angina induzida por exercício (1 = sim; 0 = não)
Oldpeak: Depressão de ST induzida por exercício em relação ao repouso;
Slope: a inclinação do segmento ST do exercício de pico (1 = ascendente; 2 = plana; 3 = descendente)
CA: número de veias principais (0-3) coloridas por fluoroscopia;
Thal: 3 = normal, 6 = defeito fixo, 7 = defeito reversível.
Tendo as descrição de cada atributo fica mais fácil também identificar os ruídos. Agora vamos olhar o dataset novamente:
Observem as linhas em destaque. Conseguimos enxergar a olho nu que duas instâncias tem valores muito diferentes daqueles definidos para os atributos FBS, EXANG e DOENÇA DO CORAÇÃO. Se analisarmos a distribuição dos dados usando estatística, conseguiremos perceber alguns desses ruídos, mas existem técnicas que nos ajudam a amenizar este problema.
Técnicas baseadas em agrupamentos de dados
Use um algoritmo de agrupamento para agrupar os valores dos atributos – ou então as instâncias – e, em seguida, observe os valores que não foram agrupados. Estes podem ser considerados ruídos ou outliers.
Técnica de encestamento
O objetivo aqui é suavizar o valor do atributo da seguinte forma: 1) Ordenar os valores para o atributo; 2) Dividir os valores em faixas e dentro de cada faixa deve haver o mesmo número de valores; 3) Os valores em uma faixa podem ser substituídos pela MÉDIA ou pela MEDIANA dos valores desta faixa. Vamos exemplificar aqui:
Técnicas baseadas em regressão ou classificação
Tentam estimar o valor (ou classe) verdadeiro do atributo que é considerado um ruído, a partir desse tipo de algoritmo.
Técnicas baseadas em distância
Se um ruído está presente nos dados, então é possível calcular a sua distância com relação aos demais. Dado um objeto O (instância ou atributo) essas técnicas vão verificar a que classe pertencem os objetos mais próximos desse objeto O. Isto é feito para todos os objetos pertencentes ao conjunto de dados. O objeto O pode ser considerado um ruído, ou outlier, se os outros objetos próximos pertencem a uma classe diferente. Pra ficar mais fácil de entender, vamos ver a Figura abaixo:
Com uma ilustração fica bem mais fácil de ver não é mesmo? Ao lado esquerdo da Figura, temos um exemplo de outlier. Todos os objetos próximos ao objeto O fazem parte da cor bordô, enquanto que o objeto O faz parte da cor roxa. Dessa forma, o objeto O é um ruído, ou outlier, pois ele está próximo de outros objetos que não são similares a ele. Já ao lado direito da Figura, o objeto O não é um outlier, pois o mesmo faz parte da mesma classe que os outros objetos ao redor dele. Alguns algoritmos de agrupamento usam como base medidas de distância, por isto esta técnica se parece muito com a de agrupamento. No entanto, algoritmos de agrupamento podem ser baseados em diferentes conceitos para encontrar os grupos e não apenas na distância entre os objetos.
Dados Redundantes
Ocorre quando mais de uma instância tem os mesmos valores (ou valores muito similares) para todos os atributos, ou quando mais de um atributo tem o mesmo (ou valores muito similares) valor para todas as instâncias.
Segue um exemplo deste problema no dataset de doenças do coração:
Observem que as linhas em destaque mostram exatamente os mesmos valores, tanto para os atributos de entrada, quanto para os atributos de saída. Esses dados repetidos vão ajudar em algo no aprendizado do modelo? O que pode acontecer aqui é que o modelo vai entender que esse padrão é mais importante que os outros. Além disso, se o dataset já for enorme, processá-lo já será computacionalmente complexo, então, não seria melhor retirar dados repetidos para assim ter um runtime (tempo de execução) melhor e mais rápido? Exatamente.
Você também pode imaginar um cabo de guerra para entender como ter redundância pode atrapalhar o processo de treinamento do modelo. Se 10 pessoas estão puxando a corda de um lado, e apenas 3 do outro lado, o que acontecerá? 10 pessoas são mais fortes do que 3 não é mesmo? O lado que tem 10 pessoas vai ganhar a brincadeira. Acontece o mesmo durante o treinamento: se 10 instâncias exatamente iguais existem e são inputadas, então o modelo vai pender para este lado, elas serão consideradas mais relevantes e importantes, o que pode também levar ao superaprendizado (overfitting). Provavelmente um dado de teste será classificado errado pelo modelo aprendido, ou um valor de regressão incorreto será dado como resposta.
O mesmo se aplica a atributos. Alguns atributos têm nomes diferentes, mas tem a mesma significância. Por exemplo, a idade e data de nascimento, existe uma relação entre esses dois atributos, mas eu não preciso do atributo idade, posso deduzir a idade da pessoa a partir da data de nascimento e a data atual. Então, o atributo idade pode ser excluído. Outro exemplo é quando essa relação existe em mais de dois atributos, onde é possível deduzir um atributo a partir de outros dois. Dessa forma, um deles pode ser excluído. E assim, vamos tirando as redundâncias e diminuindo a complexidade computacional do modelo.
Uma forma de verificar a redundância entre atributos, dos quais você não tem muita certeza se são ou não redundantes, é calculando a correlação entre eles. Quanto mais correlacionados, maior a redundância. Mas lembre-se também de que às vezes é melhor consultar o especialista de domínio para não correr o risco de excluir algo que jamais deveria estar fora do escopo do problema.
Dados Incompletos
Finalizando este artigo, vamos falar dos dados incompletos, isto é, há situações em que faltam informações nos datasets. Um atributo que não tenha um valor preenchido pode ter sido considerado irrelevante, e por isto não há um valor ali. Um exemplo clássico disso é quando existe o campo telefone fixo nos formulários, mas quem hoje tem telefone fixo? São poucas pessoas, mas empresas essas sim tem. Então esse campo acaba ficando em branco, sem preenchimento. Outra situação que pode ocorrer é, você estar preenchendo um formulário na triagem de um hospital e a enfermeira te perguntar o seu tipo sanguíneo. Sua reposta: “não lembro”. Dai que esse campo não será preenchido, causando assim um dado incompleto, ausente. Veja um exemplo na Figura a seguir, onde as células em destaque marcam os dados incompletos.
Também pode ser que a pessoa que esteja coletando informações esteja distraída e não perceba que esqueceu de preencher algo. Há situações também que os campos de um formulário são opcionais, estes ficarão em branco justamente por não serem de preenchimento obrigatório. Uma outra situação interessante: suponha um formulário de preenchimento comum para todos os pacientes e ali há um campo para preencher o número de partos. Mas e se a pessoa for do sexo masculino? Neste caso, o campo ficará em branco, configurando inexistência de um valor para o atributo. Por último, também pode haver problemas com o equipamento.
O que pode ser feito então para corrigir este problema? Podemos eliminar as instâncias com valores ausentes, mas só se muitos atributos estiverem vazios. Se eliminarmos todas as instâncias com valores ausentes, o que sobrará do dataset? Sem contar que essas instâncias em particular podem representar uma situação importante no conjunto. O modelo não aprenderá essas situações se elas não estiverem presentes nos dados.
Outra coisa que pode ser feita é tentar preencher os valores incompletos. Se forem poucos atributos, pode-se até fazer manualmente, mas se o dataset for muito grande isto se torna um inviável. Além disso, atributos que dizem respeito a informações de uma pessoa, como o tipo sanguíneo, vai exigir que você entre em contato com essa pessoa para obter a informação, e nem sempre isso é possível. Não podemos nos esquecer da LGPD.
Os dados incompletos, se forem numéricos, podem ser preenchidos usando a moda, mediana ou a média dos dados do atributo. Mas é preciso tomar cuidado, neste caso, para não chegar a valores inconsistentes, como o caso de uma pessoa de 60 anos pesando apenas 3kg. Pode-se considerar também nesse caso a distribuição, ou seja, se for normal usar a média, se não for normal usar a mediana. Por fim, algoritmos de aprendizado de máquina que são capazes de lidar com dados que contenham esse tipo de problema podem ser utilizados, como as árvores de decisão, por exemplo. Pode-se também tentar estimar o valor do atributo (regressão) considerando-o como um atributo alvo e usando os outros atributos como entrada.
Conclusão
Pessoal, terminamos este artigo por aqui. Espero que tenham gostado do conteúdo. Obrigada por terem lido! Daremos continuidade à nossa jornada no próximo artigo. Espero vocês lá.