Notepad-cheat sheet för snabb dataförbearbetning

Ofta har människor som kommer in på datavetenskapsområdet mindre än realistiska förväntningar på vad som väntar dem. Många tror att de nu kommer att skriva coola neurala nätverk, skapa en röstassistent från Iron Man eller slå alla på finansmarknaderna.
Men jobba Data Forskare är datadriven, och en av de viktigaste och mest tidskrävande aspekterna är att bearbeta data innan den matas in i ett neuralt nätverk eller analyserar den på ett visst sätt.

I den här artikeln kommer vårt team att beskriva hur du kan bearbeta data snabbt och enkelt med steg-för-steg-instruktioner och kod. Vi försökte göra koden ganska flexibel och kunde användas för olika datamängder.

Många proffs kanske inte hittar något extraordinärt i den här artikeln, men nybörjare kommer att kunna lära sig något nytt, och alla som länge har drömt om att göra en separat anteckningsbok för snabb och strukturerad databehandling kan kopiera koden och formatera den själv, eller ladda ner den färdiga anteckningsboken från Github.

Vi fick datasetet. Vad göra här näst?

Så, standarden: vi måste förstå vad vi har att göra med, helhetsbilden. För att göra detta använder vi pandor för att helt enkelt definiera olika datatyper.

import pandas as pd #импортируем pandas
import numpy as np  #импортируем numpy
df = pd.read_csv("AB_NYC_2019.csv") #читаем датасет и записываем в переменную df

df.head(3) #смотрим на первые 3 строчки, чтобы понять, как выглядят значения

Notepad-cheat sheet för snabb dataförbearbetning

df.info() #Демонстрируем информацию о колонках

Notepad-cheat sheet för snabb dataförbearbetning

Låt oss titta på kolumnvärdena:

  1. Motsvarar antalet rader i varje kolumn det totala antalet rader?
  2. Vad är kärnan i uppgifterna i varje kolumn?
  3. Vilken kolumn vill vi rikta in oss på för att göra förutsägelser för den?

Svaren på dessa frågor gör att du kan analysera datamängden och grovt rita en plan för dina nästa åtgärder.

För en djupare titt på värdena i varje kolumn kan vi också använda funktionen pandas describe(). Nackdelen med denna funktion är dock att den inte ger information om kolumner med strängvärden. Vi kommer att ta itu med dem senare.

df.describe()

Notepad-cheat sheet för snabb dataförbearbetning

Magisk visualisering

Låt oss titta på var vi inte har några värderingar alls:

import seaborn as sns
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')

Notepad-cheat sheet för snabb dataförbearbetning

Det här var en kort titt från ovan, nu ska vi gå vidare till mer intressanta saker

Låt oss försöka hitta och, om möjligt, ta bort kolumner som bara har ett värde i alla rader (de kommer inte att påverka resultatet på något sätt):

df = df[[c for c
        in list(df)
        if len(df[c].unique()) > 1]] #Перезаписываем датасет, оставляя только те колонки, в которых больше одного уникального значения

Nu skyddar vi oss själva och vårt projekts framgång från duplicerade rader (rader som innehåller samma information i samma ordning som en av de befintliga raderna):

df.drop_duplicates(inplace=True) #Делаем это, если считаем нужным.
                                 #В некоторых проектах удалять такие данные с самого начала не стоит.

Vi delar upp datasetet i två: en med kvalitativa värden och den andra med kvantitativa

Här måste vi göra ett litet förtydligande: om raderna med saknade data i kvalitativa och kvantitativa data inte är särskilt korrelerade med varandra, då måste vi bestämma vad vi offra - alla rader med saknade data, bara en del av dem, eller vissa kolumner. Om linjerna är korrelerade har vi all rätt att dela upp datasetet i två. Annars måste du först ta itu med raderna som inte korrelerar de saknade data i kvalitativ och kvantitativ, och först därefter dela upp datasetet i två.

df_numerical = df.select_dtypes(include = [np.number])
df_categorical = df.select_dtypes(exclude = [np.number])

Vi gör detta för att göra det lättare för oss att bearbeta dessa två olika typer av data – senare kommer vi att förstå hur mycket enklare detta gör vårt liv.

Vi arbetar med kvantitativ data

Det första vi bör göra är att avgöra om det finns "spionkolumner" i den kvantitativa informationen. Vi kallar dessa kolumner det eftersom de presenterar sig själva som kvantitativa data, men fungerar som kvalitativa data.

Hur kan vi identifiera dem? Naturligtvis beror allt på vilken typ av data du analyserar, men i allmänhet kan sådana kolumner ha lite unika data (i området 3-10 unika värden).

print(df_numerical.nunique())

När vi har identifierat spionkolumnerna kommer vi att flytta dem från kvantitativ data till kvalitativ data:

spy_columns = df_numerical[['колонка1', 'колока2', 'колонка3']]#выделяем колонки-шпионы и записываем в отдельную dataframe
df_numerical.drop(labels=['колонка1', 'колока2', 'колонка3'], axis=1, inplace = True)#вырезаем эти колонки из количественных данных
df_categorical.insert(1, 'колонка1', spy_columns['колонка1']) #добавляем первую колонку-шпион в качественные данные
df_categorical.insert(1, 'колонка2', spy_columns['колонка2']) #добавляем вторую колонку-шпион в качественные данные
df_categorical.insert(1, 'колонка3', spy_columns['колонка3']) #добавляем третью колонку-шпион в качественные данные

Slutligen har vi helt separerat kvantitativ data från kvalitativ data och nu kan vi arbeta med den ordentligt. Det första är att förstå var vi har tomma värden (NaN, och i vissa fall 0 kommer att accepteras som tomma värden).

for i in df_numerical.columns:
    print(i, df[i][df[i]==0].count())

Vid det här laget är det viktigt att förstå i vilka kolumner nollor kan indikera saknade värden: beror detta på hur data samlades in? Eller kan det vara relaterat till datavärdena? Dessa frågor måste besvaras från fall till fall.

Så om vi fortfarande bestämmer oss för att vi kan sakna data där det finns nollor, bör vi ersätta nollorna med NaN för att göra det lättare att arbeta med denna förlorade data senare:

df_numerical[["колонка 1", "колонка 2"]] = df_numerical[["колонка 1", "колонка 2"]].replace(0, nan)

Låt oss nu se var vi saknar data:

sns.heatmap(df_numerical.isnull(),yticklabels=False,cbar=False,cmap='viridis') # Можно также воспользоваться df_numerical.info()

Notepad-cheat sheet för snabb dataförbearbetning

Här ska de värden inuti kolumnerna som saknas markeras med gult. Och nu börjar det roliga – hur ska man hantera dessa värderingar? Ska jag ta bort rader med dessa värden eller kolumner? Eller fyll dessa tomma värden med några andra?

Här är ett ungefärligt diagram som kan hjälpa dig att avgöra vad som i princip kan göras med tomma värden:

Notepad-cheat sheet för snabb dataförbearbetning

0. Ta bort onödiga kolumner

df_numerical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)

1. Är antalet tomma värden i denna kolumn större än 50 %?

print(df_numerical.isnull().sum() / df_numerical.shape[0] * 100)

df_numerical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)#Удаляем, если какая-то колонка имеет больше 50 пустых значений

2. Ta bort rader med tomma värden

df_numerical.dropna(inplace=True)#Удаляем строчки с пустыми значениями, если потом останется достаточно данных для обучения

3.1. Infogar ett slumpmässigt värde

import random #импортируем random
df_numerical["колонка"].fillna(lambda x: random.choice(df[df[column] != np.nan]["колонка"]), inplace=True) #вставляем рандомные значения в пустые клетки таблицы

3.2. Infoga ett konstant värde

from sklearn.impute import SimpleImputer #импортируем SimpleImputer, который поможет вставить значения
imputer = SimpleImputer(strategy='constant', fill_value="<Ваше значение здесь>") #вставляем определенное значение с помощью SimpleImputer
df_numerical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_numerical[['колонка1', 'колонка2', 'колонка3']]) #Применяем это для нашей таблицы
df_numerical.drop(labels = ["колонка1","колонка2","колонка3"], axis = 1, inplace = True) #Убираем колонки со старыми значениями

3.3. Infoga det genomsnittliga eller vanligaste värdet

from sklearn.impute import SimpleImputer #импортируем SimpleImputer, который поможет вставить значения
imputer = SimpleImputer(strategy='mean', missing_values = np.nan) #вместо mean можно также использовать most_frequent
df_numerical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_numerical[['колонка1', 'колонка2', 'колонка3']]) #Применяем это для нашей таблицы
df_numerical.drop(labels = ["колонка1","колонка2","колонка3"], axis = 1, inplace = True) #Убираем колонки со старыми значениями

3.4. Infoga det värde som beräknats av en annan modell

Ibland kan värden beräknas med hjälp av regressionsmodeller med modeller från sklearn-biblioteket eller andra liknande bibliotek. Vårt team kommer att ägna en separat artikel om hur detta kan göras inom en snar framtid.

Så för tillfället kommer berättelsen om kvantitativ data att avbrytas, eftersom det finns många andra nyanser om hur man bättre kan göra databeredning och förbearbetning för olika uppgifter, och de grundläggande sakerna för kvantitativ data har tagits i beaktande i den här artikeln, och nu är det dags att återgå till kvalitativa data som vi separerade flera steg tillbaka från de kvantitativa. Du kan ändra den här anteckningsboken som du vill, anpassa den till olika uppgifter, så att förbearbetningen av data går mycket snabbt!

Kvalitativa data

I grund och botten, för kvalitativ data, används metoden One-hot-encoding för att formatera den från en sträng (eller ett objekt) till ett nummer. Innan vi går vidare till denna punkt, låt oss använda diagrammet och koden ovan för att hantera tomma värden.

df_categorical.nunique()

sns.heatmap(df_categorical.isnull(),yticklabels=False,cbar=False,cmap='viridis')

Notepad-cheat sheet för snabb dataförbearbetning

0. Ta bort onödiga kolumner

df_categorical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)

1. Är antalet tomma värden i denna kolumn större än 50 %?

print(df_categorical.isnull().sum() / df_numerical.shape[0] * 100)

df_categorical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True) #Удаляем, если какая-то колонка 
                                                                          #имеет больше 50% пустых значений

2. Ta bort rader med tomma värden

df_categorical.dropna(inplace=True)#Удаляем строчки с пустыми значениями, 
                                   #если потом останется достаточно данных для обучения

3.1. Infogar ett slumpmässigt värde

import random
df_categorical["колонка"].fillna(lambda x: random.choice(df[df[column] != np.nan]["колонка"]), inplace=True)

3.2. Infoga ett konstant värde

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='constant', fill_value="<Ваше значение здесь>")
df_categorical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_categorical[['колонка1', 'колонка2', 'колонка3']])
df_categorical.drop(labels = ["колонка1","колонка2","колонка3"], axis = 1, inplace = True)

Så vi har äntligen fått grepp om nollor i kvalitativ data. Nu är det dags att utföra en-hot-encoding på värdena som finns i din databas. Denna metod används mycket ofta för att säkerställa att din algoritm kan lära av högkvalitativ data.

def encode_and_bind(original_dataframe, feature_to_encode):
    dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
    res = pd.concat([original_dataframe, dummies], axis=1)
    res = res.drop([feature_to_encode], axis=1)
    return(res)

features_to_encode = ["колонка1","колонка2","колонка3"]
for feature in features_to_encode:
    df_categorical = encode_and_bind(df_categorical, feature))

Så vi har äntligen bearbetat separata kvalitativa och kvantitativa data - dags att kombinera dem tillbaka

new_df = pd.concat([df_numerical,df_categorical], axis=1)

Efter att vi har kombinerat datamängderna till en, kan vi äntligen använda datatransformation med MinMaxScaler från sklearn-biblioteket. Detta kommer att göra våra värden mellan 0 och 1, vilket kommer att hjälpa när vi tränar modellen i framtiden.

from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler()
new_df = min_max_scaler.fit_transform(new_df)

Denna data är nu redo för vad som helst - neurala nätverk, vanliga ML-algoritmer, etc.!

I den här artikeln tog vi inte hänsyn till att arbeta med tidsseriedata, eftersom du för sådan data bör använda lite olika bearbetningstekniker, beroende på din uppgift. I framtiden kommer vårt team att ägna en separat artikel till detta ämne, och vi hoppas att det kommer att kunna tillföra något intressant, nytt och användbart i ditt liv, precis som den här.

Källa: will.com

Lägg en kommentar