Losowy las jest przepełniony


15

Próbuję użyć losowej regresji leśnej w scikits-learn. Problem polega na tym, że otrzymuję naprawdę wysoki błąd testu:

train MSE, 4.64, test MSE: 252.25.

Tak wyglądają moje dane: (niebieski: dane rzeczywiste, zielony: przewidywane):

Regresja lasu oczyszczona

Używam 90% na szkolenie i 10% na test. Oto kod, którego używam po wypróbowaniu kilku kombinacji parametrów:

rf = rf = RandomForestRegressor(n_estimators=10, max_features=2, max_depth=1000, min_samples_leaf=1, min_samples_split=2, n_jobs=-1) 
test_mse = mean_squared_error(y_test, rf.predict(X_test))
train_mse = mean_squared_error(y_train, rf.predict(X_train))

print("train MSE, %.4f, test MSE: %.4f" % (train_mse, test_mse))
plot(rf.predict(X))
plot(y)

Jakie są możliwe strategie poprawy mojego dopasowania? Czy jest coś jeszcze, co mogę zrobić, aby wyodrębnić podstawowy model? Wydaje mi się niewiarygodne, że po tylu powtórzeniach tego samego wzoru model zachowuje się tak źle z nowymi danymi. Czy w ogóle mam nadzieję, że spróbuję dopasować te dane?


Czy trenujesz tę funkcję okresową z osią x jako wejściem i osią y jako etykietą dla x <= 245, a następnie testujesz dla x> 245? A może źle interpretuję twoją fabułę?
rrenaud,

rodzaj, właściwie oś x jest wskaźnikiem obserwacji, w sumie jest 300 obserwacji, więc od 245, czyli danych testowych nieużywanych do uczenia modelu, wejściowy wektor cech składa się z liczb całkowitych, ma kształt (300,2) i bardzo przypominają liniową funkcję wskaźnika obserwacji, więc nie dodałem informacji o tym, aby nie komplikować pytania.
elyase 12.12 '

1
Najpierw możesz usunąć cykl (część sezonową) ze swoich danych (i trendu).
R. Prost

Czy zastanawiałeś się nad analizą szeregów czasowych? Nie jest dla mnie jasne, co znajduje się na twojej osi X, ale wydaje mi się to okresowe. Sprawdź tutaj i daj mi znać, czy to pomoże: otexts.org/fpp/7/5
Bram Van Camp

Odpowiedzi:


21

Myślę, że używasz niewłaściwego narzędzia; jeśli cały X jest równoważny indeksowi, to w zasadzie masz próbkowaną funkcję i próbujesz ją ekstrapolować. W uczeniu maszynowym chodzi o interpolację historii, więc nie jest zaskakujące, że w tym przypadku osiąga spektakularną porażkę.f:RR

Potrzebujesz analizy szeregów czasowych (tj. Wyodrębnienia trendu, analizy widma i autoregresji lub HMM reszty) lub fizyki (tj. Zastanowienia się, czy istnieje ODE, które może wytworzyć taki wynik i próby dopasowania jego parametrów poprzez zachowane wielkości).


czy maszynowe uczenie się na temat wydobywania modeli generalizowalnych z danych? Po uzyskaniu określonego zestawu, który dobrze interpoluje dane, możemy wybrać te o lepszych właściwościach ekstrapolacji / uogólnienia, korzystając na przykład z walidacji krzyżowej. Czy coś jest nie tak w moim rozumieniu?
elyase

Ekstrapolacja różni się od uogólnienia - wyobraź sobie, że jesteś przedmiotem następującego eksperymentu: widzisz ekran i masz czerwony i zielony przycisk. Najpierw ekran pokazuje wideo pokoju, w którym inna osoba nacisnęła zielony przycisk dla kota, lwa i tygrysa pokazanego na ekranie, a następnie czerwony dla wilka i psa i w ten sposób zebrał 5 pysznych ciastek.

1
Teraz ekran pokazuje rysia; dokonujesz właściwej, generalnej interpolacji historii, naciskasz zielony przycisk i dostajesz porażenie prądem zamiast ciasteczka. Dlaczego tak się stało? Ponieważ rozwiązaniem jest cykl (gggrrr), a zdjęcia zwierząt to tylko oszustwo. To samo zrobiłeś ze swoim lasem - zwabiłeś go do głupiej reprodukcji zestawu treningowego, ukrywając prawdziwe informacje.

Dobry przykład, ale nie patrz tak, jak ty. W twoim przykładzie mamy następujące dane: cel ( glub r) i 2 funkcje ( index(czasowe) i animal). Na podstawie tych danych mogłem dopasować wiele modeli, które mogą przypisać większą lub mniejszą wagę funkcji 1 lub 2 (lub równej obu). Weryfikacja krzyżowa (przy założeniu wystarczającej ilości danych) powinna doprowadzić do modelu z cechą 2 (zwierzę) o mniejszym znaczeniu. Widzę, że mój model przepełnia dane, ale nadal uważam, że powinienem być w stanie wyodrębnić model zgodny z tym wzorcem (ponieważ zachowanie się nie zmieniło) z wystarczająco dużą przestrzenią modelu.
elyase

1
Nie; nawet jeśli poprosisz o więcej danych, eksperymentator nadal może rozszerzyć oszustwo na zwierzętach i dalej zaciemniać wzór, aby nie był oczywisty. Tj. Ekstrapolacji po prostu nie można zrobić z uczeniem się, ponieważ z definicji wymaga informacji, których nie ma na szkoleniu - w ten sposób musisz albo przyjąć pewne założenia, albo zebrać dodatkowe dane, aby problem stał się interpolacją.

9

Największym problemem jest to, że drzewa regresji (i oparte na nich algorytmy, takie jak losowe lasy), przewidują częściowo stałe funkcje, dając stałą wartość dla danych wejściowych przypadających na każdy liść. Oznacza to, że podczas ekstrapolacji poza obszarem treningowym po prostu przewidują taką samą wartość, jak w przypadku najbliższego punktu, w którym mieli dane treningowe. @mbq ma rację, że istnieją specjalistyczne narzędzia do uczenia szeregów czasowych, które prawdopodobnie byłyby lepsze niż ogólne techniki uczenia maszynowego. Jednak losowe lasy są szczególnie złe w tym przykładzie i tam inne ogólne techniki ML prawdopodobnie działałyby znacznie lepiej niż to, co widzisz. SVM z jądrem nieliniowym to jedna z opcji, która przychodzi na myśl. Ponieważ twoja funkcja ma strukturę okresową, sugeruje to również pracę w dziedzinie częstotliwości,


AFAIK SVM ma ten sam problem losowego lasu. Nie przewidują dobrze poza przestrzenią, w której zostali przeszkoleni. Prawdopodobnie lepszym rozwiązaniem byłaby sieć neuronowa
Donbeo

Jeśli dane leżą na krzywej, a jądro jest odpowiedniego rodzaju, aby pasowało do tej krzywej, wówczas SVM będzie w stanie dokonać ekstrapolacji wzdłuż tej krzywej. Jeśli dane mają trend liniowy, wówczas liniowy SVM będzie pasował do linii i ekstrapoluje wzdłuż tej linii. Bardziej złożone jądro może pasować i ekstrapolować bardziej złożone zachowania. Zależy to od posiadania odpowiedniego rodzaju jądra. To nie czyni SVM odpowiednim narzędziem do ekstrapolacji i przewidywania TS, ale czyni je lepszymi niż losowe lasy.
Daniel Mahler

3

Jest to podręcznikowy przykład nadmiernego dopasowania danych, model radzi sobie bardzo dobrze na wyuczonych danych, ale zawala się na nowych danych testowych. Jest to jedna ze strategii rozwiązania tego problemu: Dokonaj dziesięciokrotnej krzyżowej weryfikacji danych treningowych, aby zoptymalizować parametry.

Krok 1. Utwórz funkcję minimalizacji MSE za pomocą optymalizacji NM. Przykład można zobaczyć tutaj: http://glowingpython.blogspot.de/2011/05/curve-fitting-using-fmin.html

Krok 2. W ramach tej funkcji minimalizacji celem jest zmniejszenie MSE. Aby to zrobić, utwórz dziesięciokrotny podział danych, w którym nowy model uczy się 9-krotnie i testuje 10-krotnie. Ten proces powtarza się dziesięć razy, aby uzyskać MSE dla każdej zakładki. Zagregowane MSE jest zwracane jako wynik celu.

Krok 3. Program fmin w python wykona dla ciebie iteracje. Sprawdź, które parametry hipertekstowe są niezbędne do dostrojenia (n_estimators, max_features itp.) I przekaż je do fmin.

Rezultatem będą najlepsze hiper-parametry, które zmniejszą możliwość nadmiernego dopasowania.


Tak, wygląda na to, że jest za dużo (co zwykle nie jest regresją losową w lesie, stąd pytanie). Teraz zauważyłem, że zmiana parametrów ma niewielki wpływ na Regresory RF. Teraz wzajemna weryfikacja wymaga podstawowego modelu wystarczająco elastycznego, aby go zoptymalizować. Jakie modele / algorytmy ML polecacie dla tego rodzaju danych.
elyase

3

Jakieś sugestie:

  1. Dostosuj parametry za pomocą metody ruchomego okna (model musi być zoptymalizowany, aby przewidzieć kolejne wartości w szeregu czasowym, a nie przewidywać wartości spośród podanych)
  2. Wypróbuj inne modele (nawet prostsze, z odpowiednim wyborem funkcji i strategiami inżynierii funkcji, mogą okazać się lepiej dostosowane do Twojego problemu)
  3. Spróbuj nauczyć się optymalnych przekształceń zmiennej docelowej (dostrój ją, istnieje ujemna tendencja liniowa / wykładnicza, możesz ją oszacować)
  4. Być może analiza spektralna
  5. Wydaje się, że maksima / minima są równo rozmieszczone. Dowiedz się, gdzie mają dostęp do twoich funkcji (bez wkładu operatora, pozwól algorytmowi odkryć go, aby usunąć błąd) i dodaj to jako funkcję. Opracuj też funkcję nearest maximum. Nie wiem, to może działać, a może nie, możesz wiedzieć tylko, jeśli je przetestujesz :)

Ale, jak powiedział Daniel w swojej odpowiedzi, losowy las nie będzie działał z tego rodzaju problemami, ponieważ nie jest w stanie przewidzieć wartości poza zakresem obserwowanym w próbce pociągu. Strojenie parametrów itp. Nie doprowadziłoby do nikąd.
Tim

1
Sugestia # 2 @Tim. Losowe lasy nie będą działać naiwnie na te dane, ale sprytna ekstrakcja funkcji może sprawić, że będzie działać.
Firebug


0

Po przeczytaniu powyższego postu chcę udzielić innej odpowiedzi.

W przypadku modeli opartych na drzewach, takich jak losowy las, nie można ekstrapolować wartości poza zestaw szkoleniowy. Nie sądzę więc, by był to zbyt trafny problem, ale zła strategia modelowania.

Co więc możemy zrobić dla przewidywania szeregów czasowych za pomocą modelu drzewa?

Możliwym sposobem jest połączenie go z regresją liniową: najpierw odrzuć szeregi czasowe (lub modelowanie trendu z regresją liniową), a następnie modeluj resztę za pomocą drzew (reszty są ograniczone, aby modele drzew mogły sobie z tym poradzić).

Poza tym istnieje model drzewa w połączeniu z regresją liniową, który można ekstrapolować, zwany kubistycznym, robi on regresję liniową na liściu.


0

Jeśli chcesz po prostu przewidzieć w granicach wykresu, to po prostu losowe obserwacje przed podzieleniem zestawu danych powinny rozwiązać problem. Następnie staje się to problemem interpolacji od ekstrapolacji, jak pokazano.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.