Příprava dat pro strojové učení

Dokončeno

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 rozdílové 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žené na textových souborech obsahujících chyby nebo hodnoty null, se běžně používá k chybnému přetypování číselných polí do datového typu řetězce a často hodnoty, které představují diskrétní celočíselné hodnoty, můžou být chybně zasílané na 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 zahrnutými duplicitními řádky nebo převzorkovat převzorkované řá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")

Pokud se data načetla do rozdílové tabulky v pracovním prostoru Azure Databricks, můžete k načtení 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"))

Tip

Další informace o funkcích datového rámce Sparku najdete v dokumentaci k datovému rámci Sparku.

Příprava a předběžné zpracování funkcí

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 funkcí je iterativní přístup, který často zahrnuje určitou zkušební verzi a chybu, aby bylo možné určit, které sloupce funkcí mají prediktivní hodnotu a jak nejlépe znázorňovat funkce. 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 funkcí: V některých případech může být číselná hodnota při diskretizaci do kategorií, které představují konkrétní rozsahy hodnot, prokázat prediktivní. 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í typu 1 nebo 0 , ve které vytvoříte nový sloupec pro každou možnou kategorii, a podle potřeby přiřadit hodnotu 1 nebo 0 každému sloupci, například takto:

    Původní barevný sloupec Zelený Červený Modrý
    Zelené 0 0 0
    Blue 0 0 1
    Červené 0 1 0
  • Číselné hodnoty škálování (normalizace): Číselné datové hodnoty jsou často na různých škálách nebo jednotkách měření mezi sebou. 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:

    length hmotnost scaled_length scaled_weight
    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 zapadá algoritmus kódování na diskrétní řetězcové hodnoty ve sloupci catCol v datovém rámci 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ězí posloupnost vyhodnocovačů a transformátorů společně v kanálu , který provádí veškeré kroky přípravy a předběžného zpracování funkcí, které potřebujete k přípravě dat. Kanál může končit algoritmem strojového učení, který funguje jako vyhodnocovače k určení operací potřebných k predikci popisku z připravených funkcí. Výstupem kanálu je model strojového učení, což je ve skutečnosti transformátor, který lze použít k použití funkce modelu na funkce v datovém rámci a predikci odpovídajících hodnot popisku.