
    {Kg1                         d dl Z d dlZddlmZmZmZmZ ddlm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ dgZ G d deee      Zy)    N   )BaseEstimatorRegressorMixin_fit_contextclone)NotFittedError)FunctionTransformer)_safe_indexingcheck_array)
HasMethods)
_safe_tags)_raise_for_unsupported_routing_RoutingNotSupportedMixin)check_is_fittedTransformedTargetRegressorc                       e Zd ZU dZ eddg      dg ed      dgedgedgdgdZeed<   	 ddddd	d
dZ	d Z
 ed      d        Zd Zd Zed        Zy)r   a  Meta-estimator to regress on a transformed target.

    Useful for applying a non-linear transformation to the target `y` in
    regression problems. This transformation can be given as a Transformer
    such as the :class:`~sklearn.preprocessing.QuantileTransformer` or as a
    function and its inverse such as `np.log` and `np.exp`.

    The computation during :meth:`fit` is::

        regressor.fit(X, func(y))

    or::

        regressor.fit(X, transformer.transform(y))

    The computation during :meth:`predict` is::

        inverse_func(regressor.predict(X))

    or::

        transformer.inverse_transform(regressor.predict(X))

    Read more in the :ref:`User Guide <transformed_target_regressor>`.

    .. versionadded:: 0.20

    Parameters
    ----------
    regressor : object, default=None
        Regressor object such as derived from
        :class:`~sklearn.base.RegressorMixin`. This regressor will
        automatically be cloned each time prior to fitting. If `regressor is
        None`, :class:`~sklearn.linear_model.LinearRegression` is created and used.

    transformer : object, default=None
        Estimator object such as derived from
        :class:`~sklearn.base.TransformerMixin`. Cannot be set at the same time
        as `func` and `inverse_func`. If `transformer is None` as well as
        `func` and `inverse_func`, the transformer will be an identity
        transformer. Note that the transformer will be cloned during fitting.
        Also, the transformer is restricting `y` to be a numpy array.

    func : function, default=None
        Function to apply to `y` before passing to :meth:`fit`. Cannot be set
        at the same time as `transformer`. If `func is None`, the function used will be
        the identity function. If `func` is set, `inverse_func` also needs to be
        provided. The function needs to return a 2-dimensional array.

    inverse_func : function, default=None
        Function to apply to the prediction of the regressor. Cannot be set at
        the same time as `transformer`. The inverse function is used to return
        predictions to the same space of the original training labels. If
        `inverse_func` is set, `func` also needs to be provided. The inverse
        function needs to return a 2-dimensional array.

    check_inverse : bool, default=True
        Whether to check that `transform` followed by `inverse_transform`
        or `func` followed by `inverse_func` leads to the original targets.

    Attributes
    ----------
    regressor_ : object
        Fitted regressor.

    transformer_ : object
        Transformer used in :meth:`fit` and :meth:`predict`.

    n_features_in_ : int
        Number of features seen during :term:`fit`. Only defined if the
        underlying regressor exposes such an attribute when fit.

        .. versionadded:: 0.24

    feature_names_in_ : ndarray of shape (`n_features_in_`,)
        Names of features seen during :term:`fit`. Defined only when `X`
        has feature names that are all strings.

        .. versionadded:: 1.0

    See Also
    --------
    sklearn.preprocessing.FunctionTransformer : Construct a transformer from an
        arbitrary callable.

    Notes
    -----
    Internally, the target `y` is always converted into a 2-dimensional array
    to be used by scikit-learn transformers. At the time of prediction, the
    output will be reshaped to a have the same number of dimensions as `y`.

    Examples
    --------
    >>> import numpy as np
    >>> from sklearn.linear_model import LinearRegression
    >>> from sklearn.compose import TransformedTargetRegressor
    >>> tt = TransformedTargetRegressor(regressor=LinearRegression(),
    ...                                 func=np.log, inverse_func=np.exp)
    >>> X = np.arange(4).reshape(-1, 1)
    >>> y = np.exp(2 * X).ravel()
    >>> tt.fit(X, y)
    TransformedTargetRegressor(...)
    >>> tt.score(X, y)
    1.0
    >>> tt.regressor_.coef_
    array([2.])

    For a more detailed example use case refer to
    :ref:`sphx_glr_auto_examples_compose_plot_transformed_target.py`.
    fitpredictN	transformboolean	regressortransformerfuncinverse_funccheck_inverse_parameter_constraintsT)r   r   r   r   c                J    || _         || _        || _        || _        || _        y Nr   )selfr   r   r   r   r   s         [/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/sklearn/compose/_target.py__init__z#TransformedTargetRegressor.__init__   s*     #&	(*    c           	      |   | j                   #| j                  | j                  t        d      | j                   t	        | j                         | _        n| j                  | j                  | j                  4| j                  (| j                  dnd\  }}t        d| d| d| d      t        | j                  | j                  d	| j                  
      | _        | j
                  j                  d       | j
                  j                  |       | j                  rt        ddt        d|j                  d   dz              }t        ||      }| j
                  j                  |      }t        j                   || j
                  j#                  |            st%        j&                  dt(               yyy)zCheck transformer and fit transformer.

        Create the default transformer, fit it and make additional inverse
        check on a subset (optional).

        NzE'transformer' and functions 'func'/'inverse_func' cannot both be set.)r   r   )r   r   zWhen 'z' is provided, 'z' must also be provided. If zU is supposed to be the default, you need to explicitly pass it the identity function.T)r   r   validater   default)r      r   
   zThe provided functions or transformer are not strictly inverse of each other. If you are sure you want to proceed regardless, set 'check_inverse=False')r   r   r   
ValueErrorr   transformer_r	   r   
set_outputr   slicemaxshaper
   r   npallcloseinverse_transformwarningswarnUserWarning)r    ylacking_paramexisting_paramidx_selectedy_sely_sel_ts          r!   _fit_transformerz+TransformedTargetRegressor._fit_transformer   s    'II!T%6%6%BW  ) %d&6&6 7D		%$*;*;*C		!d&7&7&C yy( -1 .~
 !^,,<]O L((5 7MM 
 !4YY!.."00	!D ((9(=
 	a  tSAGGAJ"4D-EFL"1l3E''11%8G;;ud&7&7&I&I'&RS6
   T	 r#   F)prefer_skip_nested_validationc           	         t        | dfi | |#t        d| j                  j                   d      t	        |dddddd      }|j
                  | _        |j
                  d	k(  r|j                  d
d	      }n|}| j                  |       | j                  j                  |      }|j
                  dk(  r$|j                  d	   d	k(  r|j                  d	      }| j                  ddlm}  |       | _        nt#        | j                        | _         | j                   j$                  ||fi | t'        | j                   d      r| j                   j(                  | _        | S )aB  Fit the model according to the given training data.

        Parameters
        ----------
        X : {array-like, sparse matrix} of shape (n_samples, n_features)
            Training vector, where `n_samples` is the number of samples and
            `n_features` is the number of features.

        y : array-like of shape (n_samples,)
            Target values.

        **fit_params : dict
            Parameters passed to the `fit` method of the underlying
            regressor.

        Returns
        -------
        self : object
            Fitted estimator.
        r   zThis z= estimator requires y to be passed, but the target y is None.r5   FTnumeric)
input_nameaccept_sparseforce_all_finite	ensure_2ddtypeallow_ndr'   r   axisLinearRegressionfeature_names_in_)r   r)   	__class____name__r   ndim_training_dimreshaper;   r*   r   r.   squeezer   linear_modelrI   
regressor_r   r   hasattrrJ   )r    Xr5   
fit_paramsy_2dy_transrI   s          r!   r   zTransformedTargetRegressor.fit   sP   2 	'tUAjA9//0 1E E  !
 VV 66Q;99R#DDd# ##--d3 <<1q!1Q!6oo1o-G>>!7.0DO#DNN3DOAw5*54??$78%)__%F%FD"r#   c                    t        |         | j                  j                  |fi |}|j                  dk(  r,| j                  j                  |j                  dd            }n| j                  j                  |      }| j                  dk(  r3|j                  dk(  r$|j                  d   dk(  r|j                  d      }|S )aK  Predict using the base regressor, applying inverse.

        The regressor is used to predict and the `inverse_func` or
        `inverse_transform` is applied before returning the prediction.

        Parameters
        ----------
        X : {array-like, sparse matrix} of shape (n_samples, n_features)
            Samples.

        **predict_params : dict of str -> object
            Parameters passed to the `predict` method of the underlying
            regressor.

        Returns
        -------
        y_hat : ndarray of shape (n_samples,)
            Predicted values.
        r'   rE   r   rF   )
r   rR   r   rM   r*   r1   rO   rN   r.   rP   )r    rT   predict_paramspred
pred_transs        r!   r   z"TransformedTargetRegressor.predict'  s    ( 	&t&&q;N;99>**<<T\\"a=PQJ**<<TBJ!#1$  #q(#+++3Jr#   c                 X    | j                   }|ddlm}  |       }dt        |d      dS )Nr   rH   Tmultioutput)key)
poor_scorer]   )r   rQ   rI   r   )r    r   rI   s      r!   
_more_tagsz%TransformedTargetRegressor._more_tagsJ  s5    NN	7(*I %i]C
 	
r#   c                     	 t        |        | j                  j                  S # t        $ r4}t        dj                  | j                  j
                              |d}~ww xY w)z+Number of features seen during :term:`fit`.z*{} object has no n_features_in_ attribute.N)r   r   AttributeErrorformatrK   rL   rR   n_features_in_)r    nfes     r!   rd   z)TransformedTargetRegressor.n_features_in_V  s`    
	D! ---  	 <CCNN++ 		s   # 	A /AA r   )rL   
__module____qualname____doc__r   callabler   dict__annotations__r"   r;   r   r   r   r`   propertyrd    r#   r!   r   r      s    m` !%!34d;";/64 !4(#$D  + +9v &+E	EN!F

 . .r#   )r2   numpyr/   baser   r   r   r   
exceptionsr   preprocessingr	   utilsr
   r   utils._param_validationr   utils._tagsr   utils.metadata_routingr   r   utils.validationr   __all__r   rm   r#   r!   <module>rx      sG   
   E E ' / / 0 $ /'
(L.~}L.r#   