Hyperparameter Tuning in Python
Alex Scriven
Data Scientist
Sommige hyperparameters zijn belangrijker om eerst te tunen.
Maar welke waarden probeer je voor hyperparameters?
Bekijk een paar toppers!
Let op conflicterende hyperparameterkeuzes.
LogisticRegression() heeft opties solver en penalty die kunnen botsen.The 'newton-cg', 'sag' and 'lbfgs' solvers support only l2 penalties.
Sommige zijn niet expliciet maar worden gewoon genegeerd (bij ElasticNet met de hyperparameter normalize):
This parameter is ignored when fit_intercept is set to False
Raadpleeg altijd de Scikit-learn documentatie!
Let op ‘onzin’-waarden voor verschillende algoritmen:
Tijd nemen om zinvolle waarden te documenteren is waardevol.
In de vorige oefening bouwden we modellen als:
knn_5 = KNeighborsClassifier(n_neighbors=5)
knn_10 = KNeighborsClassifier(n_neighbors=10)
knn_20 = KNeighborsClassifier(n_neighbors=20)
Dat is best inefficiënt. Kan dit slimmer?
Gebruik een for-lus om opties te doorlopen:
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)
We slaan de resultaten op in een DataFrame om te bekijken:
results_df = pd.DataFrame({'neighbors':neighbors_list, 'accuracy':accuracy_list})
print(results_df)

Laten we een leercurve maken
We testen nu veel meer waarden
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})
We kunnen het grotere DataFrame plotten:
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()
Onze grafiek:

Pythons range ondersteunt geen decimale stappen.
Een handige truc is NumPy's np.linspace(start, end, num)
num waarden gelijkmatig verdeeld binnen het interval (start, end) dat je opgeeft.print(np.linspace(1,2,5))
[1. 1.25 1.5 1.75 2. ]
Hyperparameter Tuning in Python