Skip to content

Commit 8536951

Browse files
FaustinPulvericValentin-Laurent
authored andcommitted
Update example plot_comp_methods_on_2d_dataset.py to the v1 API (#668)
1 parent 3c29bb0 commit 8536951

File tree

1 file changed

+55
-49
lines changed

1 file changed

+55
-49
lines changed

examples/classification/1-quickstart/plot_comp_methods_on_2d_dataset.py

Lines changed: 55 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
======================================================
55
66
In this tutorial, we compare the prediction sets estimated by
7-
:class:`~mapie.classification._MapieClassifier` with the "lac"
7+
:class:`~mapie_v1.classification.SplitConformalClassifier` with the "lac"
88
and "aps" on the two-dimensional dataset presented
99
by Sadinle et al. (2019).
1010
"""
@@ -20,12 +20,12 @@
2020
# classifier as the conformity score on a toy two-dimensional dataset.
2121
# We estimate the prediction sets as follows :
2222
#
23-
# * First we generate a dataset with train, calibration and test, the model
23+
# * First we generate a dataset with train, conformalization and test, the model
2424
# is fitted in the training set.
2525
#
2626
# * We set the conformal score ``Sᵢ = 𝑓̂(Xᵢ)ᵧᵢ``
2727
# from the softmax output of the true class or the cumulated score
28-
# (by decreasing order) for each sample in the calibration set.
28+
# (by decreasing order) for each sample in the conformalization set.
2929
#
3030
# * Then we define q̂ as being the
3131
# ``(n + 1)(1 - α) / n``
@@ -54,9 +54,9 @@
5454
from sklearn.naive_bayes import GaussianNB
5555

5656
from numpy.typing import NDArray
57-
from mapie.classification import _MapieClassifier
57+
from mapie.classification import SplitConformalClassifier
5858
from mapie.metrics.classification import (
59-
classification_coverage_score,
59+
classification_coverage_score_v2,
6060
classification_mean_width_score,
6161
)
6262

@@ -73,7 +73,7 @@
7373
]
7474
)
7575
y = np.hstack([np.full(n_samples, i) for i in range(n_classes)])
76-
X_train, X_cal, y_train, y_cal = train_test_split(X, y, test_size=0.3)
76+
X_train, X_conf, y_train, y_conf = train_test_split(X, y, test_size=0.3)
7777

7878
xx, yy = np.meshgrid(
7979
np.arange(x_min, x_max, step), np.arange(x_min, x_max, step)
@@ -102,31 +102,33 @@
102102

103103
##############################################################################
104104
# We fit our training data with a Gaussian Naive Base estimator.
105-
# Then we apply :class:`~mapie.classification._MapieClassifier` in the
106-
# calibration data with the methods ``"lac"`` and ``"aps"```
107-
# to the estimator indicating that it has already been fitted with
108-
# `cv="prefit"`.
109-
# We then estimate the prediction sets with differents alpha values with a
110-
# ``fit`` and ``predict`` process.
111-
112-
clf = GaussianNB().fit(X_train, y_train)
105+
# Then, we initialize a :class:`~mapie_v1.classification.SplitConformalClassifier` with
106+
# conformity scores ``"lac"`` and ``"aps"`` , using our pre-fitted estimator.
107+
# Lastly, we compute the prediction sets with different alpha values using the
108+
# ``conformalize`` and ``predict`` methods.
109+
110+
clf = GaussianNB()
111+
clf.fit(X_train, y_train)
113112
y_pred = clf.predict(X_test)
114113
y_pred_proba = clf.predict_proba(X_test)
115114
y_pred_proba_max = np.max(y_pred_proba, axis=1)
116115

117-
methods = ["lac", "aps"]
116+
conformity_scores = ["lac", "aps"]
118117
mapie, y_pred_mapie, y_ps_mapie = {}, {}, {}
119118
alpha = [0.2, 0.1, 0.05]
120-
for method in methods:
121-
mapie[method] = _MapieClassifier(
119+
for conformity_score in conformity_scores:
120+
mapie[conformity_score] = SplitConformalClassifier(
122121
estimator=clf,
123-
method=method,
124-
cv="prefit",
122+
confidence_level=1-np.array(alpha),
123+
conformity_score=conformity_score,
124+
prefit=True,
125125
random_state=42,
126126
)
127-
mapie[method].fit(X_cal, y_cal)
128-
y_pred_mapie[method], y_ps_mapie[method] = mapie[method].predict(
129-
X_test, alpha=alpha, include_last_label=True,
127+
mapie[conformity_score].conformalize(X_conf, y_conf)
128+
y_pred_mapie[conformity_score], y_ps_mapie[conformity_score] = (
129+
mapie[conformity_score].predict_set(
130+
X_test, conformity_score_params={"include_last_label": True}
131+
)
130132
)
131133

132134

@@ -146,7 +148,7 @@ def plot_scores(
146148
alphas: List[float],
147149
scores: NDArray,
148150
quantiles: NDArray,
149-
method: str,
151+
conformity_score: str,
150152
ax: plt.Axes,
151153
) -> None:
152154
colors = {0: "#1f77b4", 1: "#ff7f0e", 2: "#2ca02c"}
@@ -162,18 +164,19 @@ def plot_scores(
162164
label=f"alpha = {alphas[i]}",
163165
)
164166
i = i + 1
165-
ax.set_title(f"Distribution of scores for '{method}' method")
167+
ax.set_title(f"Distribution of scores for '{conformity_score}' method")
166168
ax.legend()
167169
ax.set_xlabel("scores")
168170
ax.set_ylabel("count")
169171

170172

171173
fig, axs = plt.subplots(1, 2, figsize=(10, 5))
172-
for i, method in enumerate(methods):
173-
conformity_scores = mapie[method].conformity_scores_
174-
n = mapie[method].n_samples_
175-
quantiles = mapie[method].conformity_score_function_.quantiles_
176-
plot_scores(alpha, conformity_scores, quantiles, method, axs[i])
174+
for i, conformity_score in enumerate(conformity_scores):
175+
conf_scores = mapie[conformity_score]._mapie_classifier.conformity_scores_
176+
n = mapie[conformity_score]._mapie_classifier.n_samples_
177+
quantiles = (
178+
mapie[conformity_score]._mapie_classifier.conformity_score_function_.quantiles_)
179+
plot_scores(alpha, conf_scores, quantiles, conformity_score, axs[i])
177180
plt.show()
178181

179182

@@ -228,8 +231,8 @@ def plot_results(
228231
plt.show()
229232

230233

231-
for method in methods:
232-
plot_results(alpha, y_pred_mapie[method], y_ps_mapie[method])
234+
for conformity_score in conformity_scores:
235+
plot_results(alpha, y_pred_mapie[conformity_score], y_ps_mapie[conformity_score])
233236

234237

235238
##############################################################################
@@ -248,38 +251,41 @@ def plot_results(
248251
alpha_ = np.arange(0.02, 0.98, 0.02)
249252
coverage, mean_width = {}, {}
250253
mapie, y_ps_mapie = {}, {}
251-
for method in methods:
252-
mapie[method] = _MapieClassifier(
254+
for conformity_score in conformity_scores:
255+
mapie[conformity_score] = SplitConformalClassifier(
253256
estimator=clf,
254-
method=method,
255-
cv="prefit",
257+
confidence_level=1-alpha_,
258+
conformity_score=conformity_score,
259+
prefit=True,
256260
random_state=42,
257261
)
258-
mapie[method].fit(X_cal, y_cal)
259-
_, y_ps_mapie[method] = mapie[method].predict(
260-
X, alpha=alpha_, include_last_label="randomized"
262+
mapie[conformity_score].conformalize(X_conf, y_conf)
263+
_, y_ps_mapie[conformity_score] = mapie[conformity_score].predict_set(
264+
X, conformity_score_params={"include_last_label": "randomized"}
261265
)
262-
coverage[method] = [
263-
classification_coverage_score(y, y_ps_mapie[method][:, :, i])
264-
for i, _ in enumerate(alpha_)
266+
coverage[conformity_score] = [
267+
classification_coverage_score_v2(y, y_ps_mapie[conformity_score])
265268
]
266-
mean_width[method] = classification_mean_width_score(y_ps_mapie[method])
269+
mean_width[conformity_score] = classification_mean_width_score(
270+
y_ps_mapie[conformity_score]
271+
)
267272

268273
fig, axs = plt.subplots(1, 3, figsize=(15, 5))
269274
axs[0].set_xlabel("1 - alpha")
270275
axs[0].set_ylabel("Quantile")
271-
for method in methods:
272-
quantiles = mapie[method].conformity_score_function_.quantiles_
273-
axs[0].scatter(1 - alpha_, quantiles, label=method)
276+
for conformity_score in conformity_scores:
277+
quantiles = (
278+
mapie[conformity_score]._mapie_classifier.conformity_score_function_.quantiles_)
279+
axs[0].scatter(1 - alpha_, quantiles, label=conformity_score)
274280
axs[0].legend()
275-
for method in methods:
276-
axs[1].scatter(1 - alpha_, coverage[method], label=method)
281+
for conformity_score in conformity_scores:
282+
axs[1].scatter(1 - alpha_, coverage[conformity_score], label=conformity_score)
277283
axs[1].set_xlabel("1 - alpha")
278284
axs[1].set_ylabel("Coverage score")
279285
axs[1].plot([0, 1], [0, 1], label="x=y", color="black")
280286
axs[1].legend()
281-
for method in methods:
282-
axs[2].scatter(1 - alpha_, mean_width[method], label=method)
287+
for conformity_score in conformity_scores:
288+
axs[2].scatter(1 - alpha_, mean_width[conformity_score], label=conformity_score)
283289
axs[2].set_xlabel("1 - alpha")
284290
axs[2].set_ylabel("Average size of prediction sets")
285291
axs[2].legend()

0 commit comments

Comments
 (0)