204 lines
6.6 KiB
Python
204 lines
6.6 KiB
Python
|
from .. import auc
|
||
|
from .. import roc_curve
|
||
|
|
||
|
from .base import _check_classifer_response_method
|
||
|
from ...utils import check_matplotlib_support
|
||
|
from ...base import is_classifier
|
||
|
from ...utils.validation import _deprecate_positional_args
|
||
|
|
||
|
|
||
|
class RocCurveDisplay:
|
||
|
"""ROC Curve visualization.
|
||
|
|
||
|
It is recommend to use :func:`~sklearn.metrics.plot_roc_curve` to create a
|
||
|
visualizer. All parameters are stored as attributes.
|
||
|
|
||
|
Read more in the :ref:`User Guide <visualizations>`.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
fpr : ndarray
|
||
|
False positive rate.
|
||
|
|
||
|
tpr : ndarray
|
||
|
True positive rate.
|
||
|
|
||
|
roc_auc : float, default=None
|
||
|
Area under ROC curve. If None, the roc_auc score is not shown.
|
||
|
|
||
|
estimator_name : str, default=None
|
||
|
Name of estimator. If None, the estimator name is not shown.
|
||
|
|
||
|
Attributes
|
||
|
----------
|
||
|
line_ : matplotlib Artist
|
||
|
ROC Curve.
|
||
|
|
||
|
ax_ : matplotlib Axes
|
||
|
Axes with ROC Curve.
|
||
|
|
||
|
figure_ : matplotlib Figure
|
||
|
Figure containing the curve.
|
||
|
|
||
|
Examples
|
||
|
--------
|
||
|
>>> import matplotlib.pyplot as plt # doctest: +SKIP
|
||
|
>>> import numpy as np
|
||
|
>>> from sklearn import metrics
|
||
|
>>> y = np.array([0, 0, 1, 1])
|
||
|
>>> pred = np.array([0.1, 0.4, 0.35, 0.8])
|
||
|
>>> fpr, tpr, thresholds = metrics.roc_curve(y, pred)
|
||
|
>>> roc_auc = metrics.auc(fpr, tpr)
|
||
|
>>> display = metrics.RocCurveDisplay(fpr=fpr, tpr=tpr, roc_auc=roc_auc,\
|
||
|
estimator_name='example estimator')
|
||
|
>>> display.plot() # doctest: +SKIP
|
||
|
>>> plt.show() # doctest: +SKIP
|
||
|
"""
|
||
|
def __init__(self, *, fpr, tpr, roc_auc=None, estimator_name=None):
|
||
|
self.fpr = fpr
|
||
|
self.tpr = tpr
|
||
|
self.roc_auc = roc_auc
|
||
|
self.estimator_name = estimator_name
|
||
|
|
||
|
@_deprecate_positional_args
|
||
|
def plot(self, ax=None, *, name=None, **kwargs):
|
||
|
"""Plot visualization
|
||
|
|
||
|
Extra keyword arguments will be passed to matplotlib's ``plot``.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
ax : matplotlib axes, default=None
|
||
|
Axes object to plot on. If `None`, a new figure and axes is
|
||
|
created.
|
||
|
|
||
|
name : str, default=None
|
||
|
Name of ROC Curve for labeling. If `None`, use the name of the
|
||
|
estimator.
|
||
|
|
||
|
Returns
|
||
|
-------
|
||
|
display : :class:`~sklearn.metrics.plot.RocCurveDisplay`
|
||
|
Object that stores computed values.
|
||
|
"""
|
||
|
check_matplotlib_support('RocCurveDisplay.plot')
|
||
|
import matplotlib.pyplot as plt
|
||
|
|
||
|
if ax is None:
|
||
|
fig, ax = plt.subplots()
|
||
|
|
||
|
name = self.estimator_name if name is None else name
|
||
|
|
||
|
line_kwargs = {}
|
||
|
if self.roc_auc is not None and name is not None:
|
||
|
line_kwargs["label"] = f"{name} (AUC = {self.roc_auc:0.2f})"
|
||
|
elif self.roc_auc is not None:
|
||
|
line_kwargs["label"] = f"AUC = {self.roc_auc:0.2f}"
|
||
|
elif name is not None:
|
||
|
line_kwargs["label"] = name
|
||
|
|
||
|
line_kwargs.update(**kwargs)
|
||
|
|
||
|
self.line_ = ax.plot(self.fpr, self.tpr, **line_kwargs)[0]
|
||
|
ax.set_xlabel("False Positive Rate")
|
||
|
ax.set_ylabel("True Positive Rate")
|
||
|
|
||
|
if "label" in line_kwargs:
|
||
|
ax.legend(loc='lower right')
|
||
|
|
||
|
self.ax_ = ax
|
||
|
self.figure_ = ax.figure
|
||
|
return self
|
||
|
|
||
|
|
||
|
@_deprecate_positional_args
|
||
|
def plot_roc_curve(estimator, X, y, *, sample_weight=None,
|
||
|
drop_intermediate=True, response_method="auto",
|
||
|
name=None, ax=None, **kwargs):
|
||
|
"""Plot Receiver operating characteristic (ROC) curve.
|
||
|
|
||
|
Extra keyword arguments will be passed to matplotlib's `plot`.
|
||
|
|
||
|
Read more in the :ref:`User Guide <visualizations>`.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
estimator : estimator instance
|
||
|
Fitted classifier or a fitted :class:`~sklearn.pipeline.Pipeline`
|
||
|
in which the last estimator is a classifier.
|
||
|
|
||
|
X : {array-like, sparse matrix} of shape (n_samples, n_features)
|
||
|
Input values.
|
||
|
|
||
|
y : array-like of shape (n_samples,)
|
||
|
Target values.
|
||
|
|
||
|
sample_weight : array-like of shape (n_samples,), default=None
|
||
|
Sample weights.
|
||
|
|
||
|
drop_intermediate : boolean, default=True
|
||
|
Whether to drop some suboptimal thresholds which would not appear
|
||
|
on a plotted ROC curve. This is useful in order to create lighter
|
||
|
ROC curves.
|
||
|
|
||
|
response_method : {'predict_proba', 'decision_function', 'auto'} \
|
||
|
default='auto'
|
||
|
Specifies whether to use :term:`predict_proba` or
|
||
|
:term:`decision_function` as the target response. If set to 'auto',
|
||
|
:term:`predict_proba` is tried first and if it does not exist
|
||
|
:term:`decision_function` is tried next.
|
||
|
|
||
|
name : str, default=None
|
||
|
Name of ROC Curve for labeling. If `None`, use the name of the
|
||
|
estimator.
|
||
|
|
||
|
ax : matplotlib axes, default=None
|
||
|
Axes object to plot on. If `None`, a new figure and axes is created.
|
||
|
|
||
|
Returns
|
||
|
-------
|
||
|
display : :class:`~sklearn.metrics.RocCurveDisplay`
|
||
|
Object that stores computed values.
|
||
|
|
||
|
Examples
|
||
|
--------
|
||
|
>>> import matplotlib.pyplot as plt # doctest: +SKIP
|
||
|
>>> from sklearn import datasets, metrics, model_selection, svm
|
||
|
>>> X, y = datasets.make_classification(random_state=0)
|
||
|
>>> X_train, X_test, y_train, y_test = model_selection.train_test_split(\
|
||
|
X, y, random_state=0)
|
||
|
>>> clf = svm.SVC(random_state=0)
|
||
|
>>> clf.fit(X_train, y_train)
|
||
|
SVC(random_state=0)
|
||
|
>>> metrics.plot_roc_curve(clf, X_test, y_test) # doctest: +SKIP
|
||
|
>>> plt.show() # doctest: +SKIP
|
||
|
"""
|
||
|
check_matplotlib_support('plot_roc_curve')
|
||
|
|
||
|
classification_error = (
|
||
|
"{} should be a binary classifier".format(estimator.__class__.__name__)
|
||
|
)
|
||
|
if not is_classifier(estimator):
|
||
|
raise ValueError(classification_error)
|
||
|
|
||
|
prediction_method = _check_classifer_response_method(estimator,
|
||
|
response_method)
|
||
|
y_pred = prediction_method(X)
|
||
|
|
||
|
if y_pred.ndim != 1:
|
||
|
if y_pred.shape[1] != 2:
|
||
|
raise ValueError(classification_error)
|
||
|
else:
|
||
|
y_pred = y_pred[:, 1]
|
||
|
|
||
|
pos_label = estimator.classes_[1]
|
||
|
fpr, tpr, _ = roc_curve(y, y_pred, pos_label=pos_label,
|
||
|
sample_weight=sample_weight,
|
||
|
drop_intermediate=drop_intermediate)
|
||
|
roc_auc = auc(fpr, tpr)
|
||
|
name = estimator.__class__.__name__ if name is None else name
|
||
|
viz = RocCurveDisplay(
|
||
|
fpr=fpr, tpr=tpr, roc_auc=roc_auc, estimator_name=name
|
||
|
)
|
||
|
return viz.plot(ax=ax, name=name, **kwargs)
|