def test_plot_det_curve(pyplot, response_method, data_binary, with_sample_weight, with_strings): X, y = data_binary pos_label = None if with_strings: y = np.array(["c", "b"])[y] pos_label = "c" if with_sample_weight: rng = np.random.RandomState(42) sample_weight = rng.randint(1, 4, size=(X.shape[0])) else: sample_weight = None lr = LogisticRegression() lr.fit(X, y) viz = plot_det_curve( lr, X, y, alpha=0.8, sample_weight=sample_weight, ) y_pred = getattr(lr, response_method)(X) if y_pred.ndim == 2: y_pred = y_pred[:, 1] fpr, fnr, _ = det_curve( y, y_pred, sample_weight=sample_weight, pos_label=pos_label, ) assert_allclose(viz.fpr, fpr) assert_allclose(viz.fnr, fnr) assert viz.estimator_name == "LogisticRegression" # cannot fail thanks to pyplot fixture import matplotlib as mpl # noqal assert isinstance(viz.line_, mpl.lines.Line2D) assert viz.line_.get_alpha() == 0.8 assert isinstance(viz.ax_, mpl.axes.Axes) assert isinstance(viz.figure_, mpl.figure.Figure) assert viz.line_.get_label() == "LogisticRegression" expected_pos_label = 1 if pos_label is None else pos_label expected_ylabel = ( f"False Negative Rate (Positive label: {expected_pos_label})") expected_xlabel = ( f"False Positive Rate (Positive label: {expected_pos_label})") assert viz.ax_.get_ylabel() == expected_ylabel assert viz.ax_.get_xlabel() == expected_xlabel
def no_step_dump(self) -> int: from sklearn import metrics fpr, fnr, roc_thresholds = metrics.det_curve(y_true=self.val[0], y_score=self.val[1], **self._dump_kwargs) det = { "det": [{ "fpr": fp, "fnr": fn, "threshold": t } for fp, fn, t in zip(fpr, fnr, roc_thresholds)] } self.write_json(det, self.output_path)
def test_det_curve_display(pyplot, constructor_name, response_method, with_sample_weight, with_strings): X, y = load_iris(return_X_y=True) # Binarize the data with only the two first classes X, y = X[y < 2], y[y < 2] pos_label = None if with_strings: y = np.array(["c", "b"])[y] pos_label = "c" if with_sample_weight: rng = np.random.RandomState(42) sample_weight = rng.randint(1, 4, size=(X.shape[0])) else: sample_weight = None lr = LogisticRegression() lr.fit(X, y) y_pred = getattr(lr, response_method)(X) if y_pred.ndim == 2: y_pred = y_pred[:, 1] # safe guard for the binary if/else construction assert constructor_name in ("from_estimator", "from_predictions") common_kwargs = { "name": lr.__class__.__name__, "alpha": 0.8, "sample_weight": sample_weight, "pos_label": pos_label, } if constructor_name == "from_estimator": disp = DetCurveDisplay.from_estimator(lr, X, y, **common_kwargs) else: disp = DetCurveDisplay.from_predictions(y, y_pred, **common_kwargs) fpr, fnr, _ = det_curve( y, y_pred, sample_weight=sample_weight, pos_label=pos_label, ) assert_allclose(disp.fpr, fpr) assert_allclose(disp.fnr, fnr) assert disp.estimator_name == "LogisticRegression" # cannot fail thanks to pyplot fixture import matplotlib as mpl # noqal assert isinstance(disp.line_, mpl.lines.Line2D) assert disp.line_.get_alpha() == 0.8 assert isinstance(disp.ax_, mpl.axes.Axes) assert isinstance(disp.figure_, mpl.figure.Figure) assert disp.line_.get_label() == "LogisticRegression" expected_pos_label = 1 if pos_label is None else pos_label expected_ylabel = f"False Negative Rate (Positive label: {expected_pos_label})" expected_xlabel = f"False Positive Rate (Positive label: {expected_pos_label})" assert disp.ax_.get_ylabel() == expected_ylabel assert disp.ax_.get_xlabel() == expected_xlabel