
    {Kgi)                        d dl Zd dl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 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 d dlmZ d Zej:                  j=                  dd      ej:                  j=                  dd      d               Zej:                  j=                  dd      d        Z ej:                  j=                  dd      d        Z!ej:                  j=                  dd      ej:                  j=                  dd      d               Z"ej:                  j=                  d e#d            ej:                  j=                  dd      ej:                  j=                  ddd dgfddgfg      d                      Z$ej:                  j=                  de      d        Z%d  Z&d! Z'ej:                  j=                  dd"      d#        Z(ej:                  j=                  d$d%d&d'ejR                  d(f      d)        Z*d* Z+d+ Z,d, Z-y)-    N)assert_array_equal)KMeans)
make_blobsmake_classificationmake_regression)HistGradientBoostingRegressor)SequentialFeatureSelector)LinearRegression)LeaveOneGroupOutcross_val_score)KNeighborsClassifier)make_pipeline)StandardScaler)CSR_CONTAINERSc                      d} t        |       \  }}t        t               |       }t        j                  t
        d      5  |j                  ||       d d d        y # 1 sw Y   y xY w)N   
n_featuresn_features_to_selectz)n_features_to_select must be < n_featuresmatchr   r	   r
   pytestraises
ValueErrorfit)r   Xysfss       s/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/sklearn/feature_selection/tests/test_sequential.pytest_bad_n_features_to_selectr"      sN    Jj1DAq
#$4$6Z
XC	z)T	U1 
V	U	Us   AA'	direction)forwardbackwardr   )   r   	   autoc                 >   d}t        |d      \  }}t        t               || d      }|j                  ||       |dk(  r|dz  }|j	                  d      j
                  d   |k(  sJ |j                  |k(  sJ |j                  |      j
                  d	   |k(  sJ y )
N
   r   r   random_state   r   r#   cvr(   Tindicesr&   r   r	   r
   r   get_supportshapen_features_to_select_	transform)r#   r   r   r   r   r    s         r!   test_n_features_to_selectr7      s    
 JjqADAq
#1	C GGAqMv%)Q??4?(..q15IIII$$(<<<<==!!!$(<<<<    c                    d}d}t        |d      \  }}t        t               d|| d      }|j                  ||       |dz
  }|j	                  d	
      j
                  d   |k  sJ |j                  |k  sJ |j                  |      j
                  d   |k  sJ |j	                  d	
      j
                  d   |j                  k(  sJ y)zlCheck the behaviour of `n_features_to_select="auto"` with different
    values for the parameter `tol`.
    r*   MbP?r   r+   r(   r-   r   tolr#   r/   r&   Tr0   Nr2   )r#   r   r<   r   r   r    max_features_to_selects          r!   test_n_features_to_select_autor>   0   s     J
CjqADAq
##C GGAqM'!^??4?(..q15KKKK$$(>>>>==!!!$(>>>>??4?(..q1S5N5NNNNr8   c                 
   t        ddd      \  }}d}t        t               d|| d      }|j                  ||       |j	                  |      }t
        j                  j                  d      }t        t        t        |j                  d	               t        |j                  d
            z
        }t        j                  ||dd|j                  |      f   ddt
        j                  f   g      }|j                  t        t        |j                                     }	t        j"                  ||	d	      }
t%        t               ||d      j'                         }t%        t               ||d      j'                         }t%        t               ||d      j'                         }t%        t               |
|d      j'                         }||k\  sJ | dk(  r||z
  |k  sJ ||z
  |k\  sJ y||z
  |k  sJ ||z
  |k  sJ y)av  Check the behaviour stopping criterion for feature selection
    depending on the values of `n_features_to_select` and `tol`.

    When `direction` is `'forward'`, select a new features at random
    among those not currently selected in selector.support_,
    build a new version of the data that includes all the features
    in selector.support_ + this newly selected feature.
    And check that the cross-validation score of the model trained on
    this new dataset variant is lower than the model with
    the selected forward selected features or at least does not improve
    by more than the tol margin.

    When `direction` is `'backward'`, instead of adding a new feature
    to selector.support_, try to remove one of those selected features at random
    And check that the cross-validation score is either decreasing or
    not improving by more than the tol margin.
    2   r*   r   )r   n_informativer,   r:   r(   r-   r;   r&   Tr0   N)axis)r/   r$   )r   r	   r
   r   r6   nprandomRandomStatelistsetranger4   r3   hstackchoicenewaxisr5   deleter   mean)r#   r   r   r<   r    
selected_Xrngadded_candidatesadded_Xremoved_candidate	removed_Xplain_cv_scoresfs_cv_scoreadded_cv_scoreremoved_cv_scores                  r!   ,test_n_features_to_select_stopping_criterionrX   J   s   ( bKDAq
C
##C GGAqMq!J
))


"CCaggaj 12SQU9V5WWXiiq#**-../BJJ?	
G 

4c.G.G(H#IJ		*&7a@I$%5%7A!DIIKN"#3#5z1KPPRL$%5%7!JOOQN&'7'99aANSSU>)))I~-#555//C777-#555 </C777r8   zn_features_to_select, expected))g?r&   )g      ?r*   )g      ?r   c                     t        d      \  }}t        t               || d      }|j                  ||       |j                  |k(  sJ y )Nr*   r   r-   r.   )r   r	   r
   r   r5   )r#   r   expectedr   r   r    s         r!   test_n_features_to_select_floatr[      sN     b)DAq
#1	C GGAqM$$000r8   seedr*   z0n_features_to_select, expected_selected_featuresr-   r&   c                 &   t         j                  j                  |       }d}|j                  |d      }d|d d df   z  d|d d df   z  z
  }t	        t               ||d      }|j                  ||       t        |j                  d      |       y )	Nd      r   r*   r-   r.   Tr0   )	rC   rD   rE   randnr	   r
   r   r   r3   )	r\   r#   r   expected_selected_featuresrO   	n_samplesr   r   r    s	            r!   test_sanityrc      s     ))


%CI		)QA	AadGb1QT7l"A
#1	C GGAqMst46PQr8   csr_containerc                     t        d      \  }} | |      }t        t               dd      }|j                  ||       |j	                  |       y )Nr*   r   r(   r-   r   r/   )r   r	   r
   r   r6   )rd   r   r   r    s       r!   test_sparse_supportrg      sK     b)DAqaA
#AC GGAqMMM!r8   c                     t         j                  j                  d      } d\  }}t        ||d      \  }}| j	                  dd||ft
              }t         j                  ||<   t        t               dd      }|j                  ||       |j                  |       t        j                  t        d	      5  t        t               dd      j                  ||       d d d        y # 1 sw Y   y xY w)
Nr   )(      r,   r-   )sizedtyper(   rf   zInput X contains NaNr   )rC   rD   rE   r   randintboolnanr	   r   r   r6   r   r   r   r
   )rO   rb   r   r   r   nan_maskr    s          r!   test_nan_supportrr      s     ))


"C!Iz9jqADAq{{1ay*&=T{JH&&AhK
#%'fC GGAqMMM!	z)?	@!V	

#a)	 
A	@	@s   8'C((C1c                  d   d\  } }t        | |d      \  }}t        t               t                     }t	        |dd      }|j                  ||       |j                  |       t	        t               dd      }t        t               |      }|j                  ||       |j                  |       y )N)r@   r_   r   rk   r(   r-   rf   )r   r   r   r
   r	   r   r6   )rb   r   r   r   piper    s         r!   test_pipeline_supportru      s     "Iz9jqADAq )+;+=>D
#Dv!
LCGGAqMMM! $AC )3/DHHQNNN1r8   )r-   r_   c                     t        d      \  }}t        t        d      |       }|j                  |       |j	                  |      j
                  d   | k(  sJ y )Nrj   r   r&   )n_initr   )r   r	   r   r   r6   r4   )r   r   r   r    s       r!   test_unsupervised_model_fitrx      sW    
 #DAq
#a1C GGAJ==!!!$(<<<<r8   r   no_validationy              ?gX@r_   c                     t        d      \  }}t        t               d      }t        j                  t
        t        f      5  |j                  ||        d d d        y # 1 sw Y   y xY w)N   r   r_   r   )r   r	   r   r   r   	TypeErrorr   r   )r   r   clustersr    s       r!   test_no_y_validation_model_fitr~     sP     *KAx
#C
 
	:.	/1 
0	/	/s   A  A)c                      t        dd      \  } }t        t               ddd      }t        j                  t
        d	      5  |j                  | |       d
d
d
       y
# 1 sw Y   y
xY w)z?Check that we raise an error when tol<0 and direction='forward'r*   r   r+   r(   r$   MbPr   r#   r<   ztol must be strictly positiver   Nr   )r   r   r    s      r!   test_forward_neg_tol_errorr     sV    bq9DAq
##	C 
z)H	I1 
J	I	Is   AA(c                     t        dd      \  } }t               }|j                  | |      j                  | |      }t	        |ddd      }|j                  | |      }|j                  ||      j                  ||      }d|j                         j                         cxk  r| j                  d   k  sJ  J ||k  sJ y	)
z`Check that SequentialFeatureSelector works negative tol

    non-regression test for #25525
    r*   r   r+   r(   r%   r   r   r&   N)	r   r
   r   scorer	   fit_transformr3   sumr4   )r   r   lrinitial_scorer    Xr	new_scores          r!   test_backward_neg_tolr     s    
 bq9DAq		BFF1aL&&q!,M
#
#	C 
		1a	 Br1##B*Is $$&333333}$$$r8   c                     t        d      \  } }t        j                  |t              }d||j                  dz  d t               }|j                  | ||      }t        d	      }t        |d|
      }|j                  | |       y)z\Check that no exception raised when cv is generator

    non-regression test for #25957
    r   rk   )rm   r&   r-   N)groupsr   )n_neighborsrf   )
r   rC   
zeros_likeintrl   r   splitr   r	   r   )r   r   r   r/   splitskncr    s          r!   test_cv_generator_supportr   3  sw    
 A.DAq]]1C(FF166Q;=		BXXa6X*F
1
-C
#CaF
KCGGAqMr8   ).numpyrC   r   numpy.testingr   sklearn.clusterr   sklearn.datasetsr   r   r   sklearn.ensembler   sklearn.feature_selectionr	   sklearn.linear_modelr
   sklearn.model_selectionr   r   sklearn.neighborsr   sklearn.pipeliner   sklearn.preprocessingr   sklearn.utils.fixesr   r"   markparametrizer7   r>   rX   r[   rH   rc   rg   rr   ru   rx   rp   r~   r   r   r    r8   r!   <module>r      s     , " M M : ? 1 E 2 * 0 . &=>/1BC= D ?=* &=>O ?O2 &=>:8 ?:8z &=>$
1 ?
1 r+&=>6	
QF	
QCR ? ,R( .9	 :	*, /8
= 9
= D"&&!DE
 F
%,r8   