
    /ii,9                         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dS )    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                L    || _         || _        || _        || _        || _        d S Nr   )selfr   r   r   r   r   s         ]/var/www/html/bet.cuttalo.com/ml/venv/lib/python3.11/site-packages/sklearn/compose/_target.py__init__z#TransformedTargetRegressor.__init__   s0     #&	(*    c           	          | j         | j        | j        t          d          | j         t	          | j                   | _        n| j        | j        | j        .| j        '| j        dnd\  }}t          d| d| d| d          t          | j        | j        d	| j        
          | _        | j                            d           | j        	                    |           | j        rt          ddt          d|j        d         dz                      }t          ||          }| j                            |          }t          j        || j                            |                    st%          j        dt(                     dS dS dS )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    'I!T%6%BW   ) %d&6 7 7D	%$*;*C	!d&7&C y( -,1 .~
 !M^ M M] M M(5M M M  
 !4Y!."0	! ! !D ((9(===
 	a    	 tSAGAJ"4D-E-EFFL"1l33E'11%88G;ud&7&I&I'&R&RSS 	6
      	 		 	r&   F)prefer_skip_nested_validationc           	         |t          d| j        j         d          t          |dddddd          }|j        | _        |j        d	k    r|                    d
d	          }n|}|                     |           | j        	                    |          }|j        dk    r2|j
        d	         d	k    r!| j        d	k    r|                    d	          }|                     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.
        NzThis z= estimator requires y to be passed, but the target y is None.r8   FTnumeric)
input_nameaccept_sparseensure_all_finite	ensure_2ddtypeallow_ndr*      axis)	get_cloner   )r   r   feature_names_in_)r,   	__class____name__r   ndim_training_dimreshaper>   r-   r   r1   squeeze_get_regressor
regressor_r   r   r
   r   r   hasattrrN   )r#   Xr8   
fit_paramsy_2dy_transrouted_paramss          r$   r   zTransformedTargetRegressor.fit   s   @ 9E/ E E E   "
 
 
 V 6Q;;99R##DDDd### #--d33 <1q!1Q!6!64;MQR;R;Roo1o--G---== 	C+D%FF:FFMM!Ej,A,A,ABBBMAwFF-*A*EFFF4?$788 	G%)_%FD"r&   c                    t          |            t                      rt          | dfi |}nt          t          |                    } | j        j        |fi |j        j        }|j        dk    r/| j        	                    |
                    dd                    }n| j        	                    |          }| j        dk    r2|j        dk    r'|j        d         dk    r|                    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*   rH   rI   rJ   )r   r   r   r
   rV   r   r   rQ   r-   r4   rS   rR   r1   rT   )r#   rX   predict_paramsr\   pred
pred_transs         r$   r   z"TransformedTargetRegressor.predict,  s   6 	 	K+D)NN~NNMM!E.,I,I,IJJJM&t&qLLM,C,KLL9>>*<<T\\"a=P=PQQJJ*<<TBBJ!##1$$ #q((#+++33Jr&   c                    |                                  }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__[  sj    ''))	ww'')))-&!))!4!4!?!F(0(;(;(G(T%r&   c                     	 t          |            n?# t          $ r2}t          d                    | j        j                            |d}~ww xY w| j        j        S )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  sv    
	D!!!! 	 	 	 <CCN+   		 --s    
A-A		Ac                     t          |                               |                                 t                                          dd                              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   addrU   r   )r#   routers     r$   get_metadata_routingz/TransformedTargetRegressor.get_metadata_routings  sh      d+++//))++(??SeS,,S	)S44	 0 
 
 r&   c                 f    | j         t                      S |rt          | j                   n| j         S r"   )r   r   r   )r#   rL   s     r$   rU   z)TransformedTargetRegressor._get_regressor  s2    >!#%%%(1EuT^$$$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      sr        m m` !j%!344d;"
;//64 !4(#$ $D    + + + + + +9 9 9v \&+  J J	 JX- - -^     . . X.  ,F F F F F F F Fr&   )r5   numpyr2   sklearn.baser   r   r   r   sklearn.exceptionsr   sklearn.linear_modelr   sklearn.preprocessingr	   sklearn.utilsr
   r   r    sklearn.utils._metadata_requestsr   r   r   r   sklearn.utils._param_validationr   sklearn.utils._tagsr   sklearn.utils.validationr   __all__r    r&   r$   <module>r      sZ        K K K K K K K K K K K K - - - - - - 1 1 1 1 1 1 5 5 5 5 5 5 < < < < < < < < < <            7 6 6 6 6 6 ( ( ( ( ( ( 4 4 4 4 4 4'
(sF sF sF sF sF sF sF sF sF sFr&   