Wprowadzenie do przeszukiwania siatki

Strojenie hiperparametrów w Pythonie

Alex Scriven

Data Scientist

Automatyzacja 2 hiperparametrów

Poprzedni kod:

neighbors_list = [3,5,10,20,50,75]
accuracy_list = []
for test_number in neighbors_list:
    model = KNeighborsClassifier(n_neighbors=test_number)
    predictions = model.fit(X_train, y_train).predict(X_test)
    accuracy = accuracy_score(y_test, predictions)
    accuracy_list.append(accuracy)

Wyniki zostały zebrane w ramce danych do analizy.

Strojenie hiperparametrów w Pythonie

Automatyzacja 2 hiperparametrów

 

Co z testowaniem wartości 2 hiperparametrów?

Przy użyciu algorytmu GBM:

  • learn_rate [0.001, 0.01, 0.05]
  • max_depth [4,6,8,10]

Można użyć (zagnieżdżonej) pętli for!

Strojenie hiperparametrów w Pythonie

Automatyzacja 2 hiperparametrów

Najpierw funkcja tworząca model:

def gbm_grid_search(learn_rate, max_depth):
    model = GradientBoostingClassifier(
            learning_rate=learn_rate,
            max_depth=max_depth)

predictions = model.fit(X_train, y_train).predict(X_test)
return([learn_rate, max_depth, accuracy_score(y_test, predictions)])
Strojenie hiperparametrów w Pythonie

Automatyzacja 2 hiperparametrów

 

Iteracja przez listy hiperparametrów z wywołaniem funkcji:

results_list = []

for learn_rate in learn_rate_list:
    for max_depth in max_depth_list:
        results_list.append(gbm_grid_search(learn_rate,max_depth))

Strojenie hiperparametrów w Pythonie

Automatyzacja 2 hiperparametrów

 

Wyniki można umieścić w ramce danych i wydrukować:

results_df = pd.DataFrame(results_list, columns=['learning_rate', 'max_depth', 'accuracy'])
print(results_df)

tabela wyników

Strojenie hiperparametrów w Pythonie

Ile modeli?

 

Dodanie kolejnych hiperparametrów i wartości generuje znacznie więcej modeli.

  • Zależność jest wykładnicza, nie liniowa
  • Jedna dodatkowa wartość hiperparametru to nie tylko jeden model
  • 5 wartości dla Hiperparametru 1 i 10 dla Hiperparametru 2 to 50 modeli!

A co z kross-walidacją?

  • 10-krotna kross-walidacja oznacza 50x10 = 500 modeli!
Strojenie hiperparametrów w Pythonie

Od 2 do N hiperparametrów

 

Co z dodaniem kolejnych hiperparametrów?

Można zagnieżdżać pętlę!

# Adjust the list of values to test
learn_rate_list = [0.001, 0.01, 0.1, 0.2, 0.3, 0.4, 0.5]
max_depth_list = [4,6,8, 10, 12, 15, 20, 25, 30]
subsample_list = [0.4,0.6, 0.7, 0.8, 0.9]
max_features_list = ['auto', 'sqrt']
Strojenie hiperparametrów w Pythonie

Od 2 do N hiperparametrów

Zmodyfikowana funkcja:

def gbm_grid_search(learn_rate, max_depth,subsample,max_features):
    model = GradientBoostingClassifier(
        learning_rate=learn_rate, 
        max_depth=max_depth,
        subsample=subsample,
        max_features=max_features)
    predictions = model.fit(X_train, y_train).predict(X_test)
    return([learn_rate, max_depth, accuracy_score(y_test, predictions)])
Strojenie hiperparametrów w Pythonie

Od 2 do N hiperparametrów

Zmodyfikowana pętla (zagnieżdżona):

for learn_rate in learn_rate_list:
    for max_depth in max_depth_list:
        for subsample in subsample_list:
            for max_features in max_features_list:
                results_list.append(gbm_grid_search(learn_rate,max_depth,
                                     subsample,max_features))
results_df = pd.DataFrame(results_list, columns=['learning_rate',
                         'max_depth', 'subsample', 'max_features','accuracy'])
print(results_df)
Strojenie hiperparametrów w Pythonie

Od 2 do N hiperparametrów

 

Ile modeli teraz?

  • 7x9x5x2 = 630 (6 300 przy kross-walidacji!)

Nie można zagnieżdżać pętli bez końca!

A co, jeśli potrzebne są:

  • Szczegóły czasu uczenia i wyników
  • Szczegóły wyników kross-walidacji
Strojenie hiperparametrów w Pythonie

Wprowadzenie do przeszukiwania siatki

Tworzenie siatki:

  • Wzdłuż lewej krawędzi – wszystkie wartości max_depth
  • Wzdłuż górnej krawędzi – wszystkie wartości learning_rate

Tabela kombinacji hiperparametrów

Strojenie hiperparametrów w Pythonie

Wprowadzenie do przeszukiwania siatki

Iteracja przez każdą komórkę siatki:

Tabela kombinacji hiperparametrów

(4, 0.001) odpowiada estymatorowi:

GradientBoostingClassifier(max_depth=4, learning_rate=0.001)
Strojenie hiperparametrów w Pythonie

Przeszukiwanie siatki – zalety i wady

 

Zalety tego podejścia:

Zalety:

  • Nie trzeba pisać tysięcy linii kodu
  • Znajduje najlepszy model w siatce (*ważna uwaga!)
  • Łatwe do wyjaśnienia
Strojenie hiperparametrów w Pythonie

Przeszukiwanie siatki – zalety i wady

 

Wady tego podejścia:

  • Kosztowne obliczeniowo! Jak szybko powstało 6 000+ modeli?
  • Metoda jest „nieświadoma" – wyniki jednego modelu nie wpływają na kolejny.

 

Metody „świadome" zostaną omówione później!

Strojenie hiperparametrów w Pythonie

Czas na ćwiczenia!

Strojenie hiperparametrów w Pythonie

Preparing Video For Download...