
    _ndK                     "   d Z ddlmZ ddlZddlZddl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 ddlmZmZ dd	lmZ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% ddl&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddlm0Z0 ddlm1Z1  G d d          Z2d Z3d Z4d Z5d Z6d Z7d Z8d Z9d  Z:d! Z;d" Z<d# Z=d$ Z>d% Z?d& Z@ejA        B                    d' ed(          d(g          ejA        B                    d)ed*fed+fg          d,                         ZCejA        B                    d-d.eDfd/eEfd0 eEfg          ejA        B                    d1eeg          d2                         ZFejA        B                    d3dd*g          d4             ZGd5 ZHd6 ZIejA        B                    d7eeg          d8             ZJejA        B                    d7eeg          ejA        B                    d9eeeg          d:                         ZKdS );z'
Testing Recursive feature elimination
    )
attrgetterN)assert_array_almost_equalassert_array_equalassert_allclose)sparse)BaseEstimatorClassifierMixin)PLSCanonicalPLSRegressionCCA)RFERFECV)	load_irismake_friedman1)zero_one_loss)SVCSVR	LinearSVR)LogisticRegression)RandomForestClassifier)cross_val_score)
GroupKFold)TransformedTargetRegressor)make_pipeline)StandardScaler)check_random_state)ignore_warnings)make_scorer)
get_scorerc                   N    e Zd ZdZddZd Zd ZeZeZeZ	ddZ
dd	Zd
 Zd ZdS )MockClassifierz@
    Dummy classifier to test recursive feature elimination
    r   c                     || _         d S N	foo_param)selfr%   s     Hlib/python3.11/site-packages/sklearn/feature_selection/tests/test_rfe.py__init__zMockClassifier.__init__&   s    "    c                     t          |          t          |          k    sJ t          j        |j        d         t          j                  | _        | S )N   )dtype)lennponesshapefloat64coef_r&   Xys      r'   fitzMockClassifier.fit)   sB    1vvQWQWQZrz:::
r)   c                     |j         d         S )Nr   )r0   )r&   Ts     r'   predictzMockClassifier.predict.   s    wqzr)   Nc                     dS )Ng         r3   s      r'   scorezMockClassifier.score5       sr)   Tc                     d| j         iS )Nr%   r$   )r&   deeps     r'   
get_paramszMockClassifier.get_params8   s    T^,,r)   c                     | S r#   r;   )r&   paramss     r'   
set_paramszMockClassifier.set_params;   s    r)   c                 
    ddiS )N	allow_nanTr;   )r&   s    r'   
_more_tagszMockClassifier._more_tags>   s    T""r)   )r   )NN)T)__name__
__module____qualname____doc__r(   r6   r9   predict_probadecision_function	transformr<   r@   rC   rF   r;   r)   r'   r!   r!   !   s         # # # #  
   MI   - - - -  # # # # #r)   r!   c                  f   t          d          } t                      }t          j        |j        |                     t          |j                  df          f         }|j        }t          d| d          }t          |dd	          }|
                    ||           t          |j                  |j        d
         k    sJ t          d          }t          |dd	          }|
                    ||           t          |                                |                                           d S )Nr      size      )n_estimatorsrandom_state	max_depth   皙?	estimatorn_features_to_selectstepr+   linearkernel)r   r   r.   c_datanormalr-   targetr   r   r6   ranking_r0   r   r   get_support)	generatoririsr4   r5   clfrfeclf_svcrfe_svcs           r'   test_rfe_features_importancerl   B   s   "1%%I;;D 	di))DI/B)CCCDAA
 byTU
V
V
VC
!#
>
>
>CGGAqMMMs|
****"""GG!#FFFGKK1 s(('*=*=*?*?@@@@@r)   c                  H   t          d          } t                      }t          j        |j        |                     t          |j                  df          f         }t          j        |          }|j	        }t          d          }t          |dd          }|                    ||           |                    |          }|                    ||           t          |j                  |j        d	         k    sJ t          d          }t          |dd          }	|	                    ||           |	                    |          }
|j        |j        j        k    sJ t!          |d d
         |j        d d
                    t!          |                    |          |                    |j                             |                    ||          |                    |j        |j	                  k    sJ t!          ||
                                           d S )Nr   rO   rP   r]   r^   rW   rX   rY   r+   
   )r   r   r.   r`   ra   rb   r-   r   
csr_matrixrc   r   r   r6   rM   rd   r0   r   r9   r<   toarray)rf   rg   r4   X_sparser5   rh   ri   X_r
clf_sparse
rfe_sparse
X_r_sparses              r'   test_rferv   W   s   "1%%I;;D 	di))DI/B)CCCDA ##HA X


C
!#
>
>
>CGGAqMMM
--

CGGCOOOs|
**** H%%%JzLLLJNN8Q%%h//J9	''''c#2#h	#2#777ckk!nnckk$).D.DEEE99Q??cii	4;??????c:#5#5#7#788888r)   c                      G d dt           t                    } t          d          \  }}t          j        t
          d          5  t           |                                           ||           d d d            n# 1 swxY w Y   t          j        t
          d          5  t           |                                           ||d	
                              ||           d d d            n# 1 swxY w Y   t           |                                           ||d	
                              ||d	
           d S )Nc                       e Zd ZddZddZdS )0test_RFE_fit_score_params.<locals>.TestEstimatorNc                     |t          d          t          d                              ||          | _        | j        j        | _        | S )Nfit: prop cannot be Noner]   r^   )
ValueErrorr   r6   svc_r2   r&   r4   r5   props       r'   r6   z4test_RFE_fit_score_params.<locals>.TestEstimator.fitz   sH    | !;<<<8,,,00A66DIDJKr)   c                 Z    |t          d          | j                            ||          S )Nscore: prop cannot be None)r|   r}   r<   r~   s       r'   r<   z6test_RFE_fit_score_params.<locals>.TestEstimator.score   s,    | !=>>>9??1a(((r)   r#   )rG   rH   rI   r6   r<   r;   r)   r'   TestEstimatorry   y   s<        	 	 	 		) 	) 	) 	) 	) 	)r)   r   T
return_X_yr{   )matchrZ   r   foo)r   )	r   r	   r   pytestraisesr|   r   r6   r<   )r   r4   r5   s      r'   test_RFE_fit_score_paramsr   v   s   ) ) ) ) ) ) ) ) %%%DAq	z)C	D	D	D 1 1mmoo&&&**1a0001 1 1 1 1 1 1 1 1 1 1 1 1 1 1	z)E	F	F	F I Immoo&&&**1ae*<<BB1aHHHI I I I I I I I I I I I I I I --//"""&&q!%&88>>q!%>PPPPPs%   -BBB'AC66C:=C:c                     t          d          } t                      }t          j        |j        |                     t          |j                  df          f         }|j        }t          d          }t          |dd          }|
                    ||           t          |d	d          }|
                    ||           t          |j        |j                   t          |j        |j                   d S )
Nr   rO   rP   r]   r^   rW   rX   rY   g?)r   r   r.   r`   ra   rb   r-   rc   r   r   r6   r   rd   support_)rf   rg   r4   r5   rh   rfe_numrfe_percs          r'   test_rfe_percent_n_featuresr      s    "1%%I;;D 	di))DI/B)CCCDAA
X


CCacBBBGKK1SsEEEHLLAx('*:;;;x('*:;;;;;r)   c                  
   t          d          } t                      }t          j        |j        |                     t          |j                  df          f         }|j        }t                      }t          |dd          }|
                    ||           |                    |          }|
                    ||           t          |j                  |j        d         k    sJ |j        |j        j        k    sJ d S )Nr   rO   rP   rW   rX   rY   r+   )r   r   r.   r`   ra   rb   r-   rc   r!   r   r6   rM   rd   r0   )rf   rg   r4   r5   rh   ri   rr   s          r'   test_rfe_mockclassifierr      s    "1%%I;;D 	di))DI/B)CCCDAA 

C
!#
>
>
>CGGAqMMM
--

CGGCOOOs|
****9	''''''r)   c                  	   t          d          } t                      }t          j        |j        |                     t          |j                  df          f         }t          |j                  }t          t          d          d          }|                    ||           |j                                        D ]-}t          |j        |                   |j        d         k    sJ .t          |j                  |j        d         k    sJ |                    |          }t#          ||j                   t          t          d          d          }t%          j        |          }|                    ||           |                    |          }	t#          |	                                |j                   t+          t,          d	          }
t          t          d          d|

          } t/          |j                  ||           |                    |          }t#          ||j                   t1          d          }t          t          d          d|
          }|                    ||           |                    |          }t#          ||j                   d }t          t          d          d|
          }|                    ||           |j        dk    sJ t          t          d          d          }|                    ||           |j                                        D ]"}t          |j        |                   dk    sJ #t          |j                  |j        d         k    sJ |                    |          }t#          ||j                   t          t          d          d          }t%          j        |          }|                    ||           |                    |          }	t#          |	                                |j                   t          t          d          d          }t%          j        |          }|                    ||           |                    |          }	t#          |	                                |j                   d S )Nr   rO   rP   r]   r^   r+   rZ   r\   F)greater_is_better)rZ   r\   scoringaccuracyc                     dS )Ng      ?r;   )rZ   r4   r5   s      r'   test_scorerztest_rfecv.<locals>.test_scorer   r=   r)   rS   皙?)r   r   r.   r`   ra   rb   r-   listrc   r   r   r6   cv_results_keysr0   rd   rM   r   r   ro   rp   r   r   r   r   n_features_)rf   rg   r4   r5   rfecvkeyrr   rfecv_sparserq   ru   r   scorerr   s                r'   
test_rfecvr      sa   "1%%I;;D 	di))DI/B)CCCDAT[A Cx000q999E	IIaOOO  %%'' 9 95$S)**agaj88888u~!'!*,,,,
//!

C sDI&&& 3h#7#7#7a@@@L ##HXq!!!''11Jz))++TY777 -5AAAGCx000q'JJJEOEIq!$$$
//!

CsDI&&& 
##FCx000q&IIIE	IIaOOO
//!

CsDI&&&   Cx000q+NNNE	IIaOOO !!!! Cx000q999E	IIaOOO %%'' 0 05$S)**a/////u~!'!*,,,,
//!

CsDI&&&3h#7#7#7a@@@L ##HXq!!!''11Jz))++TY777 3h#7#7#7cBBBL ##HXq!!!''11Jz))++TY77777r)   c                  (   t          d          } t                      }t          j        |j        |                     t          |j                  df          f         }t          |j                  }t          t                      d          }|                    ||           |j                                        D ]-}t          |j        |                   |j        d         k    sJ .t          |j                  |j        d         k    sJ d S )Nr   rO   rP   r+   r   )r   r   r.   r`   ra   rb   r-   r   rc   r   r!   r6   r   r   r0   rd   )rf   rg   r4   r5   r   r   s         r'   test_rfecv_mockclassifierr     s    "1%%I;;D
di))DI/B)CCCDAT[A N,,1555E	IIaOOO  %%'' 9 95$S)**agaj88888u~!'!*,,,,,,r)   c                     ddl m}  dd l} |             |_        t	          d          }t                      }t          j        |j        |	                    t          |j                  df          f         }t          |j                  }t          t          d          dd          }|                    ||           |j        }|                    d           t          |                                          dk    sJ d S )	Nr   )StringIOrO   rP   r]   r^   r+   )rZ   r\   verbose)ior   sysstdoutr   r   r.   r`   ra   rb   r-   r   rc   r   r   r6   seekreadline)r   r   rf   rg   r4   r5   r   verbose_outputs           r'   test_rfecv_verbose_outputr     s    JJJCJ"1%%I;;D
di))DI/B)CCCDAT[ACx000q!DDDE	IIaOOOZN~&&(())A------r)   c                    t          |           }t                      }t          j        |j        |                    t          |j                  df          f         }t          |j                  }ddgddgddgfD ]\  }}t          t                      ||          }|                    ||           t          j        |j        d         |z
  |z            dz   }|j                                        D ]"}	t          |j        |	                   |k    sJ #t          |j                  |j        d         k    sJ |j        |k    sJ d S )NrO   rP   rS   r+      )rZ   r\   min_features_to_select)r   r   r.   r`   ra   rb   r-   r   rc   r   r!   r6   ceilr0   r   r   rd   r   )
global_random_seedrf   rg   r4   r5   r\   r   r   	score_lenr   s
             r'   test_rfecv_cv_results_sizer   +  sc   "#566I;;D
di))DI/B)CCCDAT[A +,Q!Q!Q(@ ; ;$$$&&#9
 
 

 			!QGQWQZ*@@DHIIAM	$))++ 	< 	<Cu(-..);;;;;5>""agaj0000 $::::::; ;r)   c                      t          t          d                    } | j        dk    sJ t                      }t	          | |j        |j                  }|                                dk    sJ d S )Nr]   r^   
classifiergffffff?)r   r   _estimator_typer   r   ra   rc   min)ri   rg   r<   s      r'   test_rfe_estimator_tagsr   D  sk    
c"""
#
#C,....;;DCDK88E99;;r)   c                    d}t          d||           \  }}|j        \  }}t          d          }t          |d          }|                    ||          }|j                                        |dz  k    sJ t          |d	          }|                    ||          }|j                                        |dz  k    sJ t          |d
          }|                    ||          }|j                                        |dz  k    sJ d S )Nrn   2   	n_samples
n_featuresrU   r]   r^   g{Gz?r\   rS   r      )r   r0   r   r   r6   r   sum)r   r   r4   r5   r   rZ   selectorsels           r'   test_rfe_min_stepr   M  s)   J:L  DAq GIz8$$$I 94(((H
,,q!

C<q0000 94(((H
,,q!

C<q0000 91%%%H
,,q!

C<q000000r)   c                 4   d }d }ddg}ddg}ddg}t          |||          D ]\  }}}t          |           }	|	                    d|f          }
|	                    d                                          }t          t          d	          ||
          }|                    |
|           t          j	        |j
                   ||||          k    sJ t          j	        |j
                   ||||          k    sJ d}ddg}ddg}t          ||          D ]\  }}t          |           }	|	                    d|f          }
|	                    d                                          }t          t          d	          |          }|                    |
|           |j                                        D ]X}t          |j        |                    ||||          k    sJ t          |j        |                    ||||          k    sJ Yd S )Nc                 $    d| |z   |z
  dz
  |z  z   S Nr+   r;   r   r[   r\   s      r'   formula1z4test_number_of_subsets_of_features.<locals>.formula1n  s"    Z$&)==AdJKKr)   c                 V    dt          j        | |z
  t          |          z            z   S r   )r.   r   floatr   s      r'   formula2z4test_number_of_subsets_of_features.<locals>.formula2q  s(    27J)==tLMMMMr)      r   rS   d   rP   r]   r^   rY   r+   rn   r   )zipr   rb   randroundr   r   r6   r.   maxrd   r   r   r   r-   )r   r   r   n_features_listn_features_to_select_list	step_listr   r[   r\   rf   r4   r5   ri   r   r   s                  r'   "test_number_of_subsets_of_featuresr   e  s   L L LN N N 2hO!"AAI252I3 3 X X.
($ ''9::	3
"344NN3%%''***!5
 
 

 	1vcl##xx
<PRV'W'WWWWWvcl##xx
<PRV'W'WWWWWW 2hOAI;;  
D&'9::	3
"344NN3%%''8 4 4 44@@@		!Q$))++ 	 	Cu(-..((0$3 3     u(-..((0$3 3     		 r)   c                    t          |           }t                      }t          j        |j        |                    t          |j                  df          f         }|j        }t          t          d                    }|
                    ||           |j        }|j        }|                    d           |
                    ||           t          |j        |           |                                |j                                        k    sJ |                                D ]-}||         t!          j        |j        |                   k    sJ .d S )NrO   rP   r]   r^   r   rS   )n_jobs)r   r   r.   r`   ra   rb   r-   rc   r   r   r6   rd   r   rC   r   r   r   approx)	r   rf   rg   r4   r5   r   rfecv_rankingrfecv_cv_results_r   s	            r'   test_rfe_cv_n_jobsr     sG   "#566I;;D
di))DI/B)CCCDAACx000111E	IIaOOONM)	A	IIaOOOenm<<<!!##u'8'='='?'????? %%'' O O %u7H7M)N)NNNNNNO Or)   c            	         t          d          } t                      }d}t          j        t          j        d|t          |j                                      }|j        }|j        dk                        t                    }t          t          |           ddt          d                    }|                    |||	           |j        dk    sJ d S )
Nr   rW   rU   r+   r   rS   )n_splits)rZ   r\   r   cv)groups)r   r   r.   floorlinspacer-   rc   ra   astypeintr   r   r   r6   r   )rf   rg   number_groupsr   r4   r5   
est_groupss          r'   test_rfe_cv_groupsr     s    "1%%I;;DMXbk!]C4D4DEEFFF	A	q  %%A(i@@@q!!!	  J NN1aN'''!A%%%%%%r)   importance_getterzregressor_.coef_zselector, expected_n_featuresr   rW   c                     t          ddd          \  }}t          d          }t          |t          j        t          j                  } |||           }|                    ||          }|j                                        |k    sJ d S )Nr   rn   r   r   r   	regressorfuncinverse_funcr   )	r   r   r   r.   logexpr6   r   r   )r   r   expected_n_featuresr4   r5   rZ   log_estimatorr   s           r'   test_rfe_wrapped_estimatorr     s     B2AFFFDAqq)))I."&rv  M x9JKKKH
,,q!

C<!4444444r)   zimportance_getter, err_typeautorandomc                     | j         S r#   )
importance)xs    r'   <lambda>r     s    1< r)   Selectorc                 8   t          ddd          \  }}t                      }t          |t          j        t          j                  }t          j        |          5   |||           }|                    ||           d d d            d S # 1 swxY w Y   d S )Nr   rn   *   r   r   r   )	r   r   r   r.   r   r   r   r   r6   )r   err_typer   r4   r5   rZ   r   models           r'   %test_rfe_importance_getter_validationr    s     B2BGGGDAqI."&rv  M 
x	 	   :KLLL		!Q                 s   $BBBr   c                 L   t                      }|j        }|j        }t          j        |d         d<   t          j        |d         d<   t                      }| t          ||           }nt          |          }|	                    ||           |
                    |           d S )Nr   r+   )rZ   r   r   )r   ra   rc   r.   NaNInfr!   r   r   r6   rM   )r   rg   r4   r5   rh   ri   s         r'   test_rfe_allow_nan_inf_in_xr    s    ;;D	AA fAaDGfAaDG


C	~cb)))C   GGAqMMMMM!r)   c                     t          t                      t                                } t          d          \  }}t	          | dd          }|                    ||           |                    |          j        d         dk    sJ d S )NTr   rS   z$named_steps.logisticregression.coef_)r[   r   r+   )r   r   r   r   r   r6   rM   r0   )pipelinera   r5   sfms       r'   test_w_pipeline_2d_coef_r	    s    ^--/A/C/CDDH4(((GD!
@  C GGD!==$Q'1,,,,,,r)   c                   
 t          |           }t                      }t          j        |j        |                    t          |j                  df          f         }|j        }t          t          d                    


                    ||           t          
j                  dz
  }d t          |          D             }t          j        
fd|D                       }t          j        |d	
          }t          j        |d	
          }	t!          
j        d         |           t!          
j        d         |	           d S )NrO   rP   r]   r^   r   rS   c                     g | ]}d | d	S )split_test_scorer;   ).0is     r'   
<listcomp>z+test_rfecv_std_and_mean.<locals>.<listcomp>  s$    FFFQ(!(((FFFr)   c                 *    g | ]}j         |         S r;   )r   )r  r   r   s     r'   r  z+test_rfecv_std_and_mean.<locals>.<listcomp>!  s!    IIIsE-c2IIIr)   r   )axismean_test_scorestd_test_score)r   r   r.   r`   ra   rb   r-   rc   r   r   r6   r   rangeasarraymeanstdr   )r   rf   rg   r4   r5   n_split_keys
split_keys	cv_scoresexpected_meanexpected_stdr   s             @r'   test_rfecv_std_and_meanr    s2   "#566I;;D
di))DI/B)CCCDAACx000111E	IIaOOOu())A-LFF%2E2EFFFJ
IIIIjIIIJJIGIA...M6)!,,,LE%&78-HHHE%&67FFFFFr)   ClsRFEc                     t           j                            d          }t           j                            dd          }t	          d          } | |          }|                    ||           d S )N)rn   r   rP   rS   )rn   rS   r   )rT   )r.   r   rb   randintr   r6   )r  r4   r5   rh   rfe_tests        r'   test_multioutputr#  )  sk    
	g&&A
	!'**A
 a
0
0
0Cvc{{HLLAr)   PLSEstimatorc                     t          ddd          \  }} |d          } | |d                              ||          }|                    ||          dk    sJ d	S )
zCheck the behaviour of RFE with PLS estimators.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/12410
    r   rn   r   r   r+   )n_componentsr   g      ?N)r   r6   r<   )r  r$  r4   r5   rZ   r   s         r'   test_rfe_plsr'  2  sw     B2AFFFDAq!,,,Ivia(((,,Q22H>>!Q#%%%%%%r)   )LrJ   operatorr   r   numpyr.   numpy.testingr   r   r   scipyr   sklearn.baser   r	   sklearn.cross_decompositionr
   r   r   sklearn.feature_selectionr   r   sklearn.datasetsr   r   sklearn.metricsr   sklearn.svmr   r   r   sklearn.linear_modelr   sklearn.ensembler   sklearn.model_selectionr   r   sklearn.composer   sklearn.pipeliner   sklearn.preprocessingr   sklearn.utilsr   sklearn.utils._testingr   r   r   r!   rl   rv   r   r   r   r   r   r   r   r   r   r   r   r   markparametrizer   r|   AttributeErrorr  r  r	  r  r#  r'  r;   r)   r'   <module>r=     s                X X X X X X X X X X       7 7 7 7 7 7 7 7 H H H H H H H H H H 0 0 0 0 0 0 0 0 6 6 6 6 6 6 6 6 ) ) ) ) ) ) + + + + + + + + + + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 . . . . . . 6 6 6 6 6 6 * * * * * * 0 0 0 0 0 0 , , , , , , 2 2 2 2 2 2 ' ' ' ' ' ' & & & & & &# # # # # # # #BA A A*9 9 9>Q Q Q2< < <(( ( ($N8 N8 N8b- - -". . .(; ; ;2  1 1 10> > >BO O O*& & &$ **%788:LM  8C8eQZ:PQQ5 5 RQ 5 !		>"		0  c5\22	 	 32 	 ay))  *)$- - -G G G& C<00  10 C<00#|])KLL	& 	& ML 10	& 	& 	&r)   