Datuen aurreprozesatzeko koaderno-orria

Sarritan Datu Zientzien eremuan sartzen diren pertsonek itxaropen errealistak baino ez dituzte itxaroten dutenaren inguruan. Jende askok uste du orain sare neuronal ederrak idatziko dituztela, Iron Man-en ahots-laguntzaile bat sortuko dutela edo finantza-merkatuetan guztiak irabaziko dituztela.
Baina lana Data Zientzialaria datuen araberakoa da, eta alderdi garrantzitsuenetako bat eta denbora behar duen alderdietako bat datuak prozesatzea da, sare neuronal batean sartu aurretik edo modu jakin batean aztertu aurretik.

Artikulu honetan, gure taldeak datuak azkar eta erraz nola prozesatu ditzakezun deskribatuko du urratsez urrats argibide eta kodearekin. Kodea nahiko malgua egiten saiatu gara eta datu multzo ezberdinetarako erabil zitekeen.

Profesional askok ez dute artikulu honetan aparteko ezer aurkituko, baina hasiberriek zerbait berria ikasteko aukera izango dute, eta datuen prozesamendu bizkor eta egituratu baterako koaderno bereizia egiteko amesten duen edonork kodea kopiatu eta formateatu dezake bere kabuz, edo deskargatu amaitutako koadernoa Github-etik.

Datu multzoa jaso dugu. Zer egin hurrengoan?

Beraz, estandarra: zertaz ari garen ulertu behar dugu, irudi orokorra. Horretarako, pandak erabiltzen ditugu datu mota desberdinak definitzeko.

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

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

Datuen aurreprozesatzeko koaderno-orria

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

Datuen aurreprozesatzeko koaderno-orria

Ikus ditzagun zutabeen balioak:

  1. Zutabe bakoitzeko lerro kopurua bat al dago lerro kopuru osoarekin?
  2. Zein da zutabe bakoitzeko datuen funtsa?
  3. Zein zutabe bideratu nahi dugu horren iragarpenak egiteko?

Galdera hauen erantzunak datu-multzoa aztertzeko eta zure hurrengo ekintzetarako plan bat marraztu ahal izango duzu.

Gainera, zutabe bakoitzeko balioak sakonago ikusteko, pandas describe() funtzioa erabil dezakegu. Hala ere, funtzio honen desabantaila da ez duela kateen balioak dituzten zutabeei buruzko informaziorik ematen. Aurrerago jorratuko ditugu.

df.describe()

Datuen aurreprozesatzeko koaderno-orria

Ikuspegi magikoa

Ikus dezagun non ez dugun baliorik:

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

Datuen aurreprozesatzeko koaderno-orria

Hau goitik begirada labur bat zen, orain gauza interesgarriagoetara pasako gara

Saia gaitezen errenkada guztietan balio bakarra duten zutabeak bilatzen eta, ahal bada, kentzen (ez dute emaitzari inola ere eragingo):

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

Orain gure burua eta gure proiektuaren arrakasta lerro bikoiztuetatik babesten ditugu (lehendik dagoen lerroetako baten ordena berean informazio bera duten lerroetatik):

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

Datu multzoa bitan banatzen dugu: bata balio kualitatiboekin, eta bestea kuantitatiboekin

Hemen argitze txiki bat egin behar dugu: datu kualitatiboetan eta kuantitatiboetan falta diren datuak dituzten lerroak ez badaude elkarren artean oso erlazionatuta, orduan erabaki beharko dugu zer sakrifikatzen dugun - falta diren datuak dituzten lerro guztiak, zati bat bakarrik, edo zutabe jakin batzuk. Lerroak korrelazionatzen badira, datu multzoa bitan banatzeko eskubide osoa dugu. Bestela, lehenik eta behin falta diren datuak kualitatiboki eta kuantitatiboki korrelazionatzen ez dituzten lerroei aurre egin beharko diezu, eta ondoren datu-multzoa bitan banatu.

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

Hau egiten dugu bi datu mota ezberdin hauek prozesatzea errazteko; gero ulertuko dugu horrek zenbat errazten duen gure bizitza.

Datu kuantitatiboekin lan egiten dugu

Egin behar dugun lehenengo gauza datu kuantitatiboetan "espioi-zutabeak" dauden ala ez zehaztea da. Zutabe horiei deitzen diegu bere burua datu kuantitatibo gisa aurkezten dutelako, baina datu kualitatibo gisa jokatzen dutelako.

Nola definitzen ditugu? Jakina, dena aztertzen ari zaren datuen izaeraren araberakoa da, baina orokorrean horrelako zutabeek datu berezi gutxi izan ditzakete (3-10 balio esklusiboen eskualdean).

print(df_numerical.nunique())

Espioi-zutabeak identifikatu ondoren, datu kuantitatiboetatik datu kualitatiboetara eramango ditugu:

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

Azkenik, datu kuantitatiboak guztiz bereizi ditugu datu kualitatiboetatik eta orain behar bezala lan egin dezakegu. Lehenengo gauza balio hutsak non ditugun ulertzea da (NaN, eta kasu batzuetan 0 balio huts gisa onartuko da).

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

Puntu honetan, garrantzitsua da ulertzea zer zutabetan zeroek falta diren balioak adieraz ditzaketen: datuak nola bildu diren? Edo datuen balioekin erlazionatuta egon daiteke? Galdera hauek kasuan-kasuan erantzun behar dira.

Beraz, zeroak dauden lekuetan datuak falta izan daitezkeela erabakitzen badugu, zeroak NaN-rekin ordezkatu beharko genituzke gero galdutako datu hauekin lan egitea errazteko:

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

Ikus dezagun non falta diren datuak:

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

Datuen aurreprozesatzeko koaderno-orria

Hemen falta diren zutabeen barneko balio horiek horiz markatu behar dira. Eta orain dibertsioa hasten da - nola aurre egin balio horiei? Balio edo zutabe hauek dituzten errenkadak ezabatu behar al ditut? Edo balio huts hauek beste batzuekin bete?

Hona hemen gutxi gorabeherako diagrama bat, printzipioz balio hutsekin zer egin daitekeen erabakitzen lagunduko dizuna:

Datuen aurreprozesatzeko koaderno-orria

0. Kendu beharrezkoak ez diren zutabeak

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

1. Zutabe honetako balio hutsen kopurua % 50 baino handiagoa al da?

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

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

2. Ezabatu balio hutsak dituzten lerroak

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

3.1. Ausazko balio bat txertatzea

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

3.2. Balio konstante bat txertatzea

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. Sartu batez besteko balioa edo maizena

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. Txertatu beste eredu batek kalkulatutako balioa

Batzuetan, balioak erregresio ereduak erabiliz kalkula daitezke sklearn liburutegiko edo antzeko beste liburutegiko ereduak erabiliz. Gure taldeak beste artikulu bat eskainiko du etorkizun hurbilean hori nola egin daitekeen jakiteko.

Beraz, oraingoz, datu kuantitatiboei buruzko kontakizuna eten egingo da, zeren eta beste hainbat Γ±abardura baitaude zeregin ezberdinetarako datuak prestatzea eta aurreprozesatzea hobeto nola egin, eta datu kuantitatiboetarako oinarrizko gauzak kontuan hartu dira artikulu honetan, eta orain datu kualitatiboetara itzultzeko garaia da.kuantitatiboetatik hainbat urrats bereizi genituen. Koaderno hau nahi duzun bezala alda dezakezu, zeregin ezberdinetara egokituz, datuen aurreprozesatzea oso azkar joan dadin!

Datu kualitatiboak

Funtsean, datu kualitatiboetarako, One-hot-coding metodoa erabiltzen da kate batetik (edo objektu) zenbaki batera formateatzeko. Puntu honetara joan aurretik, erabil ditzagun goiko diagrama eta kodea balio hutsei aurre egiteko.

df_categorical.nunique()

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

Datuen aurreprozesatzeko koaderno-orria

0. Kendu beharrezkoak ez diren zutabeak

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

1. Zutabe honetako balio hutsen kopurua % 50 baino handiagoa al da?

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

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

2. Ezabatu balio hutsak dituzten lerroak

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

3.1. Ausazko balio bat txertatzea

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

3.2. Balio konstante bat txertatzea

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)

Beraz, azkenean lortu dugu datu kualitatiboen nuluei buruzko helduleku bat. Orain zure datu-basean dauden balioetan kodeketa bero bat egiteko garaia da. Metodo hau sarritan erabiltzen da zure algoritmoak kalitate handiko datuetatik ikas dezakeela ziurtatzeko.

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

Beraz, azkenik datu kualitatibo eta kuantitatibo bereiziak prozesatzen amaitu dugu; horiek berriro konbinatzeko garaia da

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

Datu multzoak batera konbinatu ondoren, azkenik, datuen eraldaketa erabil dezakegu sklearn liburutegiko MinMaxScaler erabiliz. Honek gure balioak 0 eta 1 artekoak izango dira, eta horrek etorkizunean eredua entrenatzen lagunduko du.

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

Datu hauek edozertarako prest daude orain: sare neuronalak, ML algoritmo estandarrak, etab.!

Artikulu honetan, ez dugu kontuan hartu denbora serieko datuekin lan egitea, datu horietarako prozesatzeko teknika apur bat desberdinak erabili behar dituzulako, zure zereginaren arabera. Etorkizunean, gure taldeak aparteko artikulu bat eskainiko dio gai honi, eta zure bizitzara zerbait interesgarria, berria eta erabilgarria ekartzea espero dugu, hau bezalaxe.

Iturria: www.habr.com

Gehitu iruzkin berria