# scikit-learn__scikit-learn-25500 # Loki Mode Multi-Agent Patch # Attempts: 1 --- a/sklearn/isotonic.py +++ b/sklearn/isotonic.py @@ -360,20 +360,35 @@ class IsotonicRegression(RegressorMixin, TransformerMixin, BaseEstimator): self.X_thresholds_ = X[keep_inds] self.y_thresholds_ = y[keep_inds] self.increasing_ = increasing return self - def transform(self, T): - """Transform new data by linear interpolation. + def _transform(self, T): + """Core transformation logic. + + This private method contains the core transformation logic without + the pandas output wrapper. It is used by both `transform()` and + `predict()` to ensure `predict()` always returns a numpy array. Parameters ---------- T : array-like of shape (n_samples,) or (n_samples, 1) Data to transform. + Returns + ------- + y_pred : ndarray of shape (n_samples,) + The transformed data. + .. versionadded:: 0.24 Also accepts 2d array with 1 feature. + """ + T = validate_data(self, T, ensure_2d=False, dtype=np.float64, reset=False) + return np.interp(T, self.X_thresholds_, self.y_thresholds_) + + @_fit_context(prefer_skip_nested_validation=True) + def transform(self, T): + """Transform new data by linear interpolation. + + Parameters + ---------- + T : array-like of shape (n_samples,) or (n_samples, 1) + Data to transform. Returns ------- y_pred : ndarray of shape (n_samples,) The transformed data. @@ -384,13 +399,11 @@ class IsotonicRegression(RegressorMixin, TransformerMixin, BaseEstimator): 2.7 2.7 2.7 2.7 2.7 2.7 2.7 2.7 2.7 2.7 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5] Note that the returned value is clipped to the range [0.0, 1.0]. """ - T = validate_data(self, T, ensure_2d=False, dtype=np.float64, reset=False) - return np.interp(T, self.X_thresholds_, self.y_thresholds_) + return self._transform(T) - @_fit_context(prefer_skip_nested_validation=True) def predict(self, T): """Predict new data by linear interpolation. Parameters ---------- @@ -406,11 +419,11 @@ class IsotonicRegression(RegressorMixin, TransformerMixin, BaseEstimator): >>> iso_reg = IsotonicRegression().fit(x, y) >>> iso_reg.predict(x) array([1.5, 1.5, 3. , 3. , 5. , 5. ]) """ - return self.transform(T) + return self._transform(T) def __getstate__(self): """Pickle-protocol - return state of the estimator.""" state = super().__getstate__() # remove interpolation method