Kiirdata töötlemise mÀrkmed

Tihti inimesed, kes astuvad Data Science'i valdkonda, omavad ebatÀpseid ettekujutusi sellest, mis neid ees ootab. Paljud arvavad, et nad hakkavad kohe kirjutama vÔimsaid nÀrvivÔrke, looma raudmehe hÀÀleabi vÔi alistama kÔik rahaturud.
Aga töö Andmed teadlasena on andmetega seotud ja ĂŒks tĂ€htsamaid ning ajakulukamaid hetki on andmete töötlemine enne nende esitamiseks nĂ€rvivĂ”rgule vĂ”i teatud viisil analĂŒĂŒsimiseks.

Selles artiklis kirjeldab meie meeskond, kuidas andmeid lihtsalt ja kiiresti töödelda samm-sammult juhiste ja koodiga. PĂŒĂŒdsime muuta koodi piisavalt paindlikuks, et seda saaks kasutada erinevate andmekogude puhul.

Paljudele professionaalidele ei pruugi see artikkel osutuda midagi erakordset, aga algajad saavad siin midagi uut Ôppida, samuti saavad kÔik need, kes on kaua unistanud endale eraldi notebooki kiireks ja struktureeritud andmete töötlemiseks, kopeerida koodi ja kohandada seda vastavalt oma vajadustele, vÔi laadida valmis notebooki Githubist.

Oleme saanud andmekogu. Mida edasi teha?

Nii et standard: peame mĂ”istma, millega me tegeleme, ĂŒldpilti. Selleks kasutame pandas't, et lihtsalt mÀÀratleda erinevad andmetĂŒĂŒbid.

import pandas as pd #impordime pandas
import numpy as np  #impordime numpy
df = pd.read_csv("AB_NYC_2019.csv") #loeme andmekogu ja salvestame muutuja df

df.head(3) #vaatame kolme esimest rida, et mÔista, millised on vÀÀrtused

Kiirdata töötlemise mÀrkmed

df.info() #NĂ€itame teavet veergude kohta

Kiirdata töötlemise mÀrkmed

Vaadake veergude vÀÀrtusi:

  1. Kas iga veeru ridade arv vastab ĂŒldisele ridade arvule?
  2. Mis on iga veeru andmete sisu?
  3. Millist veergu soovime kasutada sihtmÀrgina, et teha sellele ennustusi?

Nendele kĂŒsimustele vastamine vĂ”imaldab andmekogu analĂŒĂŒsida ja koostada plaan edasisteks tegevusteks.

Samuti, et sĂŒvitsi minna igas veerus olevate vÀÀrtuste uurimisse, saame kasutada pandas'i describe() funktsiooni. TĂ”si, selle funktsiooni miinus on see, et see ei anna teavet string-vÀÀrtuste veergude kohta. Sellega tegeleme hiljem.

df.describe()

Kiirdata töötlemise mÀrkmed

Imeline visualiseerimine

Vaadake, kus meil on tÀielikult puuduvad vÀÀrtused:

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

Kiirdata töötlemise mÀrkmed

See oli vĂ€ike ĂŒlevaade, nĂŒĂŒd liigume huvitavamate asjade juurde

Proovime leida ja vĂ”imalusel eemaldada veergud, kus on kĂ”igis ridades vaid ĂŒks vÀÀrtus (need ei mĂ”juta tulemust):

df = df[[c for c
        in list(df)
        if len(df[c].unique()) > 1]] #Kandes andmestiku ĂŒmber, jĂ€tame ainult need veerud, kus on rohkem kui ĂŒks ainulaadne vÀÀrtus

NĂŒĂŒd kaitseme end ja meie projekti edu duplikaat-ridade eest (ridade eest, mis sisaldavad samu andmeid samas jĂ€rjekorras nagu juba olemasolev rida):

df.drop_duplicates(inplace=True) #Teeme seda, kui peame vajalikuks.
                                 #MÔnes projektis ei tasu selliseid andmeid alguses kustutada.

Jagame andmestiku kaheks: ĂŒks kvaliteetsete vÀÀrtuste jaoks ja teine - kvantitatiivsete jaoks.

Siin on vaja teha vÀike tÀpsustus: kui rida, kus on puuduvad andmed, kvaliteetsete ja kvantitatiivsete andmete osas ei ole omavahel tugevalt seotud, siis tuleb otsustada, millega me loobume - kÔigist puuduvate andmetega ridadest, ainult nende osast vÔi teatud veergudest. Kui read on omavahel seotud, siis on meil tÀielik Ôigus andmestik kaheks jagada. Vastasel juhul tuleb esmalt lahendada read, kus puuduvad andmed kvaliteetsete ja kvantitatiivsete andmete osas, ja alles seejÀrel jagada andmestikku kaheks.

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

Teeme seda, et meil oleks lihtsam töödelda neid kahte erinevat andme tĂŒĂŒpi - hiljem nĂ€eme, kui palju see meie elu lihtsustab.

Töötame kvantitatiivsete andmetega

Esimene asi, mida meil tasub teha - veenduda, et kvantitatiivsete andmete seas ei ole „spiooniveerge“. Me nimetame neid veerge nii, sest nad annavad endast mĂ€rku kvantitatiivsete andmete seas, kuid tegelikult toimivad nad kvaliteetsetena.

Kuidas neid tuvastada? Loomulikult sĂ”ltub see andmete iseloomust, mida te analĂŒĂŒsite, kuid enamasti vĂ”ivad sellised veerud omada vĂ€he ainulaadseid andmeid (umbes 3-10 ainulaadset vÀÀrtust).

print(df_numerical.nunique())

PĂ€rast seda, kui oleme tuvastanud spiooniveerud, liigutame need kvantitatiivsete andmete hulgast kvaliteetsete andmete hulka:

spy_columns = df_numerical[['veerg1', 'veerg2', 'veerg3']]#valik spy veerge ja kirjutame eraldi dataframe’isse
df_numerical.drop(labels=['veerg1', 'veerg2', 'veerg3'], axis=1, inplace = True)#kÀrpime need veerud kvantitatiivsetest andmetest
df_categorical.insert(1, 'veerg1', spy_columns['veerg1']) #lisame esimese spy veeru kvalitatiivsetesse andmetesse
df_categorical.insert(1, 'veerg2', spy_columns['veerg2']) #lisame teise spy veeru kvalitatiivsetesse andmetesse
df_categorical.insert(1, 'veerg3', spy_columns['veerg3']) #lisame kolmanda spy veeru kvalitatiivsetesse andmetesse

LĂ”puks oleme tĂ€ielikult eraldanud kvantitatiivsed andmed kvalitatiivsetest ja nĂŒĂŒd saame nendega tĂ”eliselt töötada. Esiteks — tuleb mĂ”ista, kus meil on tĂŒhjad vÀÀrtused (NaN, ja mĂ”nel juhul ka 0 loetakse tĂŒhjaks vÀÀrtuseks).

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

Sellel etapil on oluline mĂ”ista, millistes veergudes nullid vĂ”ivad tĂ€hendada puuduvad vÀÀrtused: kas see on seotud andmete kogumise meetodiga? VĂ”i vĂ”is see olla seotud andmete vÀÀrtustega? Nendele kĂŒsimustele tuleb vastata igas eraldi juhtumis.

Nii et, kui me tÔesti oleme otsustanud, et andmed vÔivad puududa seal, kus on nullid, peaksime asendama nullid NaN-idega, et oleks lihtsam hiljem nendega töötada:

df_numerical[["veerg 1", "veerg 2"]] = df_numerical[["veerg 1", "veerg 2"]].replace(0, nan)

NĂŒĂŒd vaatame, kus meil on andmed puuduvad:

sns.heatmap(df_numerical.isnull(),yticklabels=False,cbar=False,cmap='viridis') # VÔib kasutada ka df_numerical.info()

Kiirdata töötlemise mÀrkmed

Siin peaksid kollase vĂ€rviga olema tĂ€histatud need vÀÀrtused veergudes, mis puuduvad. Ja kĂ”ige huvitavam algab nĂŒĂŒd — kuidas nende vÀÀrtustega kĂ€ituda? Kas eemaldada need read vĂ”i veerud? VĂ”i tĂ€ita need tĂŒhjad vÀÀrtused millegi muuga?

Siin on ligikaudne skeem, mis vÔib aidata teil otsustada, mida puuduvate vÀÀrtustega teha:

Kiirdata töötlemise mÀrkmed

0. Eemaldame mittevajalikud veerud

df_numerical.drop(labels=["veerg1","veerg2"], axis=1, inplace=True)

1. Kas selle veeru tĂŒhjade vÀÀrtuste arv ĂŒletab 50%?

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

df_numerical.drop(labels=["veerg1","veerg2"], axis=1, inplace=True)#Eemaldame, kui mĂ”nes veerus on ĂŒle 50 tĂŒhja vÀÀrtuse

2. Eemaldame read tĂŒhjade vÀÀrtustega

df_numerical.dropna(inplace=True) # Kustutame reads, kus on tĂŒhjad vÀÀrtused, kui andmeid jÀÀb piisavalt alles Ă”ppimiseks

3.1. Sisestame juhusliku vÀÀrtuse

import random # impordime random
df_numerical["veerg"].fillna(lambda x: random.choice(df[df[column] != np.nan]["veerg"]), inplace=True) # sisestame juhuslikud vÀÀrtused tabeli tĂŒhjadesse rakkudesse

3.2. Sisestame konstantse vÀÀrtuse

from sklearn.impute import SimpleImputer # impordime SimpleImputer, mis aitab vÀÀrtusi sisestada
imputer = SimpleImputer(strategy='constant', fill_value="") # sisestame kindla vÀÀrtuse SimpleImputer'i abil
df_numerical[["uus_veeru1", 'uus_veeru2', 'uus_veeru3']] = imputer.fit_transform(df_numerical[['veerg1', 'veerg2', 'veerg3']]) # Rakendame seda meie tabelis
df_numerical.drop(labels=["veerg1", "veerg2", "veerg3"], axis=1, inplace=True) # Eemaldame veerud vanade vÀÀrtustega

3.3. Sisestame keskmise vÔi kÔige sagedasema vÀÀrtuse

from sklearn.impute import SimpleImputer # impordime SimpleImputer, mis aitab vÀÀrtusi sisestada
imputer = SimpleImputer(strategy='mean', missing_values=np.nan) # mean'i asemel vÔib kasutada ka most_frequent
df_numerical[["uus_veeru1", 'uus_veeru2', 'uus_veeru3']] = imputer.fit_transform(df_numerical[['veerg1', 'veerg2', 'veerg3']]) # Rakendame seda meie tabelis
df_numerical.drop(labels=["veerg1", "veerg2", "veerg3"], axis=1, inplace=True) # Eemaldame veerud vanade vÀÀrtustega

3.4. Sisestame vÀÀrtuse, mille arvutab vÀlja teine mudel

MĂ”nikord saab vÀÀrtusi arvutada regressioonimudelite abil, kasutades mudelite raamatukogusid nagu sklearn vĂ”i muid sarnaseid raamatukogusid. Meie meeskond pĂŒhendab lĂ€hitulevikus eraldi artikli sellele, kuidas seda teha.

Niisiis, vahepeal katkestame jutustuse kvantitatiivsetest andmetest, kuna on palju muid nĂŒansse, kuidas paremini andmete ettevalmistust ja eelprotsessimist erinevate ĂŒlesannete jaoks teha, ning selles artiklis on arvestatud pĂ”hiasjadega kvantitatiivsete andmete kohta. NĂŒĂŒd on aeg tagasi liikuda kvalitatiivsete andmete juurde, mille eraldasime mĂ”ned sammud tagasi kvantitatiivsetest. Saate seda notebokaasi muuta nii, nagu soovite, kohandades seda erinevate ĂŒlesannete jaoks, et andmete eelprotsessimine toimuks vĂ€ga kiiresti!

Kvalitatiivsed andmed

Peamiselt kvaliteetsete andmete jaoks kasutatakse meetodit One-hot-encoding, et vormindada need stringist (vĂ”i objektist) numbriteks. Enne kui liigume sellele punktile, kasutame ĂŒlalpool olevat skeemi ja koodi, et aru saada puuduvatest vÀÀrtustest.

df_categorical.nunique()

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

Kiirdata töötlemise mÀrkmed

0. Eemaldame mittevajalikud veerud

df_categorical.drop(labels=["kolonna1", "kolonna2"], axis=1, inplace=True)

1. Kas selle veeru tĂŒhjade vÀÀrtuste arv ĂŒletab 50%?

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

df_categorical.drop(labels=["kolonna1", "kolonna2"], axis=1, inplace=True) #Eemaldame, kui mÔni kolonna
                                                                          #sisaldab rohkem kui 50% puuduvaid vÀÀrtusi

2. Eemaldame read tĂŒhjade vÀÀrtustega

df_categorical.dropna(inplace=True) #Eemaldame read puuduvate vÀÀrtustega,
                                   #kui hiljem jÀÀb piisavalt andmeid Ôpetamiseks

3.1. Sisestame juhusliku vÀÀrtuse

import random
df_categorical["kolonna"].fillna(lambda x: random.choice(df[df[column] != np.nan]["kolonna"]), inplace=True)

3.2. Sisestame konstantse vÀÀrtuse

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='constant', fill_value="")
df_categorical[["uus_kolonna1", 'uus_kolonna2', 'uus_kolonna3']] = imputer.fit_transform(df_categorical[['kolonna1', 'kolonna2', 'kolonna3']])
df_categorical.drop(labels=["kolonna1", "kolonna2", "kolonna3"], axis=1, inplace=True)

Nii, nĂŒĂŒd oleme lĂ”puks leidnud lahenduse puuduvaid vÀÀrtusi kvaliteetsetes andmetes. NĂŒĂŒd on aeg rakendada one-hot-encoding vÀÀrtustele, mis on teie andmebaasis. See meetod on vĂ€ga sageli kasutatav, et teie algoritm saaks Ă”ppida arvestades kvaliteetseid andmeid.

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 = ["kolonna1", "kolonna2", "kolonna3"]
for feature in features_to_encode:
    df_categorical = encode_and_bind(df_categorical, feature))

NĂŒĂŒd oleme lĂ”puks lĂ”petanud kvaliteetsete ja kvantitatiivsete andmete töötlemise eraldi — aeg on need uuesti kokku viia.

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

PĂ€rast seda, kui oleme andmebaasid ĂŒhte liitnud, saame kasutada andmete muutmist MinMaxScaleriga sklearn raamatukogust. See paneb meie vÀÀrtused vahemikku 0 kuni 1, mis aitab tulevikus mudelit koolitada.

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

Need andmed on nĂŒĂŒd valmis kĂ”igeks — nĂ€rvivĂ”rkudeks, tavaliste ML algoritmideks jne!

Selles artiklis me ei kĂ€sitlenud ajareaga seotud andmete töötlemist, kuna selliste andmete jaoks tuleks kasutada veidi teisi töötlemistehnikaid, olenevalt teie ĂŒlesandest. Tulevikus pĂŒhendab meie meeskond sellele teemale eraldi artikli ja loodame, et see suudab tuua Teie ellu midagi huvitavat, uut ja kasulikku, nagu ka see artikkel.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster