Jak korzystać z danych wyjściowych GridSearch?

23

Obecnie pracuję z Python i Scikit uczyć się do celów klasyfikacji i czytając GridSearch, pomyślałem, że to świetny sposób na optymalizację parametrów estymatora, aby uzyskać najlepsze wyniki.

Moja metodologia jest następująca:

  1. Podziel moje dane na szkolenie / test.
  2. Użyj GridSearch z 5-krotną weryfikacją krzyżową, aby trenować i testować moje estymatory (między innymi Random Forest, Gradient Boost, SVC), aby uzyskać najlepsze estymatory z optymalną kombinacją hiper parametrów.
  3. Następnie obliczam metryki dla każdego z moich estymatorów, takich jak Precyzja, Przywołanie, FMeasure i Współczynnik korelacji Matthewsa, używając mojego zestawu testów do przewidywania klasyfikacji i porównywania ich z rzeczywistymi etykietami klas.

Na tym etapie widzę dziwne zachowanie i nie jestem pewien, jak postępować. Czy pobieram .best_estimator_ z GridSearch i używam go jako „optymalnego” wyniku wyszukiwania sieci i wykonuję prognozy za pomocą tego estymatora? Jeśli to zrobię, stwierdzę, że metryki etapu 3 są zwykle znacznie niższe niż wtedy, gdy po prostu trenuję na wszystkich danych treningowych i testuję na zestawie testowym. Czy też po prostu biorę wyjściowy obiekt GridSearchCV jako nowy estymator ? Jeśli to zrobię, otrzymam lepsze wyniki dla moich metryk etapu 3, ale wydaje mi się dziwne używanie obiektu GridSearchCV zamiast zamierzonego klasyfikatora (np. Losowy las) ...

EDYCJA: Więc moje pytanie brzmi, jaka jest różnica między zwróconym obiektem GridSearchCV a atrybutem .best_estimator_? Którego z nich należy użyć do obliczenia dalszych danych? Czy mogę użyć tego wyniku jak zwykłego klasyfikatora (np. Używając przewidywania), czy też jak go użyć?

Dan Carter
źródło

Odpowiedzi:

27

Postanowiłem odejść i znaleźć odpowiedzi, które zaspokoją moje pytanie, i napisz je tutaj, aby każdy mógł się zastanawiać.

Atrybut .best_estimator_ jest instancją określonego typu modelu, która ma „najlepszą” kombinację danych parametrów z siatki param_grid. To, czy to wystąpienie jest przydatne, zależy od tego, czy parametr refit ustawiony jest na True (domyślnie jest). Na przykład:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
optimised_random_forest = clf.best_estimator_
return optimised_random_forest

Zwróci RandomForestClassifier. Wszystko to wynika z dokumentacji . Z dokumentacji nie wynika jasno, dlaczego większość przykładów nie używa specjalnie .estestatora_estestacji_ i zamiast tego robi to:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
return clf

To drugie podejście zwraca instancję GridSearchCV ze wszystkimi dzwonkami i gwizdkami GridSearchCV, takimi jak .best_estimator_, .best_params itp., Które same mogą być używane jako wyszkolony klasyfikator, ponieważ:

Optimised Random Forest Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]
GridSearchCV Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]

Po prostu używa tej samej najlepszej instancji estymatora podczas prognozowania. W praktyce więc nie ma różnicy między tymi dwoma, chyba że konkretnie chcesz tylko samą instancję estymatora. Na marginesie, moje różnice w pomiarach nie były ze sobą powiązane i wynikały z błędnej funkcji ważenia klas.

Dan Carter
źródło
Dzięki za Twój post @ Dan, jest bardzo pomocny. Chciałem prosić o jedno wyjaśnienie. W tym drugim przypadku, jeśli tak, refit=Falseto clf.fitczy nie skończę z najlepszym klasyfikatorem?
Poete Maudit
@PoeteMaudit Parametr refit informuje funkcję GridSearchCV, aby wzięła najlepsze znalezione parametry i ponownie przeszkoliła model przy użyciu tych parametrów w całym zbiorze danych. Jeśli refit = False, to best_estimator nie jest dostępny, zgodnie z dokumentacją: scikit-learn.org/stable/modules/generated/…
Dan Carter
0

GridSearchCV pozwala łączyć estymator z preambułą wyszukiwania siatki w celu dostrojenia hiperparametrów. Metoda wybiera optymalny parametr z wyszukiwania siatki i używa go z estymatorem wybranym przez użytkownika. GridSearchCV dziedziczy metody z klasyfikatora, więc tak, możesz użyć metod .score, .predict itp. Bezpośrednio przez interfejs GridSearchCV. Jeśli chcesz wyodrębnić najlepsze hiperparametry zidentyfikowane przez wyszukiwanie siatki, możesz użyć .best_params_, a to zwróci najlepszy hiperparametr. Następnie możesz przekazać ten hiperparametr do estymatora osobno.

Bezpośrednie użycie .predict da takie same wyniki, jak uzyskanie najlepszego hiperparametru poprzez .best_param_, a następnie użycie go w swoim modelu. Rozumiejąc podstawowe działania wyszukiwania siatki, możemy zrozumieć, dlaczego tak jest.


Wyszukiwanie w siatce

Ta technika służy do znalezienia optymalnych parametrów do użycia z algorytmem. To NIE są wagi ani model, które uczy się na podstawie danych. Jest to oczywiście dość mylące, więc rozróżnię te parametry, wywołując jeden hiper-parametr.

Hiperparametry są jak k w k-Najbliższych sąsiadów (k-NN). k-NN wymaga od użytkownika wyboru, który sąsiad ma wziąć pod uwagę przy obliczaniu odległości. Algorytm następnie dostraja parametr, próg, aby sprawdzić, czy nowy przykład mieści się w wyuczonym rozkładzie, odbywa się to z danymi.

Jak wybieramy k?

Niektóre osoby po prostu stosują zalecenia oparte na wcześniejszych badaniach typu danych. Inni używają wyszukiwania siatki. Ta metoda będzie w stanie najlepiej określić, które k jest optymalne do wykorzystania dla danych.

Jak to działa?

[1,2,3,...,10]

Jest to sprzeczne z zasadami nieużywania danych testowych !!

nnn1n

Wybrana wartość hiperparametru jest tą, która osiąga najwyższą średnią wydajność wśród n-krotności. Gdy jesteś zadowolony ze swojego algorytmu, możesz go przetestować na zestawie testowym. Jeśli przejdziesz bezpośrednio do zestawu testowego, ryzykujesz przeregulowanie.

JahKnows
źródło
Cześć Jah, to dobra odpowiedź, ale nadal nie jestem mądrzejszy co do odpowiedzi na moje pytanie. Zaktualizowałem tytuł pytania i samo pytanie, aby wyjaśnić sprawę.
Dan Carter
Napisz własne wyszukiwanie w siatce. To dosłownie utwórz tablicę, a następnie dodaj pętlę for wokół swojego modelu. Następnie na końcu pętli for zapisz wynikową wydajność w tablicy. Po przejściu wszystkich możliwych wartości w siatce, spójrz na tablice występów i wybierz najlepszą. Jest to optymalna wartość dla twojego hiper-parametru. Poleganie na wbudowanych funkcjach podstawowych nie jest wysoce zalecane w przypadku analizy danych. Dane różnią się tak bardzo, że najlepiej mieć kontrolę!
JahKnows
To byłaby dobra sugestia, gdybym miał tylko jeden hiperparametr do optymalizacji, ale jeśli mam 4? 5? 4/5 razy zagnieżdżona dla pętli jest brzydka i nie widzę potrzeby wymyślania tutaj koła na nowo, byłoby to stratą czasu i to jest powód, dla którego takie pakiety istnieją.
Dan Carter
GridSearchCV pozwala łączyć estymator z ustawieniem GridSearchCV. Czyni dokładnie to, co właśnie omówiliśmy. Następnie wybiera optymalny parametr i używa go z wybranym estymatorem. GridSearchCV dziedziczy metody z klasyfikatora, więc tak, możesz użyć metod .score, .predict itp. Bezpośrednio przez interfejs GridSearchCV. Nie polecam tego robić, jednak łatwiejsze narzędzia oznaczają mniejszą kontrolę. Aby znaleźć coś tak prostego jak wyszukiwanie siatki, po prostu koduj sam.
JahKnows
1
Ta odpowiedź nie zawiera odpowiedzi na pytanie dotyczące użycia GridSearchCV.
Hobbes,