Wartości hiperparametrów

Strojenie hiperparametrów w Pythonie

Alex Scriven

Data Scientist

Wartości hiperparametrów

 

Niektóre hiperparametry są ważniejsze do strojenia niż inne.

Ale jakie wartości wypróbować?

  • Zależy od algorytmu i hiperparametru
  • Istnieją pewne wskazówki i najlepsze praktyki

Przyjrzyjmy się najważniejszym wskazówkom!

Strojenie hiperparametrów w Pythonie

Konflikty między hiperparametrami

Należy uważać na konflikty między hiperparametrami.

  • LogisticRegression() — konflikty między solver i penalty.
The 'newton-cg', 'sag' and 'lbfgs' solvers support only l2 penalties.

Niektóre konflikty nie są jawne — parametr jest po prostu ignorowany (np. ElasticNet z normalize):

This parameter is ignored when fit_intercept is set to False

Zawsze sprawdzaj dokumentację Scikit-Learn!

Strojenie hiperparametrów w Pythonie

Bezsensowne wartości hiperparametrów

 

Uważaj na ustawianie bezsensownych wartości hiperparametrów:

  • Las losowy z małą liczbą drzew
    • Czy 2 drzewa to już „las"?
  • 1 sąsiad w algorytmie KNN
    • Głosowanie jednej osoby nie brzmi zbyt wiarygodnie!
  • Zwiększanie hiperparametru o bardzo małą wartość

Dokumentowanie sensownych wartości hiperparametrów to cenne zadanie.

Strojenie hiperparametrów w Pythonie

Automatyzacja wyboru hiperparametrów

 

W poprzednim ćwiczeniu budowaliśmy modele w ten sposób:

knn_5 =  KNeighborsClassifier(n_neighbors=5)
knn_10 = KNeighborsClassifier(n_neighbors=10)
knn_20  = KNeighborsClassifier(n_neighbors=20)

To mało efektywne. Czy da się to zrobić lepiej?

Strojenie hiperparametrów w Pythonie

Automatyzacja strojenia hiperparametrów

Użyj pętli for do iteracji po opcjach:

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)
Strojenie hiperparametrów w Pythonie

Automatyzacja strojenia hiperparametrów

Wyniki możemy przechować w DataFrame:

results_df = pd.DataFrame({'neighbors':neighbors_list, 'accuracy':accuracy_list})
print(results_df)

Tabela dokładności dla liczby sąsiadów

Strojenie hiperparametrów w Pythonie

Krzywe uczenia

Stwórzmy wykres krzywej uczenia

Tym razem przetestujemy znacznie więcej wartości

neighbors_list = list(range(5,500, 5))

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) results_df = pd.DataFrame({'neighbors':neighbors_list, 'accuracy':accuracy_list})
Strojenie hiperparametrów w Pythonie

Krzywe uczenia

Możemy zwizualizować większy DataFrame:

plt.plot(results_df['neighbors'], 
    results_df['accuracy'])

# Add the labels and title plt.gca().set(xlabel='n_neighbors', ylabel='Accuracy', title='Accuracy for different n_neighbors') plt.show()
Strojenie hiperparametrów w Pythonie

Krzywe uczenia

Nasz wykres:

krzywa uczenia dokładności w zależności od liczby sąsiadów dla KNN

Strojenie hiperparametrów w Pythonie

Przydatna sztuczka do generowania wartości

Funkcja range w Pythonie nie obsługuje kroków dziesiętnych.

Przydatna sztuczka to np.linspace(start, end, num) z NumPy

  • Tworzy num równomiernie rozłożonych wartości w przedziale (start, end).
print(np.linspace(1,2,5))
[1.   1.25 1.5  1.75 2.  ]
Strojenie hiperparametrów w Pythonie

Czas na ćwiczenia!

Strojenie hiperparametrów w Pythonie

Preparing Video For Download...