Como limpar dados em Python para aprendizado de máquina?

Conteúdo

Esta postagem foi tornada pública como parte do Data Science Blogathon

Introdução

Python é uma linguagem de programação fácil de aprender, tornando-o a escolha preferida para iniciantes em ciência de dados, análise de dados e aprendizado de máquina. Ele também tem uma grande comunidade de alunos online e excelentes bibliotecas centradas em dados..

Com tantos dados gerados, é essencial que os dados que usamos para aplicativos de ciência de dados, como aprendizado de máquina e modelagem preditiva, sejam limpos. Mas, O que entendemos por dados limpos? E o que bagunça os dados em primeiro lugar?

Dados sujos significam apenas dados ruins. Duplicação de registros, Dados incompletos ou desatualizados e análises incorretas podem bagunçar os dados. Esses dados devem ser limpos. Limpeza de dados (ou limpeza de dados) refere-se ao procedimento de “limpar” esses dados sujos, identificar erros nos dados e, em seguida, retificá-los.

A limpeza de dados é uma etapa importante em um projeto de aprendizado de máquina, e vamos cobrir algumas técnicas básicas de limpeza de dados (e Python) neste post.

Limpeza de dados em Python

Aprenderemos mais sobre a limpeza de dados em Python com a ajuda de um conjunto de dados de amostra. Nós vamos usar o Conjunto de dados de habitação russo em Kaggle.

Começaremos importando as bibliotecas imperdíveis.

# import libraries
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

Baixe os dados e leia-os em um Pandas DataFrame usando o read_csv () e especificando o caminho do arquivo. Subseqüentemente, usar o atributo de forma para verificar o número de linhas e colunas no conjunto de dados. O código para isso é o seguinte:

df = pd.read_csv('housing_data.csv')
df.shape

O conjunto de dados tem 30 471 linhas e 292 colunas.

Agora vamos separar as colunas numéricas das colunas categóricas.

# select numerical columns
df_numeric = df.select_dtypes(incluir =[np.number])
numeric_cols = df_numeric.columns.values
# select non-numeric columns
df_non_numeric = df.select_dtypes(excluir=[np.number])
non_numeric_cols = df_non_numeric.columns.values

Agora terminamos com os passos preliminares.. Agora podemos passar para a limpeza de dados. Começaremos identificando colunas que contêm valores faltantes e tentaremos corrigi-los.

Valores ausentes

Começaremos calculando a porcentagem de valores faltantes em cada coluna e, em seguida, armazenando essas informações em um DataFrame..

# % of values missing in each column
values_list = list()
cols_list = lista()
para col em df.columns:
    pct_missing = np.média(df[col].é nulo())*100
    cols_list.append(col)
    values_list.append(pct_missing)
pct_missing_df = pd. DataFrame()
pct_missing_df['col'] = cols_list
pct_missing_df['pct_missing'] = lista_valores

O DataFrame pct_missing_df agora contém a porcentagem de valores ausentes em cada coluna junto com os nomes das colunas.

Também podemos criar uma imagem a partir dessas informações para um melhor entendimento usando o seguinte código:

pct_missing_df.loc[pct_missing_df.pct_missing > 0].enredo(kind='bar', figsize =(12,8))
plt.show()

O resultado após a execução da linha de código acima deve ser semelhante a este:

dados perdidos limpar dados

É claro que algumas colunas estão faltando poucos valores, enquanto outras colunas estão perdendo uma porcentagem substancial de valores. Agora vamos corrigir esses valores ausentes.

Existem várias maneiras de corrigir esses valores ausentes. Alguns deles são”

Observações de queda

Uma maneira pode ser descartar as observações que contêm algum valor nulo para qualquer uma das colunas. Isso funcionará quando a porcentagem de valores ausentes em cada coluna for muito menor. Eliminaremos as observações que contêm nulos nas colunas com menos de 0,5% nulo. Essas colunas seriam metro_min_walk, metro_km_walk, railroad_station_walk_km, railroad_station_walk_min e ID_railroad_station_walk.

less_missing_values_cols_list = list(pct_missing_df.loc[(pct_missing_df.pct_missing < 0.5) & (pct_missing_df.pct_missing > 0), 'col'].valores)
df.dropna(subconjunto = less_missing_values_cols_list, inplace = True)

Isso reduzirá o número de registros em nosso conjunto de dados para 30,446 registros.

Apagar colunas (funções)

Outra maneira de resolver os valores ausentes em um conjunto de dados seria excluir as colunas ou recursos que têm uma porcentagem significativa de valores ausentes.. essas colunas não contêm muitas informações e podem ser completamente excluídas do conjunto de dados. No nosso caso, vamos eliminar todas as colunas que faltam mais do que o 40% de valores. Essas colunas seriam build_year, Estado, hospital_beds_raion, cafe_sum_500_min_price_avg, cafe_sum_500_max_price_avg e cafe_avg_price_500.

# queda de colunas com mais de 40% null values
_40_pct_missing_cols_list = list(pct_missing_df.loc[pct_missing_df.pct_missing > 40, 'col'].valores)
df.drop(colunas=_40_pct_missing_cols_list, inplace = True)

O número de recursos em nosso conjunto de dados é agora 286.

Imputar valores perdidos

Os dados ainda estão faltando em nosso conjunto de dados. Agora vamos imputar os valores faltantes em cada coluna numérica com o valor médio dessa coluna.

df_numeric = df.select_dtypes(incluir =[np.number])
numeric_cols = df_numeric.columns.values
for col in numeric_cols:
    faltando = df[col].é nulo()
    num_missing = np.sum(desaparecido)
    se num_missing > 0:  # impute values only for columns that have missing values
        med = df[col].Mediar() #impute with the median
        df[col] = df[col].Fillna(Med)

Valores perdidos em colunas numéricas são agora corrigidos. No caso de colunas categóricas, vamos substituir os valores perdidos com os valores da moda dessa coluna.

df_non_numeric = df.select_dtypes(excluir=[np.number])
non_numeric_cols = df_non_numeric.columns.values
for col in non_numeric_cols:
    faltando = df[col].é nulo()
    num_missing = np.sum(desaparecido)
    se num_missing > 0:  # impute values only for columns that have missing values
        mod = df[col].descrever()['top'] # impute with the most frequently occuring value
        df[col] = df[col].Fillna(Mod)

Todos os valores faltantes em nosso conjunto de dados já foram abordados. Podemos verificar isso executando o seguinte código:

df.isnull().soma().soma()

Se a saída for zero, significa que agora não há valores ausentes deixados em nosso conjunto de dados.

Além disso, podemos substituir os valores ausentes por um valor específico (O que -9999 o ‘faltante’) que indicará o fato de que os dados estavam faltando neste lugar. Este pode ser um substituto para a imputação de valor perdido.

Valores atípicos

Um outlier é uma observação incomum que se desvia da maioria dos dados. Valores discrepantes podem afetar significativamente o desempenho de um modelo de aprendizado de máquina. Por isso, identificar outliers e resolvê-los é essencial.

Vamos pegar a coluna ‘life_sq’ como exemplo. Primeiro usaremos o método de descrição () para olhar as estatísticas descritivas e ver se podemos coletar informações a partir delas.

df.life_sq.describe()

A saída ficará assim:

contar    30446.000000
quer dizer        33.482658
std         46.538609
min          0.000000
25%         22.000000
50%         30.000000
75%         38.000000
max       7478.000000
Nome: life_sq, tipo d: float64

De partida, é claro que algo não está correto. O valor máximo parece ser anormalmente grande em comparação com os valores médios e medianos. Vamos fazer um gráfico de caixa desses dados para ter uma ideia melhor.

df.life_sq.plot(tipo='caixa', figsize =(12, 8))
plt.show()

A saída ficará assim:

dados de plotagem de caixa limpa

A partir do gráfico de caixa, é claro que a observação para o valor máximo (7478) é um outlier nestes dados. Estatísticas descritivas, a plotagens de caixa y los diagramas de dispersión nos ayudan a identificar valores atípicos en los datos.

Podemos lidar com outliers como fizemos com valores ausentes. Podemos excluir as observações que consideramos discrepantes, ou podemos substituir outliers por valores adequados, ou podemos fazer algum tipo de transformação nos dados (como logaritmo ou exponencial). No nosso caso, vamos excluir o registro onde o valor de 'life_sq’ isto é 7478.

# removing the outlier value in life_sq column
df = df.loc[df.life_sq < 7478]

Registros duplicados

As vezes, dados podem conter valores duplicados. É essencial limpar registros duplicados do seu conjunto de dados antes de prosseguir com qualquer projeto de aprendizado de máquina. Em nossos dados, uma vez que a coluna ID é um identificador único, vamos remover registros duplicados considerando todos, exceto a coluna ID.

# dropping duplicates by considering all columns other than ID
cols_other_than_id = list(df.columns)[1:]
df.drop_duplicates(subconjunto=cols_other_than_id, inplace = True)

Isso nos ajudará a limpar registros duplicados. Ao usar o método de forma, você pode verificar que os registros duplicados foram realmente excluídos. O número de observações é agora 30,434.

Corrigindo o tipo de dados

Frequentemente, no conjunto de dados, os valores não são armazenados no tipo de dados correto. Isso pode criar um obstáculo em estágios posteriores e podemos não obter o resultado desejado ou obter erros durante a execução.. Um erro comum de tipo de dados são datas. As datas são frequentemente analisadas como objetos em Python. Há um tipo de dados separado para datas em Pandas, chamado DateTime.

Vamos primeiro verificar o tipo de dados da coluna de carimbo de data / hora em nossos dados.

df.timestamp.dtype

Isso retorna o tipo de dados 'objeto'. Agora sabemos que o estamp de tempo não é armazenado corretamente. Para consertar este problema, converter a coluna de datamp para o formato de data-hora.

# converting timestamp to datetime format
df['timestamp'] = pd.to_datetime(df.timestamp, format ="%Y-%m-%d")

Agora temos o estamp de tempo no formato certo. de forma similar, pode haver colunas onde inteiros são armazenados como objetos. É essencial identificar tais características e corrigir o tipo de dados antes de prosseguir com o aprendizado de máquina.. Sorte para nós, não temos esses problemas em nosso conjunto de dados.

EndNote

Neste post, Discutimos algumas maneiras básicas de limpar dados em Python antes de iniciar nosso projeto de aprendizado de máquina. Precisamos identificar e apagar os valores ausentes, identificar e resolver outliers, limpe os registros duplicados e corrija o tipo de dados de todas as colunas em nosso conjunto de dados antes de continuar com nossa tarefa de AA.

O autor desta postagem é Vishesh Arora. Você pode se conectar comigo em LinkedIn.

A mídia mostrada nesta postagem sobre o credenciamento de linguagem de sinais não é propriedade da DataPeaker e é usada a critério do autor.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.

Datapeaker