Ë
    ÷Q(hì8  ã                   ó¾   — 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 ddlmZmZm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 dgZ G d„ dee«      Zy)é    Né   )ÚBaseEstimatorÚRegressorMixinÚ_fit_contextÚclone)ÚNotFittedError)ÚLinearRegression)ÚFunctionTransformer)ÚBunchÚ_safe_indexingÚcheck_array)ÚMetadataRouterÚMethodMappingÚ_routing_enabledÚprocess_routing)Ú
HasMethods)Úget_tags)Ú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ˆ fd„Zed„ «       Zd„ Zdd„Zˆ xZS )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         úU/var/www/skyplay_api_hub/venv/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                  r™t        ddt        d|j                  d   dz  «      «      }t        ||«      }| j
                  j                  |«      }t        j                   || j
                  j#                  |«      «      st%        j&                  dt(        «       yyy)z¢Check 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   é
   z—The 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¹  € ð ×ÑÐ'Ø�I‰IÐ! T×%6Ñ%6Ð%BäØWóð ð ×ÑÐ)Ü % d×&6Ñ&6Ó 7ˆDÕà—	‘	Ð%¨$×*;Ñ*;Ð*CØ—	‘	Ð! d×&7Ñ&7Ð&Cð —y‘yÐ(ñ -à1ñ .�˜~ô
 !Ø˜^Ð,Ð,<¸]¸Oð L(Ø(5 ð 7MðMóð ô
 !4Ø—Y‘YØ!×.Ñ.ØØ"×0Ñ0ô	!ˆDÔð ×Ñ×(Ñ(°9Ð(Ô=ð
 	×Ñ×Ñ˜aÔ Ø×ÒÜ   t¬S°°A·G±G¸A±JÀ"Ñ4DÓ-EÓFˆLÜ" 1 lÓ3ˆEØ×'Ñ'×1Ñ1°%Ó8ˆGÜ—;‘;˜u d×&7Ñ&7×&IÑ&IÈ'Ó&RÔSÜ—‘ð6ô
  õð Tð	 r'   F)Úprefer_skip_nested_validationc           	      óì  — |€#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¬«      | _        t        «       rt        | dfi |¤Ž}nt!        t!        |¬«      ¬«      } | j                  j"                  ||fi |j$                  j"                  ¤Ž t'        | j                  d«      r| j                  j(                  | _        | S )a˜  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
            - If `enable_metadata_routing=False` (default): Parameters directly passed
              to the `fit` method of the underlying regressor.

            - If `enable_metadata_routing=True`: Parameters safely routed to the `fit`
              method of the underlying regressor.

            .. versionchanged:: 1.6
                See :ref:`Metadata Routing User Guide <metadata_routing>` for
                more details.

        Returns
        -------
        self : object
            Fitted estimator.
        zThis z= estimator requires y to be passed, but the target y is None.r9   FTÚnumeric)Ú
input_nameÚaccept_sparseÚensure_all_finiteÚ	ensure_2dÚdtypeÚallow_ndr+   éÿÿÿÿr   ©Úaxis)Ú	get_cloner   )r   ©r   Úfeature_names_in_)r-   Ú	__class__Ú__name__r   ÚndimÚ_training_dimÚreshaper?   r.   r   r2   ÚsqueezeÚ_get_regressorÚ
regressor_r   r   r   r   r   ÚhasattrrN   )r$   ÚXr9   Ú
fit_paramsÚy_2dÚy_transÚrouted_paramss          r%   r   zTransformedTargetRegressor.fitÜ   sb  € ð@ ˆ9ÜØ˜Ÿ™×/Ñ/Ð0ð 1Eð Eóð ô ØØØØ"ØØØô
ˆð ŸV™VˆÔð �6‰6�QŠ;Ø—9‘9˜R Ó#‰DàˆDØ×Ñ˜dÔ#ð ×#Ñ#×-Ñ-¨dÓ3ˆð �<‰<˜1Ò §¡¨qÑ!1°QÒ!6Ø—o‘o¨1�oÓ-ˆGà×-Ñ-¸Ð-Ó=ˆŒÜÔÜ+¨D°%ÑF¸:ÑF‰Mä!¬E°jÔ,AÔBˆMàˆ�‰×Ñ˜A˜wÑF¨-×*AÑ*A×*EÑ*EÒFä�4—?‘?Ð$7Ô8Ø%)§_¡_×%FÑ%FˆDÔ"àˆr'   c                 ó
  — t        | «       t        «       rt        | dfi |¤Ž}nt        t        |¬«      ¬«      } | j                  j
                  |fi |j                  j
                  ¤Ž}|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 )a¥  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
            - If `enable_metadata_routing=False` (default): Parameters directly passed
              to the `predict` method of the underlying regressor.

            - If `enable_metadata_routing=True`: Parameters safely routed to the
              `predict` method of the underlying regressor.

            .. versionchanged:: 1.6
                See :ref:`Metadata Routing User Guide <metadata_routing>`
                for more details.

        Returns
        -------
        y_hat : ndarray of shape (n_samples,)
            Predicted values.
        r   )r   rM   r+   rI   r   rJ   )r   r   r   r   rV   r   r   rQ   r.   r5   rS   rR   r2   rT   )r$   rX   Úpredict_paramsr\   ÚpredÚ
pred_transs         r%   r   z"TransformedTargetRegressor.predict,  sá   € ô6 	˜ÔÜÔÜ+¨D°)ÑN¸~ÑN‰Mä!¬E¸.Ô,IÔJˆMà&ˆt�‰×&Ñ& qÑL¨M×,CÑ,C×,KÑ,KÑLˆØ�9‰9˜Š>Ø×*Ñ*×<Ñ<¸T¿\¹\È"ÈaÓ=PÓQ‰Jà×*Ñ*×<Ñ<¸TÓBˆJà×Ñ !Ò#Ø—‘ 1Ò$Ø× Ñ  Ñ# qÒ(à#×+Ñ+°Ð+Ó3ˆJàÐr'   c                 ó  •— | j                  «       }t        ‰| �	  «       }d|j                  _        t        |«      j                  j                  |j                  _        t        |«      j                  j                  |j                  _	        |S )NT)
rU   ÚsuperÚ__sklearn_tags__Úregressor_tagsÚ
poor_scorer   Ú
input_tagsÚsparseÚtarget_tagsÚmulti_output)r$   r   ÚtagsrO   s      €r%   rc   z+TransformedTargetRegressor.__sklearn_tags__[  sm   ø€ Ø×'Ñ'Ó)ˆ	Ü‰wÑ'Ó)ˆØ)-ˆ×ÑÔ&Ü!)¨)Ó!4×!?Ñ!?×!FÑ!Fˆ�‰ÔÜ(0°Ó(;×(GÑ(G×(TÑ(Tˆ×ÑÔ%Øˆ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ÚformatrO   rP   rV   Ún_features_in_)r$   Únfes     r%   rn   z)TransformedTargetRegressor.n_features_in_c  s`   € ð
	Ü˜DÔ!ð �‰×-Ñ-Ð-øô ò 	Ü Ø<×CÑCØ—N‘N×+Ñ+óóð ð	ûð	ús   ‚# £	A ¬/AÁA c                 óØ   — t        | j                  j                  ¬«      j                  | j	                  «       t        «       j                  dd¬«      j                  dd¬«      ¬«      }|S )aj  Get metadata routing of this object.

        Please check :ref:`User Guide <metadata_routing>` on how the routing
        mechanism works.

        .. versionadded:: 1.6

        Returns
        -------
        routing : MetadataRouter
            A :class:`~sklearn.utils.metadata_routing.MetadataRouter` encapsulating
            routing information.
        )Úownerr   )ÚcallerÚcalleer   )r   Úmethod_mapping)r   rO   rP   ÚaddrU   r   )r$   Úrouters     r%   Úget_metadata_routingz/TransformedTargetRegressor.get_metadata_routings  s]   € ô   d§n¡n×&=Ñ&=Ô>×BÑBØ×)Ñ)Ó+Ü(›?ß‰S˜ eˆSÓ,ß‰S˜	¨)ˆSÓ4ð	 Có 
ˆð ˆr'   c                 ót   — | j                   €
t        «       S |rt        | j                   «      S | j                   S r#   )r   r	   r   )r$   rL   s     r%   rU   z)TransformedTargetRegressor._get_regressor‰  s/   € Ø�>‰>Ð!Ü#Ó%Ð%á(1Œu�T—^‘^Ó$ÐE°t·~±~ÐEr'   r#   )F)rP   Ú
__module__Ú__qualname__Ú__doc__r   Úcallabler!   ÚdictÚ__annotations__r&   r?   r   r   r   rc   Úpropertyrn   rw   rU   Ú__classcell__)rO   s   @r%   r   r      s»   ø… ñmñ` ! %¨Ð!3Ó4°dÐ;Ù" ;Ó/°Ð6Ø˜4Ð Ø! 4Ð(Ø#˜ñ$Ð˜Dó ð ð+ð ØØØô+ò9ñv à&+ôñJó	ðJòX-ô^ð ñ.ó ð.ò÷,Fr'   )r6   Únumpyr3   Úbaser   r   r   r   Ú
exceptionsr   Úlinear_modelr	   Úpreprocessingr
   Úutilsr   r   r   Úutils._metadata_requestsr   r   r   r   Úutils._param_validationr   Úutils._tagsr   Úutils.validationr   Ú__all__r   © r'   r%   ú<module>r�      sQ   ðó ã ç EÓ EÝ 'Ý +Ý /ß 6Ñ 6÷ó õ 1Ý "Ý .à'Ð
(€ôsF °õ sFr'   