2.2 Duomenų išankstinis apdorojimas

Iki šiol dirbome su sintetiniais duomenimis, kurie buvo pateikti jau paruoštuose tenzoriuose. Tačiau norint taikyti gilųjį mokymąsi realiame pasaulyje, turime išgauti netvarkingus duomenis, saugomus savavališkais formatais, ir juos iš anksto apdoroti pagal savo poreikius. Laimei, pandas biblioteka gali atlikti didžiąją dalį sunkaus darbo. Šis skyrelis, nors ir neatstoja tinkamo pandas vadovo, suteiks jums greitąjį kursą apie kai kurias dažniausias procedūras.

2.2.1 Duomenų rinkinio skaitymas

Kableliais atskirtų reikšmių (angl. comma-separated values, CSV) failai yra plačiai paplitę lentelinių (skaičiuoklės tipo) duomenų saugojimui. Juose kiekviena eilutė atitinka vieną įrašą ir susideda iš kelių (kableliais atskirtų) laukų, pvz., „Albert Einstein,March 14 1879,Ulm,Federal polytechnic school,field of gravitational physics". Norėdami pademonstruoti, kaip įkelti CSV failus naudojant pandas, (toliau sukuriame CSV failą) ../data/house_tiny.csv. Šis failas vaizduoja namų duomenų rinkinį, kuriame kiekviena eilutė atitinka atskirą namą, o stulpeliai – kambarių skaičių (NumRooms), stogo tipą (RoofType) ir kainą (Price).

import os

os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:
    f.write('''NumRooms,RoofType,Price
NA,NA,127500
2,NA,106000
4,Slate,178100
NA,NA,140000''')

Dabar importuokime pandas ir įkelkime duomenų rinkinį naudodami read_csv.

import pandas as pd

data = pd.read_csv(data_file)
print(data)

2.2.2 Duomenų paruošimas

Prižiūrimame mokyme apmokome modelius prognozuoti nurodytą tikslinę reikšmę, kai duotas tam tikras įvesties reikšmių rinkinys. Pirmasis mūsų žingsnis apdorojant duomenų rinkinį yra atskirti stulpelius, atitinkančius įvesties ir tikslines reikšmes. Stulpelius galime pasirinkti pagal pavadinimą arba naudodami indeksavimą pagal sveikąją padėtį (iloc).

Galbūt pastebėjote, kad pandas pakeitė visus CSV įrašus su reikšme NA speciale NaN (angl. not a number, „ne skaičius") reikšme. Tai taip pat gali nutikti, kai įrašas tuščias, pvz., „3,,,270000". Jos vadinamos trūkstamomis reikšmėmis ir yra duomenų mokslo „blakės" – nuolatinė grėsmė, su kuria susidursite visos savo karjeros metu. Priklausomai nuo konteksto, trūkstamos reikšmės gali būti tvarkomos arba imputavimu, arba šalinimu. Imputavimas pakeičia trūkstamas reikšmes jų reikšmių įverčiais, o šalinimas tiesiog atmeta tas eilutes arba tuos stulpelius, kuriuose yra trūkstamų reikšmių.

Štai keletas dažnų imputavimo euristikų. Kategoriniams įvesties laukams NaN galime traktuoti kaip kategoriją. Kadangi stulpelis RoofType įgyja reikšmes Slate ir NaN, pandas gali konvertuoti šį stulpelį į du stulpelius RoofType_Slate ir RoofType_nan. Eilutėje, kurios stogo tipas yra Slate, RoofType_Slate ir RoofType_nan reikšmės bus atitinkamai 1 ir 0. Priešingai yra eilutei, kurios RoofType reikšmė trūksta.

inputs, targets = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)

Trūkstamoms skaitinėms reikšmėms viena dažna euristika yra pakeisti NaN įrašus atitinkamo stulpelio vidutine reikšme.

inputs = inputs.fillna(inputs.mean())
print(inputs)

2.2.3 Konvertavimas į tenzoriaus formatą

Dabar, kai visi inputs ir targets įrašai yra skaitiniai, galime juos įkelti į tenzorių (prisiminkite 2.1 skyrelis).

from mxnet import np

X, y = np.array(inputs.to_numpy(dtype=float)), np.array(targets.to_numpy(dtype=float))
X, y
import torch

X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(targets.to_numpy(dtype=float))
X, y
import tensorflow as tf

X = tf.constant(inputs.to_numpy(dtype=float))
y = tf.constant(targets.to_numpy(dtype=float))
X, y
from jax import numpy as jnp

X = jnp.array(inputs.to_numpy(dtype=float))
y = jnp.array(targets.to_numpy(dtype=float))
X, y

2.2.4 Diskusija

Dabar žinote, kaip padalyti duomenų stulpelius, imputuoti trūkstamus kintamuosius ir įkelti pandas duomenis į tenzorius. 5.7 skyrelis įgysite dar keletą duomenų apdorojimo įgūdžių. Nors šiame greitajame kurse viską supaprastinome, duomenų apdorojimas gali tapti sudėtingas. Pavyzdžiui, užuot buvę viename CSV faile, mūsų duomenys gali būti išsklaidyti po kelis failus, išgautus iš reliacinės duomenų bazės. Pavyzdžiui, elektroninės prekybos taikyme klientų adresai gali būti vienoje lentelėje, o pirkimų duomenys – kitoje. Be to, praktikai susiduria su daugybe duomenų tipų, be kategorinių ir skaitinių, pavyzdžiui, teksto eilutėmis, vaizdais, garso duomenimis ir taškų debesimis. Dažnai reikia pažangių įrankių ir efektyvių algoritmų, kad duomenų apdorojimas netaptų didžiausiu mašininio mokymosi proceso kliuviniu. Šios problemos iškils, kai pereisime prie kompiuterinės regos ir natūraliosios kalbos apdorojimo. Galiausiai turime atkreipti dėmesį į duomenų kokybę. Realaus pasaulio duomenų rinkiniuose dažnai pasitaiko išskirčių, klaidingų jutiklių matavimų ir registravimo klaidų, kurias reikia pašalinti prieš pateikiant duomenis bet kuriam modeliui. Duomenų vizualizavimo įrankiai, tokie kaip seaborn, Bokeh ar matplotlib, gali padėti jums rankiniu būdu peržiūrėti duomenis ir susidaryti intuiciją apie problemų, kurias gali tekti spręsti, tipą.

2.2.5 Pratimai

  1. Pabandykite įkelti duomenų rinkinius, pvz., Abalone iš UCI mašininio mokymosi saugyklos, ir ištirkite jų savybes. Kokia jų dalis turi trūkstamų reikšmių? Kokia kintamųjų dalis yra skaitiniai, kategoriniai ar tekstiniai?
  2. Pabandykite indeksuoti ir pasirinkti duomenų stulpelius pagal pavadinimą, o ne pagal stulpelio numerį. Pandas dokumentacija apie indeksavimą pateikia daugiau informacijos, kaip tai padaryti.
  3. Kokio dydžio duomenų rinkinį, jūsų manymu, galėtumėte taip įkelti? Kokie gali būti apribojimai? Užuomina: apsvarstykite duomenų skaitymo laiką, vaizdavimą, apdorojimą ir atminties pėdsaką. Išbandykite tai savo nešiojamajame kompiuteryje. Kas nutinka, jei tai išbandote serveryje?
  4. Kaip elgtumėtės su duomenimis, turinčiais labai daug kategorijų? O jei visos kategorijų žymės unikalios? Ar pastarąsias reikėtų įtraukti?
  5. Kokių pandas alternatyvų galite sugalvoti? O kaip NumPy tenzorių įkėlimas iš failo? Susipažinkite su Pillow, Python vaizdų biblioteka.

Diskusijos

Diskusijos

Diskusijos

Diskusijos