2015-02-21 18 views
10

Mam następujące dane ze wszystkich zmiennych kategorycznych:Vowpal Wabbit jak do reprezentowania kategorycznych możliwości

class education income social_standing 
    1  basic  low  good 
    0  low  high  V_good 
    1  high  low  not_good 
    0  v_high  high  good 

Tutaj edukacja ma cztery poziomy (podstawowe, niskie, wysokie i v_high). dochód ma dwa poziomy niski i wysoki; i social_standing ma trzy poziomy (good, v_good i not_good).

O ile moje rozumienie konwersji powyższe dane do formatu VW jest zainteresowana, to będzie coś takiego:

1 |person education_basic income_low social_standing_good 
    0 |person education_low income_high social_standing_v_good 
    1 |person education_high income_low social_standing_not_good 
    0 |person education_v_high income_high social_standing_good 

Tutaj, „osoba”, jest przestrzeń nazw, a wszystkie inne są wartościami funkcji, poprzedzone odpowiednimi nazwami funkcji. Mam rację? W jakiś sposób ta reprezentacja wartości cech jest dla mnie dość kłopotliwa. Czy istnieje inny sposób reprezentowania funkcji? Będą wdzięczni za pomoc.

Odpowiedz

16

Tak, masz rację.

Ta reprezentacja na pewno pracować z vowpal Wabbit, ale pod pewnymi warunkami, może nie być optymalne (to zależy).

Do reprezentowania niż uporządkowane, zmiennych jakościowych (z dyskretnych wartości), przy czym średnia vowpal Wabbit trik jest zastosowanie logicznych/wartości logiczne dla każdego możliwego (nazwa, wartość) kombinacji (np person_is_good, color_blue, color_red). Powodem tego jest to, że vw domyślnie przyjmuje wartość 1 wszędzie tam, gdzie brakuje wartości. Nie ma praktycznej różnicy między wartościami color_red, color=red, , a nawet (color,red) i color_red:1 z wyjątkiem lokalizacji skrótów w pamięci. Jedynymi znakami, których nie można użyć w nazwie zmiennej, są specjalne separatory (: i |) oraz białe znaki.

Uwaga dotycząca terminologii: ta sztuczka polegająca na zamianie każdej pary (funkcja + wartość) na osobną funkcję jest czasami nazywana "Jednym z gorących kodowań".

Ale w tym przypadku wartości zmiennych mogą nie być "ściśle kategoryczne". Mogą to być:

  • ściśle uporządkowane, np (low < basic < high < v_high)
  • Przypuszczalnie mają monotoniczny zależność z etykietą starasz się przewidzieć

więc przez czyniąc je "ścisłymi kategorycznymi" (moje określenie zmiennej o dyskretnym zakresie, który nie ma dwóch powyższych właściwości), możesz tracić pewne informacje kapelusz może pomóc w nauce.

W danym przypadku można uzyskać lepszy wynik, konwertując wartości na wartości liczbowe, np. (1, 2, 3, 4) dla edukacji. ja.e można użyć coś takiego:

1 |person education:2 income:1 social_standing:2 
0 |person education:1 income:2 social_standing:3 
1 |person education:3 income:1 social_standing:1 
0 |person education:4 income:2 social_standing:2 

Zestaw szkolenie w pytaniu powinny działać prawidłowo, ponieważ nawet podczas konwersji wszystkich zmiennych dyskretnych do zmiennych logicznych jak ty, vw powinien własny odkryć zarówno kolejności, a monotoniczności z etykietą z samych danych, o ile te dwie właściwości są prawdziwe i istnieje wystarczająca ilość danych do ich dedukcji.

Oto krótki oszustwo arkuszy dla zmiennych kodujących w vowpal Wabbit:

Variable type  How to encode    readable example 
-------------  -------------    ---------------- 
boolean    only encode the true case is_alive 
categorical   append value to name   color=green 
ordinal+monotonic :approx_value    education:2 
numeric    :actual_value    height:1.85 

Uwagi końcowe:

  • W vw wszystkie zmienne są numeryczne. Kodowanie trików jest po prostu praktycznymi sposobami, aby pojawiać się w postaci jako categorical lub . Zmienne Boolean są po prostu numeryczne 0 lub 1; Zmienne kategorialne mogą być zakodowane jako boolean: name + value: 1.
  • Każda zmienna, której wartość nie jest monotoniczna z etykietą, może być mniej przydatna przy kodowaniu liczbowym.
  • Każda zmienna, która nie jest liniowo powiązana z etykietą, może korzystać z nieliniowej transformacji przed treningiem.
  • Każda zmienna o wartości zerowej nie będzie różnicy do modelu (wyjątek: gdy opcja --initial_weight <value> jest używany), więc może być usunięty z treningu ustawiony
  • Podczas analizowania funkcji, tylko : jest uważany za szczególny separator (między nazwą zmiennej a jej wartością numeryczną) wszystko inne jest uważane za część nazwy, a cały ciąg nazwy jest mieszany do miejsca w pamięci. Brakująca część :<value> implikuje :1

Edycja: Co imieniny obowiązuje?

Przestrzenie nazw są poprzedzone nazwami funkcji z separatorem znaków specjalnych, dzięki czemu mapują one identyczne funkcje do różnych pozycji skrótu. Przykład:

|E low |I low 

jest zasadniczo równoważna (bez spacji nazwa płaskiej przykład):

| E^low:1 I^low:1 

Głównym zastosowaniem imienin przestrzeni jest łatwo przedefiniować wszystkich członków nazwy miejsca na coś innego , zignoruj ​​pełną nazwę obszaru funkcji, krzyżuj cechy przestrzeni nazw z innymi itd. (zobacz opcje: -q, --cubic, --redefine, , --keep).

+1

Dzięki. Bardzo wyraźnie. Z wyjątkiem tego, że boolean (pierwszy wiersz arkusza oszukiwania) czy rozumiem logiczny lub binarny? Oznacza to, że jeśli jest to plik binarny (z dowolnymi dwiema wartościami i niekoniecznie w znaczeniu Prawda/Fałsz), nie będę musiał poprzedzać kolumny nazwą kolumny, ale wystarczy wpisać wartość taką, jaka jest, ale w pozostałych trzech przypadkach nazwy kolumn będą musiały poprzedza wartości w jakiejś formie. – user3282777

+0

Pierwszy wiersz "boolean" oznacza logiczny: albo true lub false (0 lub 1). Druga linia: kategoryczne może przyjmować dowolną liczbę dyskretnych wartości, w tym 2. – arielf

+2

Dzięki. Wszystkie te wyjaśnienia znacznie ułatwiają korzystanie z Vowpal Wabbit. – user3282777

Powiązane problemy