Jak wybrać liczbę estymatorów dla Gradient Boosting

W Data Science dostępnych jest obecnie wiele algorytmów. Jedną z użytecznych technik jest zatem połączenie ich w jednym modelu, aby uzyskać to, co najlepsze z każdego z nich, co skutkuje dokładniejszym modelem.

Używając Scikit-Learn, znajdziesz algorytm Random Forest, czyli model zespołowy typu workowania. Z drugiej strony znajdziesz modele Boosting, które trenują estymatory w sekwencji, gdzie wynik jednego modelu jest przekazywany do następnego, który będzie starał się poprawić prognozy, aż do osiągnięcia optymalnego wyniku.

Podczas tworzenia estymatora Gradient Boosting znajdziesz ten hiperparametr n_estimator=100 z domyślną wartością 100 drzew, które mają zostać utworzone, aby uzyskać wynik. Wiele razy po prostu ustawiamy to na domyślne lub zwiększamy w razie potrzeby, nawet używając technik wyszukiwania siatki.

W tym poście znajdziemy prosty sposób na uzyskanie pojedynczej liczby, której użyjemy do trenowania naszego modelu.

Gradient Boosting można załadować z Scikit-Learn przy użyciu tej klasy from sklearn.ensemble import GradientBoostingRegressor. Algorytm wzmacniania gradientu może być używany do klasyfikacji lub modeli regresji. Jest to estymator oparty na drzewie — co oznacza, że ​​składa się z wielu drzew decyzyjnych.

Wynik Drzewo 1 wygeneruje błędy. Te błędy zostaną użyte, a dane wejściowe dla Drzewo 2. Po raz kolejny zostaną użyte błędy ostatniego modelu i dane wejściowe następnego, aż do osiągnięcia n_estimators wartość.

Każdy model będzie pasował do błędów poprzedniego. Obraz autorstwa autora.

Ponieważ każdy estymator będzie pasował do błędu poprzedniego, oczekuje się, że kombinacja przewidywań będzie lepsza niż którykolwiek z samych estymatorów. Po każdej iteracji zwiększamy złożoność modelu, zmniejszając obciążenie, ale zwiększając wariancję, z drugiej strony. Musimy więc wiedzieć, kiedy przestać.

Zobaczmy teraz, jak to zrobić.

Kod tego ćwiczenia jest prosty. Wszystko, co musimy zrobić, to zapętlić się po każdej iteracji i sprawdzić, w której mieliśmy najmniejszy błąd.

Zacznijmy od wybrania zestawu danych. Będziemy korzystać z wypadki samochodowe dataset, natywny z biblioteki seaborn (czyli otwarte dane na licencji BDS).

# Zbiór danych
df = sns.load_dataset('car_crashes')

Oto szybkie spojrzenie na dane. Postaramy się oszacować total kwotę, używając innych funkcji jako predyktorów. Ponieważ jest to wynik liczb rzeczywistych, mówimy o modelu regresji.

Zbiór danych o wypadkach samochodowych, z morza. Obraz autorstwa autora.

Szybkie spojrzenie na korelacje.

# Korelacje
df.corr().style.background_gradient(cmap='coolwarm')
Korelacje w zbiorze danych. Obraz autorstwa autora.

Ok, bez większej współliniowości. Widzimy to ins_premium i ins_losses nie korelują zbyt dobrze z total , więc nie będziemy ich uwzględniać w modelu.

Jeśli sprawdzimy brakujące dane, to ich nie ma

# Zaginiony
df.isnull().sum()
0

Świetnie, więc podzielmy teraz dane.

# X i y
X = df.drop(['ins_premium', 'ins_losses', 'abbrev', 'total'], axis=1)
y = df['ogółem']
# Test pociągu
X_pociąg, X_test, y_pociąg, y_test = pociąg_podział_testu(X, y, rozmiar_testu=0.3, losowy_stan=22)

Możemy utworzyć potok do skalowania danych i modelowania ich (naprawdę nie jest konieczne skalowanie tych danych, ponieważ są one już w tej samej skali, na bazie dziesiątek). Następnie dopasowujemy dane do modelu i przewidujemy wyniki.

Używam 500 estymatorów z a learning_rate z 0.3.

Szybkość uczenia się to wielkość kroku, jaki wykonujemy, aby osiągnąć minimalny błąd. Jeśli użyjemy wartości, która jest zbyt wysoka, możemy przekroczyć minimum. Jeśli użyjemy zbyt małej liczby, możemy nawet się do niej nie zbliżyć. Tak więc praktyczna zasada, którą możesz wziąć pod uwagę, brzmi: jeśli masz dużą liczbę estymatorów, możesz użyć niższych wartości współczynnika uczenia się. Jeśli masz tylko kilka estymatorów, preferuj wyższe wartości współczynnika uczenia się.

kroki = [('skala', StandardScaler()),
('GBR', GradientBoostingRegressor(n_estimators=500, learning_rate=0.03))]
# Potok instancji i dopasowanie
rura = rurociąg (kroki). dopasowanie (ciąg_X, ciąg_y)
# Przewidywać
preds = potok.predict(X_test)

A teraz ocenianie.

# RMSE prognoz
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds)),1 )}')
[WYJ.]: RMSE: 1.1# Średnia prawdziwych wartości Y
print(f'Data średnia y: {round( y.mean(),1 )}')
[OUT]: Średnia y danych: 15.8

Dobrze. Nasz RMSE wynosi około 6.9% średniej. Więc średnio o tyle nam brakuje.

Sprawdźmy teraz, jak dostroić nasz model, wybierając optymalną liczbę estymatorów do wytrenowania, która da nam najniższy poziom błędu.

Jak powiedziałem, tak naprawdę nie musimy skalować tych danych, ponieważ są one już w tej samej proporcji. Dopasujmy więc model.

#Model
gbr = GradientBoostingRegressor(n_estimators=500, learning_rate=0.3).fit(X_train, y_train)

Teraz to dobre rzeczy. W Gradient Boosting istnieje metoda, która pozwala nam powtarzać predykcje każdego wytrenowanego estymatora, od 1 do 500. Stworzymy więc pętlę, która przechodzi przez 500 estymatorów w gbr model, przewiduje wyniki za pomocą metody staged_predict(), oblicza błąd średniokwadratowy i zapisuje wynik na liście errors.

# Pętla dla najlepszego numeru
błędy = [ mean_squared_error(y_test, preds) dla preds w gbr.staged_predict(X_test)]
# Optymalna liczba estymatorów
optymalna_liczba_szacunków = np.argmin(błędy) + 1

Następnie możemy wykreślić wynik.

#Intrygować
g=sns.lineplot(x=zakres(500), y=błędy)
g.set_title(f'Najlepsza liczba estymatorów w {best_n_estimators}', size=15);
Najlepsza liczba estymatorów. Obraz autorstwa autora.

Widzimy, że najniższy poziom błędu występuje przy 34 estymatorach. Przeszkolmy więc nasz model z 34 estymatorami i porównajmy z wynikiem z modelu wytrenowanego z potokiem.

# Przekwalifikuj się
gbr = GradientBoostingRegressor(n_estimators=34, learning_rate=0.3).fit(X_train, y_train)
# Prognozy
preds2 = gbr.predict(X_test)

Ocenianie…

# RMSE prognoz
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds2)),1 )}')
[WYJ.]: RMSE: 1.0
# Dane Y średnia
print(f'Data średnia y: {round( y.mean(),1 )}')
[OUT]: Średnia y danych: 15.8

Obniżyliśmy teraz z 6.9% do 6.3%. Około. 9% lepiej. Przyjrzyjmy się kilku prognozom.

Prognozy z obu modeli. Obraz autorstwa autora.

Ciekawe wyniki. Niektóre przewidywania drugiego modelu są lepsze niż pierwszego.

Nauczyliśmy się, jak określić najlepszą liczbę estymatorów do dostrajania a GradientBoostingRegressor z Scikit-Learn. Jest to hiperparametr, który może mieć znaczenie w tego rodzaju modelu zespołowym, który trenuje estymatory w sekwencji.

Czasami po kilku iteracjach model może zacząć się nadmiernie dopasowywać, przez co zacznie za bardzo zwiększać wariancję, wpływając na prognozy.

Widzieliśmy, że prosta pętla może pomóc nam znaleźć optymalne rozwiązanie w tym przypadku. Ale z pewnością w przypadku dużych zbiorów danych obliczenie może być kosztowne, więc dobrym pomysłem byłoby wypróbowanie niższej wartości n_estimators najpierw i sprawdź, czy możesz szybko osiągnąć minimalny błąd.

Oto pełny kod w GitHub.

Jeśli spodobał Ci się ten materiał, obserwuj mojego bloga.

Znajdź mnie na LinkedIn.

To ćwiczenie zostało oparte na doskonałym podręczniku autorstwa Auréliena Gérona, w odnośniku.

Jak wybrać liczbę estymatorów do wzmocnienia gradientu ponownie opublikowanego ze źródła 8 za pośrednictwem https://towardsdatascience.com/feed

<!–

->

Znak czasu:

Więcej z Konsultanci Blockchain