Введение
В этом руководстве пошагово показано, как использовать метрику Точность - Полнота для оценки качества выходных данных классификатора. Кривая Точность - Полнота является полезной мерой успеха прогноза, когда классы сильно несбалансированы. В области информационного поиска точность является мерой релевантности результатов, а полнота - мерой количества возвращаемых действительно релевантных результатов.
Советы по работе с ВМ
После запуска ВМ щелкните в левом верхнем углу, чтобы переключиться на вкладку Ноутбук и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из - за ограничений в Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Набор данных и модель
Мы будем использовать набор данных iris и классификатор Linear SVC для дифференциации двух типов ирис. Во - первых, мы импортируем необходимые библиотеки и загружаем набор данных.
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
X, y = load_iris(return_X_y=True)
Далее мы добавим шумовые признаки к набору данных и разделим его на обучающую и тестовую выборки.
random_state = np.random.RandomState(0)
n_samples, n_features = X.shape
X = np.concatenate([X, random_state.randn(n_samples, 200 * n_features)], axis=1)
X_train, X_test, y_train, y_test = train_test_split(
X[y < 2], y[y < 2], test_size=0.5, random_state=random_state
)
Наконец, мы масштабируем данные с использованием StandardScaler и подгоняем классификатор Linear SVC к обучающим данным.
classifier = make_pipeline(
StandardScaler(), LinearSVC(random_state=random_state, dual="auto")
)
classifier.fit(X_train, y_train)
Построение кривой Точность - Полнота
Для построения кривой Точность - Полнота мы будем использовать класс PrecisionRecallDisplay из библиотеки sklearn.metrics. Мы можем использовать метод from_estimator или from_predictions для вычисления кривой. Метод from_estimator вычисляет предсказания для нас перед построением кривой, в то время как метод from_predictions требует от нас предоставить предсказанные оценки.
from sklearn.metrics import PrecisionRecallDisplay
## Использование метода from_estimator
display = PrecisionRecallDisplay.from_estimator(
classifier, X_test, y_test, name="LinearSVC", plot_chance_level=True
)
_ = display.ax_.set_title("2-class Precision-Recall curve")
## Использование метода from_predictions
y_score = classifier.decision_function(X_test)
display = PrecisionRecallDisplay.from_predictions(
y_test, y_score, name="LinearSVC", plot_chance_level=True
)
_ = display.ax_.set_title("2-class Precision-Recall curve")
Построение кривой Точность - Полнота для много-метки классификации
Кривая Точность - Полнота не поддерживает многометочный случай. Однако можно решить, как обработать этот случай. Мы создадим многометочный набор данных, подгоним и предскажем с использованием OneVsRestClassifier, а затем построим кривую Точность - Полнота.
from sklearn.preprocessing import label_binarize
from sklearn.multiclass import OneVsRestClassifier
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import average_precision_score
## Создаем многометочные данные
Y = label_binarize(y, classes=[0, 1, 2])
n_classes = Y.shape[1]
X_train, X_test, Y_train, Y_test = train_test_split(
X, Y, test_size=0.5, random_state=random_state
)
## Подгоняем и предсказываем с использованием OneVsRestClassifier
classifier = OneVsRestClassifier(
make_pipeline(StandardScaler(), LinearSVC(random_state=random_state, dual="auto"))
)
classifier.fit(X_train, Y_train)
y_score = classifier.decision_function(X_test)
## Вычисляем точность и полноту для каждого класса
precision = dict()
recall = dict()
average_precision = dict()
for i in range(n_classes):
precision[i], recall[i], _ = precision_recall_curve(Y_test[:, i], y_score[:, i])
average_precision[i] = average_precision_score(Y_test[:, i], y_score[:, i])
## Вычисляем микро-скользящее среднее точность и полноту
precision["micro"], recall["micro"], _ = precision_recall_curve(Y_test.ravel(), y_score.ravel())
average_precision["micro"] = average_precision_score(Y_test, y_score, average="micro")
## Строим микро-скользящее среднее кривую Точность - Полнота
display = PrecisionRecallDisplay(
recall=recall["micro"],
precision=precision["micro"],
average_precision=average_precision["micro"],
prevalence_pos_label=Counter(Y_test.ravel())[1] / Y_test.size,
)
display.plot(plot_chance_level=True)
_ = display.ax_.set_title("Micro-averaged over all classes")
## Строим кривую Точность - Полнота для каждого класса и кривые iso-f1
colors = cycle(["navy", "turquoise", "darkorange", "cornflowerblue", "teal"])
_, ax = plt.subplots(figsize=(7, 8))
f_scores = np.linspace(0.2, 0.8, num=4)
lines, labels = [], []
for f_score in f_scores:
x = np.linspace(0.01, 1)
y = f_score * x / (2 * x - f_score)
(l,) = plt.plot(x[y >= 0], y[y >= 0], color="gray", alpha=0.2)
plt.annotate("f1={0:0.1f}".format(f_score), xy=(0.9, y[45] + 0.02))
display = PrecisionRecallDisplay(
recall=recall["micro"],
precision=precision["micro"],
average_precision=average_precision["micro"],
)
display.plot(ax=ax, name="Micro-average precision-recall", color="gold")
for i, color in zip(range(n_classes), colors):
display = PrecisionRecallDisplay(
recall=recall[i],
precision=precision[i],
average_precision=average_precision[i],
)
display.plot(ax=ax, name=f"Precision-recall for class {i}", color=color)
handles, labels = display.ax_.get_legend_handles_labels()
handles.extend([l])
labels.extend(["iso-f1 curves"])
ax.set_xlim([0.0, 1.0])
ax.set_ylim([0.0, 1.05])
ax.legend(handles=handles, labels=labels, loc="best")
ax.set_title("Extension of Precision-Recall curve to multi-class")
plt.show()
Резюме
В этом руководстве пошагово показано, как использовать метрику Точность - Полнота для оценки качества выходных данных классификатора. Мы узнали, как построить кривую Точность - Полнота для бинарной классификации с использованием класса PrecisionRecallDisplay из библиотеки sklearn.metrics. Мы также узнали, как построить кривую Точность - Полнота для много-метки классификации с использованием OneVsRestClassifier и как вычислить точность и полноту для каждого класса.