Příprava dat pro strojové učení
Než budete moct vytvořit model strojového učení, musíte připravit data, která použijete k trénování a vyhodnocení. Data se ingestují do Azure Databricks ze svého zdroje, často jako datové soubory. Volitelně můžete vytvořit delta tabulky založené na datových souborech, které zjednoduší zkoumání a analýzu dat. Po ingestování dat je datový vědec připraví na strojové učení.
Příprava dat obvykle zahrnuje dva klíčové úkoly:
- Čištění dat: Identifikace a zmírnění problémů v datech, které ovlivní jejich užitečnost pro strojové učení.
- Příprava a předběžné zpracování funkcí: Výběr a transformace vhodných funkcí pro trénování modelů
Čištění dat
Konkrétní kroky potřebné k vyčištění dat se liší od projektu po projekt, ale mezi typické problémy, které je potřeba vyřešit, patří:
-
Neúplná data: Data často obsahují záznamy, ve kterých chybí jednotlivá pole (často označená přítomností hodnot NULL). Potřebujete identifikovat chybějící hodnoty a zmírnit je pomocí:
- Nahraďte je vhodným nahrazením – buď interpolací hodnoty v řadě, použitím střední (nebo mediánové) hodnoty nebo vytvořením jiné vhodné hodnoty.
- Úplné odebrání neúplných řádků (za předpokladu, že tento postup ponechá dostatek vhodných reprezentativních dat pro modelování)
- Chyby: Není neobvyklé, že data obsahují chyby způsobené chybami při zadávání dat nebo neúspěšným upstreamovým zpracováním dat. Nalezení chyb může být obtížné a obvykle zahrnuje důkladnou kontrolu dat pomocí dotazů a vizualizací k sumarizaci dat a vyhledání hodnot, které nejsou v souladu s většinou ostatních hodnot v daném poli.
- Odlehlé hodnoty: Odlehlé hodnoty jsou hodnoty, které jsou výrazně mimo (nad nebo pod) statistické rozdělení dat. Někdy jsou odlehlé hodnoty indikací chyby (například někdo může mít hodnotu s nadbytečnou nulou nebo vynechanou desetinnou čárkou) a někdy se jedná o skutečné hodnoty, které jsou v porovnání s většinou pozorování neobvykle vysoké nebo nízké. V obou případech mohou extrémní odlehlé hodnoty negativně ovlivnit trénování modelu strojového učení; proto je obvykle nejlepší zpracovat jejich resetováním na horní nebo nižší prahovou hodnotu nebo odebráním záznamů, které obsahují odlehlé hodnoty z datové sady.
- Nesprávné datové typy: Algoritmy strojového učení mohou být citlivé na datové typy přiřazené k hodnotám funkcí. U datových sad, které byly založeny na textových souborech obsahujících chyby nebo nulové hodnoty, se běžně stává, že číselná pole jsou chybně přetypována na datový typ řetězce. Často se stává, že hodnoty, které představují diskrétní celočíselné hodnoty, mohou být chybně zaměněny za desetinná čísla (nebo naopak). Měli byste prozkoumat schéma dat a přiřadit odpovídající datové typy, které nejúčeněji odrážejí hodnoty dat.
- Nevyvážená data: Trénování strojového učení funguje nejlépe, pokud trénovací data mají odpovídající reprezentaci pro všechny různé kombinace funkcí a popisků, se kterými se můžou setkat. V nevyvážené datové sadě jsou záznamy, které obsahují konkrétní kategorickou hodnotu nebo kombinaci polí, příliš reprezentovány; které mohou ovlivnit trénovací algoritmus a zavést do modelu předsudky. Běžnou technikou, jak tento problém zmírnit, je převzorkovat nedostatečně reprezentované hodnoty přidáním duplicitních řádků, nebo podvzorkovat nadměrně reprezentované řádky (odebráním z datové sady).
V Azure Databricks je nejběžnější způsob, jak tyto druhy problémů rozpoznat a zpracovat, psát kód v poznámkovém bloku, který zkoumá data a manipuluje s nimi. Primární třídou používanou pro tento druh manipulace s daty je datový rámec Spark.
Například následující kód načte data z textového souboru do datového rámce:
df = spark.read.format("csv").option("header", "true").load("/myfolder/mydata.csv")
Alternativně, pokud byla data načtena do delta tabulky v pracovním prostoru Azure Databricks, můžete k načtení jejích dat do datového rámce použít dotaz SQL.
df = spark.sql("SELECT * FROM mytable")
Po načtení dat do datového rámce můžete pomocí jejích metod a dalších funkcí v knihovně Spark SQL zkoumat a transformovat data. Následující kód například pomocí metody dropna odebere všechny řádky, které obsahují hodnoty null, a přiřadí konkrétní datové typy sloupcům v datovém rámci.
clean_data = df.dropna().select(col("column1").astype("string"),
col("column2").astype("float"))
Návod
Další informace o funkcích datového rámce Sparku najdete v dokumentaci k datovému rámci Sparku.
Inženýrství příznaků a předběžné zpracování dat
Po zajištění dokončení a vyčištění datové sady můžete začít připravovat funkce pro strojové učení. Příprava vlastností je iterativní přístup, který často zahrnuje zkoušení a omyly, aby bylo možné určit, které sloupce vlastností mají prediktivní hodnotu, a jak nejlépe reprezentovat vlastnosti. Mezi běžné úlohy přípravy a předběžného zpracování funkcí patří:
Odvozování nových funkcí: Často můžete odvodit nové, prediktivní funkce z existujících funkcí. Předpokládejme například, že datová sada obsahuje sloupec kalendářních dat a máte podezření, že úplné datum nemusí být důležitým prediktivním faktorem při identifikaci popisku, ale že by mohl být den v týdnu. Můžete vytvořit novou funkci day_of_week odvozenou od data a otestovat teorii.
Diskretizace číselných vlastností: V některých případech může být číselná hodnota prediktivnější, když je diskretizována do kategorií, které představují konkrétní rozsahy hodnot. Můžete například vzít číselné hodnoty ve funkci ceny a přiřadit je do nízkých, středních a vysokých kategorií na základě odpovídajících prahových hodnot.
Kategorické funkce kódování: Mnoho datových sad zahrnuje kategorická data reprezentovaná řetězcovými hodnotami. Většina algoritmů strojového učení ale funguje nejlépe s číselnými daty. Proto je běžné přiřazovat číselné kódy k reprezentaci kategorií místo řetězců. Například datová sada podrobností o produktu může obsahovat funkci pro barvu , která může mít hodnotu "Zelená", "Červená" nebo "Modrá". Tyto hodnoty můžete kódovat pomocí jednoduchých celočíselné kódy, například 0 pro "Zelená", 1 pro "Červená" a 2 pro "Modrá". Alternativně můžete použít metodu kódování jedním horkým vektorem, ve kterém vytvoříte nový sloupec pro každou možnou kategorii, a podle potřeby přiřadíte hodnotu 1 nebo 0 každému řádku, například takto:
Původní barevný sloupec Zelený Červený Modrý Zelený 1 0 0 Modrý 0 0 1 Červený 0 1 0 Škálování (normalizace) číselných hodnot: Číselné datové hodnoty jsou často na různých škálách nebo jednotkách měření. Algoritmy strojového učení je zpracovávají jako absolutní číselné hodnoty a funkce s většími hodnotami můžou často dominovat trénování modelu. Chcete-li tento problém vyřešit, je běžné škálovat všechny číselné sloupce tak, aby jednotlivé hodnoty pro jeden sloupec zachovaly stejnou proporcionální relaci k druhému, ale všechny číselné sloupce jsou v podobném měřítku. Předpokládejme například, že datová sada obsahuje hodnoty délky a hmotnosti měřené v metrech a kg. Obě tyto funkce můžete převést na škálovanou hodnotu mezi 0 a 1 takto:
délka hmotnost upravená_délka škálovaná hmotnost 250.0 2.1 0,250 0.210 176.0 0,9 0.176 0,09
Mnoho knihoven strojového učení zahrnuje třídy, které můžete použít k provádění běžných úloh přípravy funkcí. Například knihovna Spark MLlib obsahuje StringIndexer třídy, kterou můžete použít k provedení jednoduchého celočíselného kódování pro řetězcové hodnoty.
from pyspark.ml.feature import StringIndexer
encoder = StringIndexer(inputCol="catCol", outputCol="catColCode")
encoded_data = encoder.fit(data).transform(data)
Poznámka:
Je vhodné vysvětlit ukázku kódu StringIndexer trochu podrobněji. Třídy Spark MLlib mohou zahrnovat vyhodnocovače , které odpovídají algoritmu pro konkrétní transformační operaci na některá ukázková data. V tomto případě StringIndexer přiřadí algoritmus kódování pro diskrétní řetězcové hodnoty ve sloupci catCol v dataframe k určení konkrétních výpočtů potřebných k vygenerování nového sloupce catColCode obsahujícího kódované hodnoty. Výstup vyhodnocovače je transformátor , který zapouzdřuje funkci definovanou vyhodnocovačem a který ji může použít na data a vygenerovat nový datový rámec. V tomto příkladu předáváme stejná data, která slouží k určení funkce kódování do výsledného transformátoru, aby skutečně použil kódování.
Ve Spark MLLib můžete zřetězit posloupnost vyhodnocovačů a transformátorů do kanálu, který provádí veškeré kroky vytváření a předběžného zpracování příznaků, které potřebujete k přípravě dat. Kanál může být zakončen algoritmem strojového učení, který funguje jako vyhodnocovač k určení operací potřebných k predikci popisku z připravených atributů. Výstupem kanálu je model strojového učení, což je ve skutečnosti transformátor, který lze použít k aplikaci funkce strojového učení na atributy v datovém frame a k predikci odpovídajících hodnot popisků.