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):
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?
Odpowiedzi:
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:R→R
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).
źródło
g
lubr
) i 2 funkcje (index
(czasowe) ianimal
). 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.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,
źródło
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.
źródło
Jakieś sugestie:
nearest maximum
. Nie wiem, to może działać, a może nie, możesz wiedzieć tylko, jeśli je przetestujesz :)źródło
źródło
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.
źródło
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.
źródło