Przygotowywanie danych do uczenia maszynowego
Przed utworzeniem modelu uczenia maszynowego należy przygotować dane, których będziesz używać do trenowania i oceniania. Dane są pozyskiwane do usługi Azure Databricks ze źródła, często jako pliki danych. Opcjonalnie możesz tworzyć tabele różnicowe na podstawie plików danych, aby uprościć eksplorację i analizę danych. Po pozyskiwaniu danych analityk danych przygotowuje je do uczenia maszynowego.
Zazwyczaj przygotowywanie danych obejmuje dwa kluczowe zadania:
- Czyszczenie danych: identyfikowanie i łagodzenie problemów z danymi, które będą mieć wpływ na jego użyteczność do uczenia maszynowego.
- Inżynieria cech i wstępne przetwarzanie: wybieranie i przekształcanie odpowiednich funkcji na potrzeby trenowania modelu.
Czyszczenie danych
Konkretne kroki wymagane do czyszczenia danych różnią się w zależności od projektu do projektu, ale typowe problemy, które należy rozwiązać, obejmują:
- Niekompletne dane: Dane często zawierają rekordy, w których brakuje poszczególnych pól (często wskazywanych przez obecność wartości NULL). Musisz zidentyfikować brakujące wartości i wyeliminować je przez:
- Podstawianie ich odpowiednim zastąpieniem — interpolowaniem wartości w serii przy użyciu średniej (lub mediany) lub utworzenia innej odpowiedniej wartości.
- Całkowite usunięcie niekompletnych wierszy (przy założeniu, że pozostawia to wystarczającą ilość odpowiednich reprezentatywnych danych do modelowania)
- Błędy: nie jest rzadkością, aby dane zawierały błędy spowodowane błędami wprowadzania danych lub nie powiodły się przetwarzanie danych nadrzędnych. Znajdowanie błędów może być trudne i zwykle wiąże się ze znaczną kontrolą danych przy użyciu zapytań i wizualizacji w celu podsumowania danych i wyszukania wartości, które nie są zgodne z większością innych wartości w danym polu.
- Wartości odstające: wartości odstające są znacznie poza (powyżej lub poniżej) rozkładem statystycznym danych. Czasami wartości odstające wskazują błąd (na przykład ktoś może mieć wartość z dodatkowym zerem lub pominiętym punktem dziesiętnym), a czasami są to prawdziwe wartości, które są niezwykle wysokie lub niskie w porównaniu z większością obserwacji. W obu przypadkach skrajne wartości odstające mogą negatywnie wpłynąć na trenowanie modelu uczenia maszynowego; dlatego zwykle najlepiej jest je obsłużyć, resetując je do górnej lub niższej wartości progowej lub usuwając rekordy zawierające wartości odstające z zestawu danych.
- Nieprawidłowe typy danych: algorytmy uczenia maszynowego mogą być wrażliwe na typy danych przypisane do wartości funkcji. Często w przypadku zestawów danych, które były oparte na plikach tekstowych zawierających błędy lub wartości null w celu błędnego emisji pól liczbowych do typu danych ciągu , a często wartości reprezentujące dyskretne wartości całkowite mogą być błędniecast do liczb dziesiętnych (lub odwrotnie). Należy zbadać schemat danych i przypisać odpowiednie typy danych, które najlepiej odzwierciedlają wartości danych.
- Dane niezrównoważone: trenowanie uczenia maszynowego działa najlepiej, jeśli dane szkoleniowe mają odpowiednią reprezentację dla wszystkich różnych kombinacji funkcji i etykiet, które mogą zostać napotkane. W niezrównoważonym zestawie danych rekordy, które zawierają określoną wartość kategorii lub kombinację pól, są nadmiernie reprezentowane; które mogą wpływać na algorytm trenowania i wprowadzać stronniczą odchylenie do modelu. Typową techniką rozwiązywania tego problemu jest zastąpienie niedostatecznie reprezentowanych wartości przez dołączone zduplikowane wiersze lub niedoample nadmiernie reprezentowanych wierszy (przez usunięcie ich z zestawu danych).
W usłudze Azure Databricks najczęstszym sposobem wykrywania i obsługi tego rodzaju problemów jest napisanie kodu w notesie, który eksploruje dane i manipuluje nimi. Podstawową klasą używaną do tego rodzaju manipulowania danymi jest ramka danych platformy Spark.
Na przykład następujący kod ładuje dane z pliku tekstowego do ramki danych:
df = spark.read.format("csv").option("header", "true").load("/myfolder/mydata.csv")
Alternatywnie, jeśli dane zostały załadowane do tabeli różnicowej w obszarze roboczym usługi Azure Databricks, możesz użyć zapytania SQL, aby załadować dane do ramki danych:
df = spark.sql("SELECT * FROM mytable")
Po załadowaniu danych do ramki danych można użyć jej metod i innych funkcji w bibliotece Spark SQL, aby eksplorować i przekształcać dane. Na przykład poniższy kod używa metody dropna , aby usunąć wszystkie wiersze, które zawierają wartości null, i przypisuje określone typy danych do kolumn w ramce danych.
clean_data = df.dropna().select(col("column1").astype("string"),
col("column2").astype("float"))
Napiwek
Aby uzyskać więcej informacji na temat funkcji ramek danych platformy Spark, zobacz dokumentację ramki danych platformy Spark.
Inżynieria cech i wstępne przetwarzanie
Po upewnieniu się, że zestaw danych jest kompletny i czysty, możesz rozpocząć przygotowywanie funkcji do uczenia maszynowego. Inżynieria cech to podejście iteracyjne, które często wiąże się z próbą i błędem w celu określenia, które kolumny funkcji mają wartość predykcyjną i jak najlepiej reprezentować funkcje. Typowe zadania inżynierii cech i przetwarzania wstępnego obejmują:
Wyprowadzanie nowych funkcji: często można uzyskać nowe, bardziej predykcyjne funkcje z istniejących. Załóżmy na przykład, że zestaw danych zawiera kolumnę dat i podejrzewasz, że data ukończenia może nie być ważnym czynnikiem predykcyjnym podczas identyfikowania etykiety, ale może to być dzień tygodnia. Możesz utworzyć nową funkcję day_of_week pochodzącą z daty i przetestować teorię.
Dyskretyzowanie cech liczbowych: w niektórych przypadkach wartość liczbowa może okazać się bardziej predykcyjna w przypadku dyskretyzacji w kategoriach reprezentujących określone zakresy wartości. Możesz na przykład wziąć wartości liczbowe w funkcji ceny i przypisać je do kategorii niskich, średnich i wysokich na podstawie odpowiednich progów.
Funkcje kategorii kodowania: wiele zestawów danych obejmuje dane podzielone na kategorie, które są reprezentowane przez wartości ciągów. Jednak większość algorytmów uczenia maszynowego działa najlepiej z danymi liczbowymi. W związku z tym często przypisywanie kodów liczbowych do reprezentowania kategorii zamiast ciągów. Na przykład zestaw danych szczegółów produktu może zawierać funkcję koloru , która może mieć wartość "Zielony", "Czerwony" lub "Niebieski". Te wartości można zakodować przy użyciu prostych kodów całkowitych, takich jak 0 dla wartości "Green", 1 dla "Red" i 2 dla "Blue". Alternatywnie można użyć metody kodowania jednokrotnego, w której tworzysz nową kolumnę dla każdej możliwej kategorii, i przypisz wartość 1 lub 0 do każdej kolumny odpowiednio dla każdego wiersza, w następujący sposób:
Oryginalna kolumna koloru Green (Zielony) Czerwony Blue (Niebieski) Green (Zielony) 1 0 0 Blue (Niebieski) 0 0 1 Czerwony 0 1 0 Skalowanie (normalizacja) wartości liczbowych: Wartości liczbowe są często w różnych skalach lub jednostkach miary od siebie. Algorytmy uczenia maszynowego przetwarzają je wszystkie jako bezwzględne wartości liczbowe, a funkcje o większych wartościach często dominują w trenowaniu modelu. Aby rozwiązać ten problem, często skalowanie wszystkich kolumn liczbowych w taki sposób, aby poszczególne wartości pojedynczej kolumny utrzymywały tę samą proporcjonalną relację ze sobą, ale wszystkie kolumny liczbowe są w podobnej skali. Załóżmy na przykład, że zestaw danych zawiera wartości długości i wagi mierzone w metrach i kilogramach. Obie te funkcje można przekonwertować na skalowaną wartość z zakresu od 0 do 1 w następujący sposób:
length waga scaled_length scaled_weight 250.0 2.1 0,250 0.210 176.0 0,9 0.176 0,09
Wiele bibliotek uczenia maszynowego obejmuje klasy, których można używać do wykonywania typowych zadań inżynierii cech. Na przykład biblioteka MLlib platformy Spark zawiera klasę StringIndexer , której można użyć do wykonywania prostego kodowania opartego na liczbach całkowitych dla wartości ciągów.
from pyspark.ml.feature import StringIndexer
encoder = StringIndexer(inputCol="catCol", outputCol="catColCode")
encoded_data = encoder.fit(data).transform(data)
Uwaga
Warto dokładniej wyjaśnić przykładowy kod StringIndexer. Klasy MLlib platformy Spark mogą zawierać ewaluatory, które pasują do algorytmu dla określonej operacji przekształcania do niektórych przykładowych danych. W tym przypadku właściwość StringIndexer pasuje do algorytmu kodowania do dyskretnych wartości ciągów w kolumnie catCol w ramce danych w celu określenia określonych obliczeń wymaganych do wygenerowania nowej kolumny catColCode zawierającej zakodowane wartości. Dane wyjściowe ewaluatora to transformator , który hermetyzuje funkcję zdefiniowaną przez ewaluatora i która może zastosować tę funkcję do danych i wygenerować nową ramkę danych. W tym przykładzie przekazujemy te same dane używane do określenia funkcji kodowania do wynikowego transformatora w celu rzeczywistego zastosowania kodowania.
W usłudze Spark MLLib można połączyć sekwencję ewaluatorów i transformatorów w potoku , który wykonuje wszystkie kroki inżynierii cech i przetwarzania wstępnego, które należy przygotować. Potok może kończyć się algorytmem uczenia maszynowego, który działa jako ewaluator, aby określić operacje wymagane do przewidywania etykiety na podstawie przygotowanych funkcji. Dane wyjściowe potoku to model uczenia maszynowego, który jest w rzeczywistości transformatorem, który może służyć do stosowania funkcji modelu do funkcji w ramce danych i przewidywania odpowiednich wartości etykiet.