Jestem autorem implementacji drzew regresji wzmocnionej gradientem w języku Python pod numerem scikit-learn . Starałem się zoptymalizować czas przewidywania, ponieważ metoda była skierowana do środowisk o niskim opóźnieniu (w szczególności problemów z rankingiem); procedura predykcji jest napisana w języku C, nadal istnieje pewne obciążenie wynikające z wywołań funkcji Pythona. Powiedziawszy to: czas przewidywania dla pojedynczych punktów danych z ~ 50 cechami i około 250 drzew powinien wynosić < < 1ms.
W moich przypadkach użycia przewidywanie czasu często zależy od kosztów wyodrębnienia funkcji. Gorąco polecam profilowanie w celu wskazania źródła nadmiaru (jeśli korzystasz z Pythona, mogę polecić line_profiler).
Jeśli źródłem narzutu jest przewidywanie, a nie wyodrębnianie cech, można sprawdzić, czy możliwe jest wykonywanie przewidywań wsadowych zamiast przewidywać pojedyncze punkty danych, ograniczając w ten sposób obciążenie wynikające z wywołania funkcji Python (np. W rankingu, który często trzeba ocena najlepszych dokumentów K, więc można najpierw wyodrębnić funkcję, a następnie uruchomić przewidywanie na macierzy K x n_features
Jeśli to nie pomoże, należy spróbować ograniczyć liczbę drzew, ponieważ koszt runtime dla przewidywania jest w zasadzie liniowa w liczbie drzew. Istnieje wiele sposobów na ograniczenie liczby drzew bez wpływu na dokładność modelu:
Właściwe dostosowanie szybkości uczenia; im mniejszy wskaźnik uczenia, tym więcej drzew jest potrzebnych, a tym samym wolniejsze jest przewidywanie.
Post-process GBM z regulacją L1 (Lasso); Patrz: Elements of Statistical Learning Rozdział 16.3.1 - użyj przewidywań każdego drzewa jako nowych cech i uruchom reprezentację poprzez model liniowy L1 - usuń te drzewa, które nie mają żadnej masy.
W pełni korekcyjne aktualizacje wagi; zamiast wykonywać wyszukiwanie linii/aktualizację wagi tylko dla najnowszego drzewa, zaktualizuj wszystkie drzewa (patrz [Warmuth2006] i [Johnson2012]). Lepsza konwergencja - mniej drzew.
Jeśli żadne z powyższych nie trick można zbadać kaskad i strategie wczesnego wyjścia (patrz [Chen2012])
Referencje:
[Warmuth2006] M. Warmuth, J. Liao i G. Ratsch.Całkowicie korygujące algorytmy wspomagające, które maksymalizują margines. W postępowaniu z 23. międzynarodowej konferencji na temat uczenia maszynowego 2006.
[johnson2012] Rie Johnson Tong Zhang, Nauka nieliniowych funkcji za pomocą uregulowanej Greedy Las, arXiv 2012.
[Chen2012] Minmin Chen Xu Zhixiang , Kilian Weinberger, Olivier Chapelle, Dor Kedem, Classifier Cascade za zminimalizowanie kosztu oceny funkcji, JMLR W & CP 22: 218-226, 2012.
Próbowałem znaleźć informacje na temat przewidywania scikit-learn przewidywania w lipcu, ale nie mogłem t, więc zdecydowałem się zamiast tego używać płytkich algorytmów uczenia się (które, jak wiedziałem, spełniłyby wymagania dotyczące opóźnień). Moim przypadkiem użycia było ustalanie stawek w reklamach online, więc prognozowanie wsadowe pomogło, ale decyzja o każdym wyświetleniu musiała się zakończyć w czasie krótszym niż 10 ms. Odp .: Twoje sugestie, aby zmniejszyć liczbę drzew, próbowałem 1, przeczytałem 2 i zajrzę do 3 - dzięki za referencje/pomysły. W przypadku nowego projektu rozważam naukę Weka i scikit, więc twoja odpowiedź była pomocna. – lockedoff
Istnieje punkt odniesienia dla przewidywania latencji vs dokładności w bieżącym HEAD of sklearn, wraz z (I wierzyć) dokładna dokumentacja na temat, w tym czasy prognozowania dla wielu klasyfikatorów/regresorów. Zobacz ten skrypt na przykład: https://github.com/oddskool/scikit-learn/blob/pred_latency/examples/applications/plot_prediction_latency.py – oDDsKooL