На этом шаге мы дадим несколько советов по использованию рассмотренных метрик.
Мы подробно рассмотрели множество методов оценки и обсудили их применение с учетом фактических и спрогнозированных результатов.
Однако часто нам нужно воспользоваться метриками типа AUC для отбора модели, выполняемого на основе GridSearchCV или cross_val_score(). К счастью, scikit-learn предлагает очень простой способ решения этой задачи с помощью аргумента scoring, который можно использовать как в GridSearchCV, так и в cross_val_score(). Вы можете просто задать строку с описанием необходимой метрики оценки. Допустим, мы хотим оценить качество классификатора SVM при решении задачи "девять против остальных" для набора данных digits, используя значение AUC. Чтобы поменять метрику оценки с правильности, установленной по умолчанию, на AUC, достаточно указать "roc_auc" в качестве параметра scoring:
[In 69]: # метрика качества классификационной модели по умолчанию - правильность print("Метрика качества по умолчанию: {}".format( cross_val_score(SVC(), digits.data, digits.target == 9))) # значение параметра scoring="accuracy" не меняет результатов explicit_accuracy = cross_val_score(SVC(), digits.data, digits.target == 9, scoring="accuracy") print("Метрика качества явно заданная правильность: {}".format(explicit_accuracy)) roc_auc = cross_val_score(SVC(), digits.data, digits.target == 9, scoring="roc_auc") print("Метрика качества AUC: {}".format(roc_auc)) Метрика качества по умолчанию: [0.975 0.99166667 1. 0.99442897 0.98050139] Метрика качества явно заданная правильность: [0.975 0.99166667 1. 0.99442897 0.98050139] Метрика качества AUC: [0.99717078 0.99854252 1. 0.999828 0.98400413]
Точно так же мы можем изменить метрику, используемую для отбора наилучших параметров в Grid-SearchCV:
[In 70]: X_train, X_test, y_train, y_test = train_test_split( digits.data, digits.target == 9, random_state=0) # задаем не самую удачную сетку параметров для иллюстрации: param_grid = {'gamma': [0.0001, 0.01, 0.1, 1, 10]} # используем метрику по умолчанию, то есть правильность: grid = GridSearchCV(SVC(), param_grid=param_grid) grid.fit(X_train, y_train) print("Решетчатый поиск c использованием правильности") print("Наилучшие параметры:", grid.best_params_) print("Наилучшее значение перекр проверки (правильность)): {:.3f}".format(grid.best_score_)) print("AUC на тестовом наборе: {:.3f}".format( roc_auc_score(y_test, grid.decision_function(X_test)))) print("Правильность на тестовом наборе: {:.3f}".format(grid.score(X_test, y_test))) Решетчатый поиск c использованием правильности Наилучшие параметры: {'gamma': 0.0001} Наилучшее значение перекр проверки (правильность)): 0.976 AUC на тестовом наборе: 0.992 Правильность на тестовом наборе: 0.973
[In 71]: # используем метрику качества AUC: grid = GridSearchCV(SVC(), param_grid=param_grid, scoring="roc_auc") grid.fit(X_train, y_train) print("\nРешетчатый поиск с использованием AUC") print("Наилучшие параметры:", grid.best_params_) print("Наилучшее значение перекр проверки (AUC): {:.3f}".format(grid.best_score_)) print("AUC на тестовом наборе: {:.3f}".format( roc_auc_score(y_test, grid.decision_function(X_test)))) print("Правильность на тестовом наборе: {:.3f}".format(grid.score(X_test, y_test))) Решетчатый поиск с использованием AUC Наилучшие параметры: {'gamma': 0.01} Наилучшее значение перекр проверки (AUC): 0.998 AUC на тестовом наборе: 1.000 Правильность на тестовом наборе: 1.000
Когда использовалась правильность, был выбран параметр gamma=0.0001, тогда как при использовании AUC был выбран gamma=0.01. В обоих случаях правильность перекрестной проверки соответствует правильности на тестовом наборе. Однако использование AUC позволила найти настройку параметра, оптимальную с точки зрения AUC и даже с точки зрения правильности.
Наиболее важными значениями параметра scoring для классификации являются:
Для регрессии, наиболее часто используемыми значениями являются:
Полный список поддерживаемых аргументов вы можете найти, ознакомившись с документацией или взглянув на словарь SCORERS в модуле metrics.scorer:
[In 72]: from sklearn.metrics import SCORERS print("Доступные объекты scorer:\n{}".format(sorted(SCORERS.keys()))) Доступные объекты scorer: ['accuracy', 'adjusted_mutual_info_score', 'adjusted_rand_score', 'average_precision', 'balanced_accuracy', 'completeness_score', 'explained_variance', 'f1', 'f1_macro', 'f1_micro', 'f1_samples', 'f1_weighted', 'fowlkes_mallows_score', 'homogeneity_score', 'jaccard', 'jaccard_macro', 'jaccard_micro', 'jaccard_samples', 'jaccard_weighted', 'max_error', 'mutual_info_score', 'neg_brier_score', 'neg_log_loss', 'neg_mean_absolute_error', 'neg_mean_absolute_percentage_error', 'neg_mean_gamma_deviance', 'neg_mean_poisson_deviance', 'neg_mean_squared_error', 'neg_mean_squared_log_error', 'neg_median_absolute_error', 'neg_root_mean_squared_error', 'normalized_mutual_info_score', 'precision', 'precision_macro', 'precision_micro', 'precision_samples', 'precision_weighted', 'r2', 'rand_score', 'recall', 'recall_macro', 'recall_micro', 'recall_samples', 'recall_weighted', 'roc_auc', 'roc_auc_ovo', 'roc_auc_ovo_weighted', 'roc_auc_ovr', 'roc_auc_ovr_weighted', 'top_k_accuracy', 'v_measure_score']
Архив блокнота со всеми вычислениями, выполненными на 132-166 шагах, можно взять здесь.
На следующем шаге мы рассмотрим выводы и перспективы.