
    {Kg=-                         d Z ddlmZmZ ddlZddlmZmZm	Z	m
Z
mZ ddlmZ ddl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dlmZ  G d deeee      Zy)z
Sequential feature selection
    )IntegralRealN   )BaseEstimatorMetaEstimatorMixin_fit_contextcloneis_classifier)get_scorer_names)check_cvcross_val_score)
HasMethodsInterval
RealNotInt
StrOptions)
_safe_tags)_RoutingNotSupportedMixin)check_is_fitted   )SelectorMixinc                      e Zd ZU dZ edg      g edh       eeddd       eeddd	      gd ee	ddd	      g ed
dh      gd e e
 e                   egdgdegdZeed<   ddd
dddddZ ed      dd       Zd Zd Zd Zy)SequentialFeatureSelectora  Transformer that performs Sequential Feature Selection.

    This Sequential Feature Selector adds (forward selection) or
    removes (backward selection) features to form a feature subset in a
    greedy fashion. At each stage, this estimator chooses the best feature to
    add or remove based on the cross-validation score of an estimator. In
    the case of unsupervised learning, this Sequential Feature Selector
    looks only at the features (X), not the desired outputs (y).

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

    .. versionadded:: 0.24

    Parameters
    ----------
    estimator : estimator instance
        An unfitted estimator.

    n_features_to_select : "auto", int or float, default="auto"
        If `"auto"`, the behaviour depends on the `tol` parameter:

        - if `tol` is not `None`, then features are selected while the score
          change does not exceed `tol`.
        - otherwise, half of the features are selected.

        If integer, the parameter is the absolute number of features to select.
        If float between 0 and 1, it is the fraction of features to select.

        .. versionadded:: 1.1
           The option `"auto"` was added in version 1.1.

        .. versionchanged:: 1.3
           The default changed from `"warn"` to `"auto"` in 1.3.

    tol : float, default=None
        If the score is not incremented by at least `tol` between two
        consecutive feature additions or removals, stop adding or removing.

        `tol` can be negative when removing features using `direction="backward"`.
        `tol` is required to be strictly positive when doing forward selection.
        It can be useful to reduce the number of features at the cost of a small
        decrease in the score.

        `tol` is enabled only when `n_features_to_select` is `"auto"`.

        .. versionadded:: 1.1

    direction : {'forward', 'backward'}, default='forward'
        Whether to perform forward selection or backward selection.

    scoring : str or callable, default=None
        A single str (see :ref:`scoring_parameter`) or a callable
        (see :ref:`scoring`) to evaluate the predictions on the test set.

        NOTE that when using a custom scorer, it should return a single
        value.

        If None, the estimator's score method is used.

    cv : int, cross-validation generator or an iterable, default=None
        Determines the cross-validation splitting strategy.
        Possible inputs for cv are:

        - None, to use the default 5-fold cross validation,
        - integer, to specify the number of folds in a `(Stratified)KFold`,
        - :term:`CV splitter`,
        - An iterable yielding (train, test) splits as arrays of indices.

        For integer/None inputs, if the estimator is a classifier and ``y`` is
        either binary or multiclass,
        :class:`~sklearn.model_selection.StratifiedKFold` is used. In all other
        cases, :class:`~sklearn.model_selection.KFold` is used. These splitters
        are instantiated with `shuffle=False` so the splits will be the same
        across calls.

        Refer :ref:`User Guide <cross_validation>` for the various
        cross-validation strategies that can be used here.

    n_jobs : int, default=None
        Number of jobs to run in parallel. When evaluating a new feature to
        add or remove, the cross-validation procedure is parallel over the
        folds.
        ``None`` means 1 unless in a :obj:`joblib.parallel_backend` context.
        ``-1`` means using all processors. See :term:`Glossary <n_jobs>`
        for more details.

    Attributes
    ----------
    n_features_in_ : int
        Number of features seen during :term:`fit`. Only defined if the
        underlying estimator 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

    n_features_to_select_ : int
        The number of features that were selected.

    support_ : ndarray of shape (n_features,), dtype=bool
        The mask of selected features.

    See Also
    --------
    GenericUnivariateSelect : Univariate feature selector with configurable
        strategy.
    RFE : Recursive feature elimination based on importance weights.
    RFECV : Recursive feature elimination based on importance weights, with
        automatic selection of the number of features.
    SelectFromModel : Feature selection based on thresholds of importance
        weights.

    Examples
    --------
    >>> from sklearn.feature_selection import SequentialFeatureSelector
    >>> from sklearn.neighbors import KNeighborsClassifier
    >>> from sklearn.datasets import load_iris
    >>> X, y = load_iris(return_X_y=True)
    >>> knn = KNeighborsClassifier(n_neighbors=3)
    >>> sfs = SequentialFeatureSelector(knn, n_features_to_select=3)
    >>> sfs.fit(X, y)
    SequentialFeatureSelector(estimator=KNeighborsClassifier(n_neighbors=3),
                              n_features_to_select=3)
    >>> sfs.get_support()
    array([ True, False,  True,  True])
    >>> sfs.transform(X).shape
    (150, 3)
    fitautor   r   right)closedNneitherforwardbackward	cv_object	estimatorn_features_to_selecttol	directionscoringcvn_jobs_parameter_constraints   )r#   r$   r%   r&   r'   r(   c                f    || _         || _        || _        || _        || _        || _        || _        y Nr!   )selfr"   r#   r$   r%   r&   r'   r(   s           i/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/sklearn/feature_selection/_sequential.py__init__z"SequentialFeatureSelector.__init__   s6     #$8!"    F)prefer_skip_nested_validationc           	         | j                         }| j                  |dd|j                  dd             }|j                  d   }| j                  dk(  r"| j
                  |dz
  | _        n|dz  | _        n}t        | j                  t              r,| j                  |k\  rt        d	      | j                  | _        n7t        | j                  t              rt        || j                  z        | _        | j
                  )| j
                  d
k  r| j                  dk(  rt        d      t        | j                  |t        | j                               }t#        | j                         }t%        j&                  |t(              }| j                  dk(  s| j                  dk(  r| j                  n|| j                  z
  }t$        j*                   }	| j
                  duxr | j                  dk(  }
t-        |      D ]7  }| j/                  |||||      \  }}|
r||	z
  | j
                  k  r n	|}	d||<   9 | j                  dk(  r| }|| _        | j0                  j3                         | _        | S )a  Learn the features to select from X.

        Parameters
        ----------
        X : array-like of shape (n_samples, n_features)
            Training vectors, where `n_samples` is the number of samples and
            `n_features` is the number of predictors.

        y : array-like of shape (n_samples,), default=None
            Target values. This parameter may be ignored for
            unsupervised learning.

        Returns
        -------
        self : object
            Returns the instance itself.
        cscr   	allow_nanT)accept_sparseensure_min_featuresforce_all_finiter   r   Nz*n_features_to_select must be < n_features.r   r   z:tol must be strictly positive when doing forward selection)
classifier)shapedtyper   )	_get_tags_validate_datagetr9   r#   r$   n_features_to_select_
isinstancer   
ValueErrorr   intr%   r   r'   r
   r"   r	   npzerosboolinfrange_get_best_new_feature_scoresupport_sum)r-   Xytags
n_featuresr'   cloned_estimatorcurrent_maskn_iterations	old_scoreis_auto_select_new_feature_idx	new_scores                 r.   r   zSequentialFeatureSelector.fit   s=   , ~~ !!%+t!<<	   
 WWQZ
$$.xx# .8!^*-71_*118<((J6 !MNN)-)B)BD&1148),Z$:S:S-S)TD&88DHHqLT^^y5PL  dggq]4>>-JK 0
 xxj= ((F2dnn	6Q &&d888 	 VVG	-U$2K2Kv2U|$A)-)I)I !QL*&OY I	$9TXX#E!I,0L) % >>Z'(=L$%)]]%6%6%8"r0   c           	      <   t        j                  |       }i |D ]h  }|j                         }d||<   | j                  dk(  r| }|d d |f   }	t	        ||	||| j
                  | j                        j                         |<   j t        fd      }
|
|
   fS )NTr   )r'   r&   r(   c                     |    S r,    )feature_idxscoress    r.   <lambda>zGSequentialFeatureSelector._get_best_new_feature_score.<locals>.<lambda>&  s
    f[>Qr0   key)	rB   flatnonzerocopyr%   r   r&   r(   meanmax)r-   r"   rJ   rK   r'   rO   candidate_feature_indicesrY   candidate_maskX_newrT   rZ   s              @r.   rG   z5SequentialFeatureSelector._get_best_new_feature_score  s     %'NNL=$A!4K)..0N*.N;'~~+"0a'(E"1{{# df ; 5 f*QR 777r0   c                 0    t        |        | j                  S r,   )r   rH   r-   s    r.   _get_support_maskz+SequentialFeatureSelector._get_support_mask)  s    }}r0   c                 4    dt        | j                  d      iS )Nr4   r\   )r   r"   rf   s    r.   
_more_tagsz$SequentialFeatureSelector._more_tags-  s    DNND
 	
r0   r,   )__name__
__module____qualname____doc__r   r   r   r   r   r   setr   callabler)   dict__annotations__r/   r   r   rG   rg   ri   rX   r0   r.   r   r      s    CL !%)*x ZAg6Xq$y9!

 htT4	BC )Z!89:*S)9);%<=xHm"$D $ $& &+N	N`82
r0   r   )rm   numbersr   r   numpyrB   baser   r   r   r	   r
   metricsr   model_selectionr   r   utils._param_validationr   r   r   r   utils._tagsr   utils.metadata_routingr   utils.validationr   _baser   r   rX   r0   r.   <module>r|      sF    #  X X & 7 R R $ > .  ]
}.@-]
r0   