Тюнінг гіперпараметрів у Python
Alex Scriven
Data Scientist
Деякі гіперпараметри важливіші за інші для початкового тюнінгу.
А які саме значення варто пробувати?
Розгляньмо кілька топпорад!
Зважайте на конфліктні вибори гіперпараметрів.
LogisticRegression() параметри solver і penalty можуть конфліктувати.The 'newton-cg', 'sag' and 'lbfgs' solvers support only l2 penalties.
Інколи це неявно — параметр просто «ігнорують» (у ElasticNet з гіперпараметром normalize):
This parameter is ignored when fit_intercept is set to False
Обов'язково звертайтеся до документації Scikit Learn!
Остерігайтеся «безглуздих» значень для різних алгоритмів:
Варто задокументувати розумні діапазони значень гіперпараметрів.
У попередній вправі ми будували моделі так:
knn_5 = KNeighborsClassifier(n_neighbors=5)
knn_10 = KNeighborsClassifier(n_neighbors=10)
knn_20 = KNeighborsClassifier(n_neighbors=20)
Це не дуже ефективно. Чи можна краще?
Спробуйте цикл for, щоб перебрати варіанти:
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)
Можемо зберегти результати в DataFrame для перегляду:
results_df = pd.DataFrame({'neighbors':neighbors_list, 'accuracy':accuracy_list})
print(results_df)

Створімо графік навчальної кривої
Цього разу перевіримо набагато більше значень
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})
Побудуємо більший 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()
Наш графік:

Функція range у Python не підтримує дробові кроки.
Зручний прийом — NumPy-функція np.linspace(start, end, num)
num значень, рівномірно розподілених у вказаному інтервалі (start, end).print(np.linspace(1,2,5))
[1. 1.25 1.5 1.75 2. ]
Тюнінг гіперпараметрів у Python