Prezentacja: tworzenie funkcji

W tradycyjnym programowaniu w centrum uwagi skupia się na kodzie. W projektach z systemami uczącymi się skup się na reprezentacji. Jednym ze sposobów na udoskonalanie modelu jest dodawanie i ulepszanie jego cech.

Mapowanie nieprzetworzonych danych na obiekty

Po lewej stronie rys. 1 przedstawiono nieprzetworzone dane ze źródła danych wejściowych, a po prawej – wektor cech, który jest zbiorem wartości zmiennoprzecinkowych zawierających przykłady ze zbioru danych. Inżynieria cech oznacza przekształcanie nieprzetworzonych danych w wektor cech. Może się okazać, że będziesz poświęcać dużo czasu na opracowywanie funkcji.

Wiele modeli systemów uczących się musi przedstawiać cechy jako wektory ponumerowane rzeczywiste, ponieważ wartości cech muszą być mnożone przez wagi modelu.

Nieprzetworzone dane są mapowane na wektor cech w procesie nazywanym inżynierią cech.

Rysunek 1. Inżynieria cech mapuje nieprzetworzone dane na funkcje ML.

Mapowanie wartości liczbowych

Dane całkowite i zmiennoprzecinkowe nie wymagają specjalnego kodowania, ponieważ można je mnożyć przez wagę liczbową. Zgodnie z tym, co widać na Rysunku 2, przekształcenie nieprzetworzonej wartości całkowitej 6 na wartość cechy 6,0 jest nieistotne:

Przykład funkcji, którą można skopiować bezpośrednio z nieprzetworzonych danych

Rysunek 2. Mapuj wartości całkowite na wartości zmiennoprzecinkowe.

Mapowanie wartości kategorialnych

Funkcje kategorialne mają określony zestaw możliwych wartości. Możesz na przykład użyć funkcji street_name z opcjami obejmującymi:

{'Charleston Road', 'North Shoreline Boulevard', 'Shorebird Way', 'Rengstorff Avenue'}

Modele nie mogą mnożyć ciągów przez nauczone wagi, więc do konwertowania ciągów na wartości liczbowe używamy inżynierii cech.

Aby to zrobić, należy zdefiniować mapowanie wartości cech, które będziemy określać jako słownictwo możliwych wartości na liczby całkowite. Nie każda ulica na świecie pojawi się w naszym zbiorze danych, więc możemy zgrupować wszystkie pozostałe ulice w kategorię „inne” typu OOV (out-of-vocabulary).

Oto jak przypisać nazwy ulic do numerów w ten sposób:

  • zmapuj ulicę Charleston Road na 0
  • zmapuj bulwar North Shoreline na numer 1
  • pokaż trasę biegnącą przez Żoliborztwo na drogę 2
  • mapuj ulicę Rengstorffa na 3
  • zmapuj wszystko inne (OOV) na 4

Jeśli jednak włączymy te numery indeksów bezpośrednio w modelu, nałożymy na pewne ograniczenia, które mogą być problematyczne:

  • Nauczymy się jednej wagi, która będzie stosowana do wszystkich ulic. Jeśli na przykład ustalimy wagę 6 dla street_name, pomnożymy ją przez 0 dla Charleston Road, przez 1 dla North Shoreline Boulevard, 2 dla Shorebird Way i tak dalej. Rozważmy model, który prognozuje ceny domów, używając właściwości street_name. Liniowe dostosowanie ceny na podstawie nazwy ulicy jest mało prawdopodobne, a dodatkowo zakłada się, że kolejność ulic została określona na podstawie średniej ceny domu. Nasz model wymaga elastyczności polegającej na zapamiętywaniu różnych wag dla każdej ulicy, które zostaną dodane do szacunkowej ceny za pomocą innych funkcji.

  • Nie uwzględniamy przypadków, w których street_name może przyjmować wiele wartości. Na przykład wiele domów znajduje się na rogu 2 uliczek i nie można zakodować tej informacji w wartości street_name, jeśli ma ona 1 indeks.

Aby usunąć oba te ograniczenia, możemy zamiast tego utworzyć wektor binarny dla każdej cechy kategorialnej w naszym modelu, który reprezentuje te wartości:

  • Dla wartości, które mają zastosowanie w tym przykładzie, ustaw odpowiadające im elementy wektorowe na 1.
  • Ustaw wszystkie pozostałe elementy na 0.

Długość tego wektora jest równa liczbie elementów w słowniku. Ta reprezentacja jest nazywana kodowaniem jednokrotnym, gdy pojedyncza wartość to 1, oraz kodowaniem wielokrotnym, gdy wiele wartości to 1.

Rysunek 3 przedstawia jednoznaczne kodowanie konkretnej ulicy: Shorebird Way. Element w wektorze binarnym drogi Shorebird ma wartość 1, a elementy z innych ulic – 0.

Mapowanie wartości ciągu (

Rysunek 3. Mapowanie adresu pocztowego za pomocą kodowania „1 hot”.

W ramach tego podejścia tworzy się zmienną logiczną dla każdej wartości cechy (np. nazwy ulicy). W tym przypadku, jeśli dom jest przy Shorebird Way, wartość binarna wynosi 1 tylko dla tego miejsca. Dlatego model wykorzystuje tylko wagę w przypadku drogi Shorebird.

I podobnie, jeśli dom znajduje się na rogu 2 uliczek, dwie wartości binarne są ustawiane na 1, a model wykorzystuje obie wagi.

Reprezentacja rozproszona

Załóżmy,że w zbiorze danych masz 1 000 000 różnych nazw ulic,które chcesz uwzględnić jako wartości dla wskaźnika street_name. Wyraźne utworzenie wektora binarnego zawierającego 1 000 000 elementów,w którym jest prawdziwe tylko 1 lub 2 elementy,jest bardzo nieefektywne pod względem czasu przechowywania i obliczenia podczas przetwarzania tych wektorów. W takiej sytuacji często używanym jest rozległa reprezentacja, w której przechowywane są tylko wartości inne niż zero. W przypadku rozproszonych prezentacji w przypadku każdej wartości cechy waga niezależnego modelu jest określana, jak opisano powyżej.