Pytanie:
Czy dobrą praktyką jest zawsze skalowanie / normalizowanie danych na potrzeby uczenia maszynowego?
Juan Antonio Gomez Moriano
2016-01-07 10:09:44 UTC
view on stackexchange narkive permalink

Rozumiem, że gdy niektóre funkcje mają różne zakresy wartości (na przykład wyobraź sobie, że jedną cechą jest wiek osoby, a drugą jej pensja w USD) wpłynie to negatywnie na algorytmy, ponieważ funkcja o większych wartościach zajmie większy wpływ, czy dobrą praktyką jest po prostu ZAWSZE skalowanie / normalizowanie danych?

Wydaje mi się, że jeśli wartości są już podobne, to normalizacja ich będzie miała niewielki wpływ, ale jeśli wartości czy bardzo różne normalizacja pomoże, jednak wydaje się to zbyt proste, aby mogło być prawdziwe :)

Czy czegoś mi brakuje? Czy są sytuacje / algorytmy, w których faktycznie pożądane jest, aby niektóre funkcje celowo przeważały nad innymi?

Powiązane: http://stats.stackexchange.com/questions/89809/is-it-important-to-scale-data-before-clustering
Siedem odpowiedzi:
one_observation
2016-01-07 10:53:13 UTC
view on stackexchange narkive permalink

Po pierwsze, nie sądzę, aby było wiele pytań w postaci „Czy dobrą praktyką jest zawsze X w uczeniu maszynowym”, gdzie odpowiedź będzie ostateczna. Zawsze? Zawsze zawsze? Wśród modeli parametrycznych, nieparametrycznych, bayesowskich, Monte Carlo, nauk społecznych, czysto matematycznych i milionów modeli cech? Byłoby miło, prawda!

A konkretnie, oto kilka powodów, na które: to po prostu zależy.

Czasami normalizacja jest dobra:

1) Przychodzi mi do głowy kilka algorytmów, w szczególności maszyny SVM, które czasami mogą zbiegać się znacznie szybciej na znormalizowanych danych (chociaż dlaczego, dokładnie, nie pamiętam).

2) Gdy model jest wrażliwy na wielkość, a jednostki dwóch różnych cech są różne i arbitralne. To tak, jak w przypadku, który sugerujesz, w którym coś wywiera większy wpływ niż powinno.

Ale oczywiście - nie wszystkie algorytmy wrażliwe na wielkość w sposób, który sugerujesz. Współczynniki regresji liniowej będą identyczne, jeśli wykonasz lub nie skalujesz danych, ponieważ analizuje się proporcjonalne relacje między nimi.

Czasami normalizacja jest źle:

1) Gdy chcesz zinterpretować współczynniki, a one nie normalizują się dobrze. Regresja na czymś takim jak dolary daje znaczący wynik. Regresja dotycząca proporcji maksymalnej kwoty dolarów w próbie może nie być.

2) Kiedy w rzeczywistości jednostki na twoich cechach mają znaczenie, a odległość ma znaczenie! Wracając do maszyn SVM - jeśli próbujesz znaleźć klasyfikator maksymalnego marginesu, wtedy jednostki, które wchodzą w ten „maksymalny”, mają znaczenie. Funkcje skalowania algorytmów klastrowania mogą znacząco zmienić wynik. Wyobraź sobie cztery skupiska wokół źródła, każda w innym kwadrancie, wszystkie ładnie wyskalowane. Teraz wyobraź sobie, że oś Y jest rozciągnięta do dziesięciokrotnej długości osi X. zamiast czterech małych grup ćwiartek otrzymasz długą, zgniecioną bagietkę danych pokrojoną na cztery części wzdłuż jej długości! (Ważną częścią jest to, że możesz preferować którekolwiek z nich!)

W moim niezadowalającym podsumowaniu najbardziej ogólną odpowiedzią jest to, że musisz poważnie zadać sobie pytanie, co ma sens w przypadku danych, i model, którego używasz.

Dziękuję za odpowiedź, ale tu kolejne pytanie, mówisz, że w modelach regresji normalizowanie np. Pensji (1000-100000) i (powiedzmy) wieku (10-80) niewiele pomoże (szczególnie dlatego, że traci się znaczenienumery ...), jeśli jednak tego nie znormalizuję, zdarzy się, że pensja będzie przewyższać wiek, prawda?
Co masz na myśli mówiąc, że przeważasz?Zakładam, że wynagrodzenie i wiek są tutaj niezależnymi zmiennymi.Normalizowanie ich zmienia tylko jednostki na ich współczynnikach.Ale na przykład ze względu na to, że jest jaśniejszy niż stała normalizująca, podzielmy przez powiedzmy 1000. Ale wtedy twój współczynnik oznacza po prostu zmianę-na - \ 1000 $-zmianę, w przeciwieństwie do zmiany-na - \ $ 1-zmianę.Liczby są różne, ale zawsze powinieneś myśleć o tym, co oznaczają twoje współczynniki - po prostu nie możesz poprzestać na samych liczbach.
Normalizując je, mam na myśli użycie funkcji takiej jak skala w r, takiej jak data $ wiek <-scale (data $ wiek) i data $ wynagrodzenie <- skala (dane $ wynagrodzenie).Pod koniec dnia, używając czegoś takiego jak regresja logistyczna, po prostu uczymy się parametrów wektora, prawda?gdyby taki wektor zawierał jakieś zmienne, których wartości są w dużo większym zakresie niż inne, czy nie byłby to problem?Bawiłem się danymi skalowanymi na potrzeby regresji logistycznej i bez nich, a skalowanie wydaje się pomagać ... Czy czegoś mi brakuje?
_Normalizowanie_, rozumiem - użyłeś słowa _ przeważają_, a nadal nie rozumiem, jak go używasz.I znowu, skalowanie „wydaje się pomagać” - co masz na myśli?Pomoc _jak_?
Być może to mój angielski :).Chodzi mi o to, że biorąc pod uwagę, że jedna zmienna (wynagrodzenie) ma szerszy zakres niż inna (powiedzmy wiek), będzie oznaczać, że wiek będzie miał bardzo małe znaczenie przy wykonywaniu prognoz, podczas gdy wynagrodzenie będzie czynnikiem decydującym onie zawsze pożądane.Przez „wydaje się pomagać” mam na myśli to, że podczas wypróbowywania modelu wytrenowanego ze skalowanymi wartościami lub bez nich, skalowany model uogólnia lepiej (przy użyciu zestawu walidacji krzyżowej).Mam nadzieję, że to wyjaśnia :)
@JuanAntonioGomezMoriano: To nieprawda: modele liniowe są niezmienne względem liniowych przekształceń ich predyktorów.Ma to znaczenie tylko wtedy, gdy penalizujesz szacunki współczynników zgodnie z ich wielkością (przypadek drugiego punktu sofologa).Zobacz [Podczas przeprowadzania regresji wielorakiej, kiedy należy wyśrodkować zmienne predykcyjne i kiedy należy je standaryzować?] (Http://stats.stackexchange.com/q/29781/17230).Jeśli skalowanie predyktorów prowadzi do * jakiejkolwiek zmiany * w przewidywaniach, ma to związek z problemami numerycznymi w algorytmie dopasowania.
„Współczynniki regresji liniowej będą identyczne, jeśli skalujesz dane lub nie”.Dotyczy to skalowania zarówno wejść, jak i wyjść za pomocą jednej stałej wartości.Ale skalowanie każdej cechy (lub wyniku) osobno zmieniłoby współczynniki.
Jedyną rzeczą, o której nikt jeszcze nie wspomniał, jest wpływ skal różnic niezależnych na „punkt przecięcia” modelu.Zdecydowanie możesz skończyć z negatywnymi przechwyceniami, które stają się trudne do zinterpretowania (raczej wyjaśnienia dyrektorowi).
Amir
2016-01-07 10:56:06 UTC
view on stackexchange narkive permalink

Uważam, że bardziej geometryczny punkt widzenia pomoże lepiej zdecydować, czy normalizacja pomoże, czy nie. Wyobraź sobie, że twój interesujący problem ma tylko dwie cechy i mają one różny zakres. Następnie geometrycznie punkty danych są rozmieszczone wokół i tworzą elipsoidę. Jeśli jednak cechy zostaną znormalizowane, będą bardziej skoncentrowane i, miejmy nadzieję, utworzą koło jednostkowe i sprawią, że kowariancja będzie ukośna lub przynajmniej bliska przekątnej. Na tym polega idea metod, takich jak normalizacja wsadowa pośrednich reprezentacji danych w sieciach neuronowych. Używając BN, prędkość zbieżności wzrasta zdumiewająco (może 5-10 razy), ponieważ gradient może z łatwością pomóc gradientom zrobić to, co powinny, aby zmniejszyć błąd.

W przypadku nieznormalizowanym gradient- oparte na algorytmach optymalizacji będzie bardzo trudno przesunąć wektory wagi w kierunku dobrego rozwiązania. Jednak powierzchnia kosztów dla przypadku znormalizowanego jest mniej wydłużona, a metody optymalizacji oparte na gradientach będą działać znacznie lepiej i będą mniej się różnić.

Z pewnością ma to miejsce w przypadku modeli liniowych, a zwłaszcza tych, których funkcja kosztu jest miarą rozbieżności wyniku modelu i celu (np. regresja liniowa z funkcją kosztu MSE), ale niekoniecznie przypadku w nieliniowych. Normalizacja nie szkodzi modelom nieliniowym; nie zrobienie tego dla modeli liniowych będzie bolało.

Poniższy obrazek można [z grubsza] potraktować jako przykład wydłużonej powierzchni błędu, na której metody oparte na gradientach mogą mieć trudności z pomocą wektorom wagi idź w kierunku lokalnych optima.

enter image description here

_Jednak normalizacja nie zaszkodzi modelom nieliniowym, ale nie zrobienie tego dla modeli liniowych zaszkodzi ._ To zdanie jest dla mnie trudne do zrozumienia.Czy (z grubsza mówiąc) nie ma znaczenia dla modeli nieliniowych, czy dane są znormalizowane?Jeśli nie zrobisz tego dla modeli liniowych, coś zepsuje, ale czy możesz lepiej określić modele nieliniowe?Spróbuj uniknąć mieszania pozytywnych i negatywnych wyrażeń w tym jednym zdaniu.
W modelach liniowych cechy o dużych zakresach będą powodować dużą zmienność modelu i dlatego mogą stać się niepotrzebnie ważne.Na przykład w PCA te cechy będą miały znacznie większe wartości własne niż inne.Jednak w modelach nieliniowych (zależy od wielu czynników) może tak nie być, ponieważ model może całkowicie zmienić reprezentację danych poprzez nieliniowości.Nie jest więc tak łatwo przeanalizować, co dzieje się w modelu nieliniowym i jak nieznormalizowane cechy wpływają na wynik.
Czyli w zasadzie efekt normalizacji w modelach nieliniowych jest trudny do przewidzenia i powinien być rozstrzygany indywidualnie dla każdego przypadku?
Prawdziwe.Chociaż zostało ustalone empirycznie, że normalizacja pomaga również w modelach nieliniowych.
Dziękuję za to wyjaśnienie.Pomogło mi to lepiej zrozumieć Twoją odpowiedź.
Czy mógłbyś dodać wyjaśnienie, co oznacza twój drugi wykres?
@JuanAntonioGomezMoriano To zbieżność (zbliżanie się do lokalnych minimów)
Jaka jest oś X i Y?
Oś X to liczba iteracji osi Y, która reprezentuje zbieżność
Vihari Piratla
2016-01-07 12:36:25 UTC
view on stackexchange narkive permalink

Pozwólcie, że opowiem wam historię o tym, jak dowiedziałem się, jak ważna jest normalizacja.

Próbowałem sklasyfikować dane zapisane odręcznie cyframi (jest to proste zadanie klasyfikowania cech wyodrębnionych z obrazów odręcznych cyfry) z sieciami neuronowymi jako zadanie w ramach kursu uczenia maszynowego.
Tak jak każdy inny, zacząłem od biblioteki / narzędzia sieci neuronowej, zasiliłem je danymi i zacząłem bawić się parametrami. Próbowałem zmieniać liczbę warstw, liczbę neuronów i różne funkcje aktywacyjne. Żaden z nich nie przyniósł oczekiwanych rezultatów (dokładność około 0,9).

Winowajca? Współczynnik (i) skalowania w funkcji aktywacji = $ \ frac {s} {1 + e ^ {- s.x}} $ - 1. Jeśli parametr s nie jest ustawiony, funkcja aktywacji aktywuje każde wejście lub anuluje każde wejście w każdej iteracji. Co oczywiście doprowadziło do nieoczekiwanych wartości parametrów modelu. Chodzi mi o to, że nie jest łatwo ustawić s , gdy wejściowe x zmienia się w zakresie dużych wartości.

Jak już wskazywały niektóre inne odpowiedzi, „dobra praktyka ”, czy normalizować dane, czy nie, zależy od danych, modelu i zastosowania. Normalizując, faktycznie odrzucasz pewne informacje o danych, takie jak bezwzględne wartości maksymalne i minimalne. Nie ma więc praktycznej zasady.

arielf
2016-01-08 02:51:51 UTC
view on stackexchange narkive permalink

Jak powiedzieli inni, normalizacja nie zawsze ma zastosowanie; na przykład z praktycznego punktu widzenia.

Aby móc skalować lub znormalizować funkcje do wspólnego zakresu, takiego jak [0,1] , musisz znać min / max (lub mean / stdev w zależności od zastosowanej metody skalowania) każdej funkcji. IOW: musisz mieć wszystkie dane dla wszystkich funkcji przed rozpoczęciem szkolenia.

Wiele praktycznych problemów związanych z nauką nie zapewnia wszystkich dane a-priori, więc po prostu nie można normalizować. Takie problemy wymagają podejścia do uczenia się online.

Należy jednak zauważyć, że niektóre algorytmy online (w przeciwieństwie do uczenia wsadowego), które uczą się na jednym przykładzie na raz, obsługują przybliżenie skalowania /normalizacja. Uczą się skal i iteracyjnie je kompensują. samogłoska wabbit na przykład iteracyjnie normalizuje domyślnie skalę (chyba że wyraźnie wyłączysz automatyczne skalowanie, wymuszając określony algorytm optymalizacji, taki jak naive --sgd )

probabilityislogic
2018-09-29 03:29:07 UTC
view on stackexchange narkive permalink

Skalowanie / normalizowanie nieznacznie zmienia model. W większości przypadków odpowiada to zastosowaniu funkcji afinicznej. Masz więc $ Z = A_X + B_XXC_X $ , gdzie $ X $ to Twoje „dane wejściowe / oryginalne” (jeden wiersz na każdy przykład szkolenia, jedna kolumna na każdą funkcję). Następnie $ A_X, B_X, C_X $ to macierze, które są zazwyczaj funkcjami $ X $ . Macierz $ Z $ jest tym, co wprowadzasz do swojego algorytmu ML.

Załóżmy teraz, że chcesz przewidzieć dla jakiejś nowej próbki. Ale masz tylko $ X_ {new} $ , a nie $ Z_ {new} $ . Powinieneś zastosować funkcję $ Z_ {new} = A_X + B_XX_ {new} C_X $ . Oznacza to, że należy użyć tego samego $ A_X, B_X, C_X $ ze zbioru danych szkoleniowych, zamiast je ponownie oszacować. To sprawia, że ​​te macierze mają taką samą postać jak inne parametry w Twoim modelu.

Chociaż często są one równoważne pod względem przewidywanych wartości uzyskanych ze zbioru danych treningowych, z pewnością nie dotyczy to nowych danych do prognoz. Prosty przykład: przewidywanie dla 1 $ nowej obserwacji, ujednolicenie tego (odjęcie średniej, podzielenie przez sd) zawsze zwróci zero.

Steven Scott
2018-09-29 02:06:16 UTC
view on stackexchange narkive permalink

W przypadku modeli systemów uczących się, które zawierają współczynniki (np. regresja, regresja logistyczna itp.), głównym powodem normalizacji jest stabilność numeryczna.Matematycznie, jeśli jedna z kolumn predyktorów zostanie pomnożona przez 10 ^ 6, to odpowiedni współczynnik regresji zostanie pomnożony przez 10 ^ {- 6}, a wyniki będą takie same.

Obliczeniowo, twoje predyktory są często przekształcane przez algorytm uczący się (np. macierz X predyktorów w regresji staje się X'X), a niektóre z tych transformacji mogą skutkować utratą precyzji liczbowej, jeśli X jest bardzo duży lub bardzo mały.Jeśli twoje predyktory są na skali 100, to nie ma to znaczenia.Jeśli modelujesz ziarenka piasku, jednostki astronomiczne lub liczniki wyszukiwanych haseł, to może.

Ayush
2016-05-30 04:02:17 UTC
view on stackexchange narkive permalink

Próbowałem rozwiązać problem regresji grzbietów za pomocą gradientu. Teraz bez normalizacji ustawiłem odpowiedni rozmiar kroku i uruchomiłem kod. Aby upewnić się, że moje kodowanie jest wolne od błędów, zakodowałem ten sam cel w CVX. Teraz CVX potrzebował tylko kilku iteracji, aby osiągnąć pewną optymalną wartość, ale uruchomiłem kod dla najlepszego rozmiaru kroku, jaki mogłem znaleźć, przez iteracje 10k i byłem blisko optymalnej wartości CVX, ale nadal nie był to dokładny.

Po znormalizowaniu zestawu danych i przekazaniu go do mojego kodu i CVX, byłem zaskoczony, widząc, że teraz zbieżność zajęła tylko 100 iteracji, a optymalna wartość, do której zbiegło się w gradiencie, była dokładnie równa wartości CVX.
Również ilość „wyjaśnionej wariancji” według modelu po normalizacji była większa w porównaniu z oryginalnym. Tak więc właśnie z tego naiwnego eksperymentu zdałem sobie sprawę, że jeśli chodzi o problem regresji, wybrałbym normalizację danych. Przy okazji normalizacja oznacza odejmowanie przez średnią i dzielenie przez odchylenie standardowe.

Aby poprzeć mnie w kwestii regresji, zapoznaj się z tym pytaniem i omów go:
Kiedy przeprowadzasz regresję wielokrotną, kiedy powinieneś wyśrodkuj swoje zmienne predykcyjne & kiedy należy je ujednolicić?

to, co nazywacie normalizacją, nazywa się standaryzacją.Zobacz https://en.wikipedia.org/wiki/Feature_scaling#Standardization


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...