Përpara se të filloj këtë artikull, dua të lehtësoj skepticizmin tuaj për kalimin nga panda në RAPIDS cudf, RAPIDS cudf përdor të njëjtën API si pandat!

RAPIDS po zhvendos flukset tradicionale të punës së Shkencës së të Dhënave në grupet e të dhënave tabelare në GPU. Kohët e fundit, "George Sief" postoi një "artikull mbi drejt shkencës së të dhënave" që tregon se biblioteka RAPIDS cudf mund të llogarisë vlerën mesatare në një kolonë të caktuar që përmban 100 milion rreshta në 5.12 ms kundrejt 82.2 ms në panda. Ky artikull do të eksplorojë më tej shpejtësitë e arritura me RAPIDS dhe cudf në kontekstin e inxhinierisë së veçorive për "Sfida e Kaggle NFL Data Bowl". Ne arrijmë të paktën një përshpejtim 10x në pothuajse çdo veçori të projektuar, duke krahasuar RAPIDS në PC të Data Science me 2 GPU NVIDIA Titan RTX 24 GB nga Digital Storm.

Në këtë artikull, ne do të ndërtojmë veçori të reja nga grupi i të dhënave NFL Data Bowl si BMI, Orientimi mbrojtës kundrejt Largësisë, Marzhi dhe Urgjenca. Ne gjithashtu do të normalizojmë veçoritë duke e ndarë secilën vlerë në një kolonë veçori me vlerën maksimale të veçorisë. Në secilin rast, ne do t'i referohemi pandave kundrejt bibliotekës së kufjeve RAPIDS!

Ju mund t'i qaseni fletores Jupyter me kodin nga ky artikull "këtu" dhe unë kam bërë gjithashtu një "video që e shpjegon këtë" nëse dëshironi të ndiqni këtë rrugë!

Për të filluar, ne do të 16x madhësinë e grupit të të dhënave NFL Data Bowl në mënyrë që të tregojmë fuqinë e RAPIDS / cudf në grupe të dhënash të mëdha. Baza e të dhënave NFL është zgjedhur më shumë sepse e bën të lehtë kuptimin e konceptit të inxhinierisë së veçorive. RAPIDS është me të vërtetë më i përshtatshmi për grupe të mëdha të dhënash me miliona regjistrime.

# Increase the dataset size by stacking it on top of itself
pd_data = pd.concat([pd_data, pd_data], ignore_index=True)
# repeated 3 more times

Tani ne do t'i transferojmë pandat DataFrame në cudf dhe dask-cudf DataFrames!

import cudf
import dask_cudf
cudf_data = cudf.from_pandas(pd_data)
dask_data = dask_cudf.read_csv('./cleaned_data.csv')

Kodi i mësipërm nxjerr në pah një nga pjesët më të mira të RAPIDS. Është modeluar pikërisht sipas API-së së pandave, kështu që shkencëtarët e të dhënave nuk duhet të shqetësohen për dhimbjen e kokës që do të marrin duke migruar në një sintaksë të re. Në këtë kod ne ngarkojmë pandat DataFrame në cudf me sintaksën .from_pandas() dhe dokumentacioni i dask rekomandon që të ngarkoni të dhënat direkt nga skedari csv, kështu që ne e bëjmë atë në këtë mënyrë.

Vlera mesatare e kolonës

Pas tutorialit të fundit nga "George Sief on Towards Data Science", ne vëzhgojmë kohën që duhet për të llogaritur mesataren e një kolone të caktuar në DataFrame:

pd_data['PlayerHeight'].mean() # 29.1 ms
cudf_data['PlayerHeight'].mean() # 466 µs
dask_data['PlayerHeight'].mean() # 1.46 ms

Në këtë rast, ne shohim një përshpejtim ~ 60X në cudf kundrejt pandave. Cudf tejkalon dask-cudf këtu, por dyshoj se kjo është për shkak se dask-cudf është optimizuar më mirë për llojin e grupeve të të dhënave që do ta bënte të pamundur edhe krahasimin me pandat në radhë të parë.

DefendersInTheBox_vs_Distance

Krediti i idesë së veçorive: https://www.kaggle.com/cpmpml/initial-wrangling-voronoi-areas-in-python

Ky funksion do të shikojë oborret e nevojshme për një ulje të parë në krahasim me orientimin e mbrojtjes.

pd_data['DefendersInTheBox_vs_Distance'] = pd_data['DefendersInTheBox'] / pd_data['Distance'] # 36.9 ms
cudf_data['DefendersInTheBox_vs_Distance'] = cudf_data['DefendersInTheBox'] / cudf_data['Distance'] # 3.1 ms

BMI

Kredia për idenë e veçorive: https://www.kaggle.com/bgmello/neural-networks-feature-engineering-for-the-win

Kjo veçori do të llogarisë BMI-në e vrapuesit bazuar në lartësinë dhe peshën. Kjo është veçoria që marrim shpejtësinë më të ulët.

pd_data['BMI'] = 703 * (pd_data['PlayerWeight']/pd_data['PlayerHeight']**2) # 64.3 ms
cudf_data['BMI'] = 703 * (cudf_data['PlayerWeight'] / cudf_data['PlayerHeight']**2) # 15.7 ms

Marzhi

Kjo veçori do të llogarisë diferencën e rezultatit, ndoshta nëse skuadra fiton/humbet me një farë mase, ata kanë më shumë gjasa të drejtojnë topin me sukses.

pd_data['Margin'] = pd_data['HomeScoreBeforePlay'] - pd_data['VisitorScoreBeforePlay'] # 32 ms
cudf_data['Margin'] = cudf_data['HomeScoreBeforePlay'] - cudf_data['HomeScoreBeforePlay'] # 3.46 ms

Urgjente

Kjo veçori do të llogarisë urgjencën e dhënë nga tremujori * marzhi. Ndoshta nëse është çereku i 4-të dhe loja është afër, lojtari do ta vrasë topin më tej.

pd_data['Urgency'] = pd_data['Quarter'] * pd_data['Margin'] # 33.6ms
cudf_data['Urgency'] = pd_data['Quarter'] * pd_data['Margin'] #3.4ms

Normalizimi i vlerës maksimale

Një lloj teknikë e normalizimit dembel është thjesht të ndani të gjitha vlerat në një kolonë me vlerën maksimale në kolonë. Kjo bëhet për të shkallëzuar vlerat midis [0, 1] dhe për të lehtësuar trajnimin e modeleve të mësimit të makinerive.

for col in pd_data:
  pd_data[col] /= pd_data[col].max() # 1.28 s
for col in cudf_data:
  cudf_data[col] /= cudf_data[col].max() # 117 ms

RAPIDS Feature Engineering: Mendimet përmbyllëse

Kjo fletore thekson disa shembuj ku RAPIDS arrin një shpejtësi masive për operacionet ETL si inxhinieria e veçorive dhe normalizimi. Kjo është vërtet emocionuese për aplikimet në Regjistrat Elektronikë të Shëndetit, të dhënat e sigurimit, bioinformatikën dhe fusha të tjera të ndryshme të të dhënave që përshkruhen më së miri në formatet e të dhënave tabelare! Faleminderit për leximin, ju lutemi shikoni videon më poshtë duke shpjeguar këtë:

https://www.youtube.com/watch?v=A9lgUwA8RrY&t=13s