Calculate calibrated probabilities. Calculates classification calibrated probabilities for each class, in a one-vs-all manner, for `X`. Parameters ---------- X : ndarray of shape (n_samples, n_features) The sample data. Returns -
(self, X)
| 779 | self.method = method |
| 780 | |
| 781 | def predict_proba(self, X): |
| 782 | """Calculate calibrated probabilities. |
| 783 | |
| 784 | Calculates classification calibrated probabilities |
| 785 | for each class, in a one-vs-all manner, for `X`. |
| 786 | |
| 787 | Parameters |
| 788 | ---------- |
| 789 | X : ndarray of shape (n_samples, n_features) |
| 790 | The sample data. |
| 791 | |
| 792 | Returns |
| 793 | ------- |
| 794 | proba : array, shape (n_samples, n_classes) |
| 795 | The predicted probabilities. Can be exact zeros. |
| 796 | """ |
| 797 | predictions, _ = _get_response_values( |
| 798 | self.estimator, |
| 799 | X, |
| 800 | response_method=["decision_function", "predict_proba"], |
| 801 | ) |
| 802 | if predictions.ndim == 1: |
| 803 | # Reshape binary output from `(n_samples,)` to `(n_samples, 1)` |
| 804 | predictions = predictions.reshape(-1, 1) |
| 805 | |
| 806 | n_classes = self.classes.shape[0] |
| 807 | |
| 808 | proba = np.zeros((_num_samples(X), n_classes)) |
| 809 | |
| 810 | if self.method in ("sigmoid", "isotonic"): |
| 811 | label_encoder = LabelEncoder().fit(self.classes) |
| 812 | pos_class_indices = label_encoder.transform(self.estimator.classes_) |
| 813 | for class_idx, this_pred, calibrator in zip( |
| 814 | pos_class_indices, predictions.T, self.calibrators |
| 815 | ): |
| 816 | if n_classes == 2: |
| 817 | # When binary, `predictions` consists only of predictions for |
| 818 | # clf.classes_[1] but `pos_class_indices` = 0 |
| 819 | class_idx += 1 |
| 820 | proba[:, class_idx] = calibrator.predict(this_pred) |
| 821 | # Normalize the probabilities |
| 822 | if n_classes == 2: |
| 823 | proba[:, 0] = 1.0 - proba[:, 1] |
| 824 | else: |
| 825 | denominator = np.sum(proba, axis=1)[:, np.newaxis] |
| 826 | # In the edge case where for each class calibrator returns a zero |
| 827 | # probability for a given sample, use the uniform distribution |
| 828 | # instead. |
| 829 | uniform_proba = np.full_like(proba, 1 / n_classes) |
| 830 | proba = np.divide( |
| 831 | proba, denominator, out=uniform_proba, where=denominator != 0 |
| 832 | ) |
| 833 | elif self.method == "temperature": |
| 834 | xp, _ = get_namespace(predictions) |
| 835 | if n_classes == 2 and predictions.shape[-1] == 1: |
| 836 | response_method_name = _check_response_method( |
| 837 | self.estimator, |
| 838 | ["decision_function", "predict_proba"], |
no test coverage detected