Kladblok-spiekbriefje voor snelle gegevensvoorverwerking

Vaak hebben mensen die het vakgebied Data Science betreden, weinig realistische verwachtingen van wat hen te wachten staat. Veel mensen denken dat ze nu coole neurale netwerken zullen schrijven, een stemassistent van Iron Man zullen creΓ«ren of iedereen op de financiΓ«le markten zullen verslaan.
Maar werk Data Wetenschappers zijn datagestuurd en een van de belangrijkste en meest tijdrovende aspecten is het verwerken van de gegevens voordat deze in een neuraal netwerk worden ingevoerd of op een bepaalde manier worden geanalyseerd.

In dit artikel beschrijft ons team hoe u met stapsgewijze instructies en code snel en eenvoudig gegevens kunt verwerken. We hebben geprobeerd de code behoorlijk flexibel te maken en voor verschillende datasets te gebruiken.

Veel professionals vinden in dit artikel misschien niets bijzonders, maar beginners zullen iets nieuws kunnen leren, en iedereen die er al lang van droomt een apart notitieboekje te maken voor snelle en gestructureerde gegevensverwerking, kan de code kopiΓ«ren en deze voor zichzelf formatteren, of download het voltooide notitieblok van Github.

Wij hebben de dataset ontvangen. Wat nu te doen?

Dus de norm: we moeten begrijpen waar we mee te maken hebben, het totaalbeeld. Om dit te doen, gebruiken we panda's om eenvoudig verschillende gegevenstypen te definiΓ«ren.

import pandas as pd #ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ pandas
import numpy as np  #ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ numpy
df = pd.read_csv("AB_NYC_2019.csv") #Ρ‡ΠΈΡ‚Π°Π΅ΠΌ датасСт ΠΈ записываСм Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ df

df.head(3) #смотрим Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 3 строчки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ выглядят значСния

Kladblok-spiekbriefje voor snelle gegevensvoorverwerking

df.info() #ДСмонстрируСм ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°Ρ…

Kladblok-spiekbriefje voor snelle gegevensvoorverwerking

Laten we eens kijken naar de kolomwaarden:

  1. Komt het aantal regels in elke kolom overeen met het totale aantal regels?
  2. Wat is de essentie van de gegevens in elke kolom?
  3. Op welke kolom willen we ons richten om er voorspellingen voor te doen?

Met de antwoorden op deze vragen kunt u de dataset analyseren en grofweg een plan opstellen voor uw volgende acties.

Voor een dieper inzicht in de waarden in elke kolom kunnen we ook de functie Pandas beschrijven() gebruiken. Het nadeel van deze functie is echter dat deze geen informatie geeft over kolommen met tekenreekswaarden. We zullen ze later behandelen.

df.describe()

Kladblok-spiekbriefje voor snelle gegevensvoorverwerking

Magische visualisatie

Laten we eens kijken waar we helemaal geen waarden hebben:

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

Kladblok-spiekbriefje voor snelle gegevensvoorverwerking

Dit was een korte blik van bovenaf, nu gaan we verder met interessantere dingen

Laten we proberen kolommen te vinden en, indien mogelijk, te verwijderen die slechts één waarde in alle rijen hebben (ze hebben op geen enkele manier invloed op het resultaat):

df = df[[c for c
        in list(df)
        if len(df[c].unique()) > 1]] #ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌ датасСт, оставляя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния

Nu beschermen we onszelf en het succes van ons project tegen dubbele regels (regels die dezelfde informatie bevatten in dezelfde volgorde als een van de bestaande regels):

df.drop_duplicates(inplace=True) #Π”Π΅Π»Π°Π΅ΠΌ это, Ссли считаСм Π½ΡƒΠΆΠ½Ρ‹ΠΌ.
                                 #Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ с самого Π½Π°Ρ‡Π°Π»Π° Π½Π΅ стоит.

We verdelen de dataset in tweeën: één met kwalitatieve waarden en de andere met kwantitatieve waarden

Hier moeten we een kleine verduidelijking aanbrengen: als de regels met ontbrekende gegevens in kwalitatieve en kwantitatieve gegevens niet erg met elkaar gecorreleerd zijn, dan zullen we moeten beslissen wat we opofferen - alle regels met ontbrekende gegevens, slechts een deel ervan, of bepaalde kolommen. Als de lijnen gecorreleerd zijn, hebben we het volste recht om de dataset in tweeΓ«n te delen. Anders moet u eerst de lijnen aanpakken die de ontbrekende gegevens niet kwalitatief en kwantitatief correleren, en pas dan de dataset in tweeΓ«n delen.

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

We doen dit om het voor ons gemakkelijker te maken deze twee verschillende soorten gegevens te verwerken. Later zullen we begrijpen hoeveel gemakkelijker dit ons leven maakt.

Wij werken met kwantitatieve data

Het eerste wat we moeten doen is bepalen of er β€˜spionagekolommen’ in de kwantitatieve gegevens voorkomen. We noemen deze kolommen zo omdat ze zichzelf presenteren als kwantitatieve gegevens, maar fungeren als kwalitatieve gegevens.

Hoe kunnen we ze identificeren? Het hangt natuurlijk allemaal af van de aard van de gegevens die u analyseert, maar over het algemeen bevatten dergelijke kolommen weinig unieke gegevens (in de buurt van 3-10 unieke waarden).

print(df_numerical.nunique())

Zodra we de spionagekolommen hebben geΓ―dentificeerd, verplaatsen we ze van kwantitatieve gegevens naar kwalitatieve gegevens:

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']) #добавляСм Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ-шпион Π² качСствСнныС Π΄Π°Π½Π½Ρ‹Π΅

Tenslotte hebben we kwantitatieve data volledig gescheiden van kwalitatieve data en kunnen we er nu goed mee werken. Het eerste is om te begrijpen waar we lege waarden hebben (NaN, en in sommige gevallen wordt 0 geaccepteerd als lege waarden).

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

Op dit punt is het belangrijk om te begrijpen in welke kolommen nullen ontbrekende waarden kunnen aangeven: komt dit door de manier waarop de gegevens zijn verzameld? Of kan het verband houden met de gegevenswaarden? Deze vragen moeten van geval tot geval worden beantwoord.

Dus als we nog steeds besluiten dat we mogelijk gegevens missen waar nullen staan, moeten we de nullen vervangen door NaN om het later gemakkelijker te maken om met deze verloren gegevens te werken:

df_numerical[["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 1", "ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 2"]] = df_numerical[["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 1", "ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 2"]].replace(0, nan)

Laten we nu eens kijken waar we gegevens missen:

sns.heatmap(df_numerical.isnull(),yticklabels=False,cbar=False,cmap='viridis') # МоТно Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ df_numerical.info()

Kladblok-spiekbriefje voor snelle gegevensvoorverwerking

Hier moeten de waarden in de kolommen die ontbreken, geel gemarkeerd zijn. En nu begint het plezier: hoe ga je om met deze waarden? Moet ik rijen met deze waarden of kolommen verwijderen? Of deze lege waarden vullen met enkele andere?

Hier is een benaderend diagram dat u kan helpen beslissen wat er in principe met lege waarden kan worden gedaan:

Kladblok-spiekbriefje voor snelle gegevensvoorverwerking

0. Verwijder onnodige kolommen

df_numerical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)

1. Is het aantal lege waarden in deze kolom groter dan 50%?

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

df_numerical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)#УдаляСм, Ссли какая-Ρ‚ΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ‚ большС 50 пустых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

2. Verwijder regels met lege waarden

df_numerical.dropna(inplace=True)#УдаляСм строчки с пустыми значСниями, Ссли ΠΏΠΎΡ‚ΠΎΠΌ останСтся достаточно Π΄Π°Π½Π½Ρ‹Ρ… для обучСния

3.1. Een willekeurige waarde invoegen

import random #ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ random
df_numerical["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"].fillna(lambda x: random.choice(df[df[column] != np.nan]["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"]), inplace=True) #вставляСм Ρ€Π°Π½Π΄ΠΎΠΌΠ½Ρ‹Π΅ значСния Π² пустыС ΠΊΠ»Π΅Ρ‚ΠΊΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

3.2. Een constante waarde invoegen

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. Voer de gemiddelde of meest voorkomende waarde in

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. Voer de waarde in die door een ander model is berekend

Soms kunnen waarden worden berekend met behulp van regressiemodellen met behulp van modellen uit de sklearn-bibliotheek of andere soortgelijke bibliotheken. Ons team zal in de nabije toekomst een apart artikel wijden aan hoe dit kan worden gedaan.

Dus voorlopig zal het verhaal over kwantitatieve data worden onderbroken, omdat er veel andere nuances zijn over hoe je data beter kunt voorbereiden en voorbewerken voor verschillende taken, en in dit artikel is rekening gehouden met de basiszaken voor kwantitatieve data, en nu is het tijd om terug te keren naar kwalitatieve gegevens, die we een aantal stappen terug hebben gescheiden van de kwantitatieve gegevens. U kunt dit notebook naar eigen inzicht veranderen en aanpassen aan verschillende taken, zodat de voorverwerking van gegevens zeer snel gaat!

Kwalitatieve data

Kortom, voor kwalitatieve gegevens wordt de One-hot-encoding-methode gebruikt om deze van een string (of object) naar een getal te formatteren. Voordat we verder gaan met dit punt, gebruiken we het bovenstaande diagram en de code om met lege waarden om te gaan.

df_categorical.nunique()

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

Kladblok-spiekbriefje voor snelle gegevensvoorverwerking

0. Verwijder onnodige kolommen

df_categorical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)

1. Is het aantal lege waarden in deze kolom groter dan 50%?

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

df_categorical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True) #УдаляСм, Ссли какая-Ρ‚ΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 
                                                                          #ΠΈΠΌΠ΅Π΅Ρ‚ большС 50% пустых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

2. Verwijder regels met lege waarden

df_categorical.dropna(inplace=True)#УдаляСм строчки с пустыми значСниями, 
                                   #Ссли ΠΏΠΎΡ‚ΠΎΠΌ останСтся достаточно Π΄Π°Π½Π½Ρ‹Ρ… для обучСния

3.1. Een willekeurige waarde invoegen

import random
df_categorical["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"].fillna(lambda x: random.choice(df[df[column] != np.nan]["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"]), inplace=True)

3.2. Een constante waarde invoegen

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)

We hebben dus eindelijk grip op nulwaarden in kwalitatieve gegevens. Nu is het tijd om one-hot-encoding uit te voeren op de waarden die zich in uw database bevinden. Deze methode wordt heel vaak gebruikt om ervoor te zorgen dat jouw algoritme kan leren van data van hoge kwaliteit.

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))

We zijn dus eindelijk klaar met het verwerken van afzonderlijke kwalitatieve en kwantitatieve gegevens - tijd om ze weer te combineren

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

Nadat we de datasets tot één hebben gecombineerd, kunnen we eindelijk datatransformatie gebruiken met MinMaxScaler uit de sklearn-bibliotheek. Hierdoor komen onze waarden tussen 0 en 1, wat zal helpen bij het trainen van het model in de toekomst.

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

Deze gegevens zijn nu voor alles gereed: neurale netwerken, standaard ML-algoritmen, enz.!

In dit artikel hebben we geen rekening gehouden met het werken met tijdreeksgegevens, omdat je voor dergelijke gegevens iets andere verwerkingstechnieken moet gebruiken, afhankelijk van je taak. In de toekomst zal ons team een ​​apart artikel aan dit onderwerp wijden, en we hopen dat het iets interessants, nieuws en nuttigs in je leven zal kunnen brengen, net als dit.

Bron: www.habr.com

Voeg een reactie