
    h$,fQ                        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mZ ddlmZ ddlmZmZmZ ddlmZmZ dd	lmZ dd
l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( ddl)m*Z* ddl+m,Z,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4  G d d      Z5d Z6ejn                  jq                  de4      d        Z9d Z:d Z;d Z<ejn                  jq                  de4      d        Z=d Z>d Z?d  Z@d! ZAd" ZBd# ZCd$ ZDd% ZEejn                  jq                  d& ed'      d'g      ejn                  jq                  d(ed)fed*fg      d+               ZFejn                  jq                  d,d-eGfd.eHfd/ eHfg      ejn                  jq                  d0eeg      d1               ZIejn                  jq                  d2dd)g      d3        ZJd4 ZKd5 ZLejn                  jq                  d6eeg      d7        ZMejn                  jq                  d6eeg      d8        ZNejn                  jq                  d6eeg      ejn                  jq                  d9eeeg      d:               ZOd; ZPy)<z'
Testing Recursive feature elimination
    )
attrgetterN)assert_allcloseassert_array_almost_equalassert_array_equal)BaseEstimatorClassifierMixin)TransformedTargetRegressor)CCAPLSCanonicalPLSRegression)	load_irismake_friedman1)RandomForestClassifier)RFERFECV)SimpleImputer)LinearRegressionLogisticRegression)
get_scorermake_scorerzero_one_loss)
GroupKFoldcross_val_score)make_pipeline)StandardScaler)SVCSVR	LinearSVR)check_random_state)ignore_warnings)CSR_CONTAINERSc                   L    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y)MockClassifierz@
    Dummy classifier to test recursive feature elimination
    c                     || _         y N	foo_param)selfr'   s     Hlib/python3.12/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%   s;    1vQWWQWWQZrzz:
r+   c                      |j                   d   S )Nr   )r2   )r(   Ts     r)   predictzMockClassifier.predict*   s    wwqzr+   Nc                      y)Ng         r5   s      r)   scorezMockClassifier.score1       r+   c                     d| j                   iS )Nr'   r&   )r(   deeps     r)   
get_paramszMockClassifier.get_params4   s    T^^,,r+   c                     | S r%   r=   )r(   paramss     r)   
set_paramszMockClassifier.set_params7   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*   r8   r;   predict_probadecision_function	transformr>   rB   rE   rH   r=   r+   r)   r#   r#      s<    #
 MI-#r+   r#   c                      t        d      } t               }t        j                  |j                  | j                  t        |j                        df      f   }|j                  }t        d| d      }t        |dd	      }|j                  ||       t        |j                        |j                  d
   k(  sJ t        d      }t        |dd	      }|j                  ||       t        |j                         |j                                y )Nr      size      )n_estimatorsrandom_state	max_depth   皙?	estimatorn_features_to_selectstepr-   linearkernel)r   r   r0   c_datanormalr/   targetr   r   r8   ranking_r2   r   r   get_support)	generatoririsr6   r7   clfrfeclf_svcrfe_svcs           r)   test_rfe_features_importancern   >   s    "1%I;D 	dii))DII/B)CCDAA
 byTU
VC
!#
>CGGAqMs||
***"GG!#FGKK1 s('*=*=*?@r+   csr_containerc                    t        d      }t               }t        j                  |j                  |j                  t        |j                        df      f   } | |      }|j                  }t        d      }t        |dd      }|j                  ||       |j                  |      }|j                  ||       t        |j                        |j                  d	   k(  sJ t        d      }	t        |	dd      }
|
j                  ||       |
j                  |      }|j                  |j                  j                  k(  sJ t        |d d
 |j                  d d
        t        |j                  |      |j                  |j                               |j!                  ||      |j!                  |j                  |j                        k(  sJ t        ||j#                                y )Nr   rQ   rR   r_   r`   rY   rZ   r[   r-   
   )r   r   r0   rb   rc   rd   r/   re   r   r   r8   rO   rf   r2   r   r;   r>   toarray)ro   rh   ri   r6   X_sparser7   rj   rk   X_r
clf_sparse
rfe_sparse
X_r_sparses               r)   test_rferx   S   s   "1%I;D 	dii))DII/B)CCDAQHA X
C
!#
>CGGAqM
--
CGGCOs||
*** H%JzLJNN8Q%%h/J99		'''c#2h		#27ckk!nckk$)).DE99Q?cii		4;;????c:#5#5#78r+   c                      G d dt         t              } t        d      \  }}t        j                  t
        d      5  t         |              j                  ||       d d d        t        j                  t
        d      5  t         |              j                  ||d	
      j                  ||       d d d        t         |              j                  ||d	
      j                  ||d	
       y # 1 sw Y   xY w# 1 sw Y   KxY w)Nc                       e Zd ZddZddZy)0test_RFE_fit_score_params.<locals>.TestEstimatorNc                     |t        d      t        d      j                  ||      | _        | j                  j                  | _        | S )Nfit: prop cannot be Noner_   r`   )
ValueErrorr   r8   svc_r4   r(   r6   r7   props       r)   r8   z4test_RFE_fit_score_params.<locals>.TestEstimator.fitw   s@    | !;<<8,00A6DIDJKr+   c                 T    |t        d      | j                  j                  ||      S )Nscore: prop cannot be None)r~   r   r>   r   s       r)   r>   z6test_RFE_fit_score_params.<locals>.TestEstimator.score~   s(    | !=>>99??1a((r+   r%   )rI   rJ   rK   r8   r>   r=   r+   r)   TestEstimatorr{   v   s    		)r+   r   T
return_X_yr}   matchr\   r   foo)r   )	r   r   r   pytestraisesr~   r   r8   r>   )r   r6   r7   s      r)   test_RFE_fit_score_paramsr   s   s    ) ) %DAq	z)C	D 1mo&**1a01	z)E	F Imo&**1ae*<BB1aHI -/"&&q!%&8>>q!%>P1 1I Is   "C64D6C?Dc                     t        d      } t               }t        j                  |j                  | j                  t        |j                        df      f   }|j                  }t        d      }t        |dd      }|j                  ||       t        |d	d      }|j                  ||       t        |j                  |j                         t        |j                  |j                         y )
Nr   rQ   rR   r_   r`   rY   rZ   r[   g?)r   r   r0   rb   rc   rd   r/   re   r   r   r8   r   rf   support_)rh   ri   r6   r7   rj   rfe_numrfe_percs          r)   test_rfe_percent_n_featuresr      s    "1%I;D 	dii))DII/B)CCDAA
X
CCacBGKK1SsEHLLAx(('*:*:;x(('*:*:;r+   c                      t        d      } t               }t        j                  |j                  | j                  t        |j                        df      f   }|j                  }t               }t        |dd      }|j                  ||       |j                  |      }|j                  ||       t        |j                        |j                  d   k(  sJ |j                  |j                  j                  k(  sJ y )Nr   rQ   rR   rY   rZ   r[   r-   )r   r   r0   rb   rc   rd   r/   re   r#   r   r8   rO   rf   r2   )rh   ri   r6   r7   rj   rk   rt   s          r)   test_rfe_mockclassifierr      s    "1%I;D 	dii))DII/B)CCDAA 
C
!#
>CGGAqM
--
CGGCOs||
***99		'''r+   c                 6   t        d      }t               }t        j                  |j                  |j                  t        |j                        df      f   }t        |j                        }t        t        d      d      }|j                  ||       |j                  j                         D ],  }t        |j                  |         |j                  d   k(  r,J  t        |j                        |j                  d   k(  sJ |j!                  |      }t#        ||j                         t        t        d      d      } | |      }	|j                  |	|       |j!                  |	      }
t#        |
j%                         |j                         t'        t(        d	      }t        t        d      d|
      } t+        |j                        ||       |j!                  |      }t#        ||j                         t-        d      }t        t        d      d|
      }|j                  ||       |j!                  |      }t#        ||j                         d }t        t        d      d|
      }|j                  ||       |j.                  dk(  sJ t        t        d      d      }|j                  ||       |j                  j                         D ]  }t        |j                  |         dk(  rJ  t        |j                        |j                  d   k(  sJ |j!                  |      }t#        ||j                         t        t        d      d      } | |      }	|j                  |	|       |j!                  |	      }
t#        |
j%                         |j                         t        t        d      d      } | |      }	|j                  |	|       |j!                  |	      }
t#        |
j%                         |j                         y )Nr   rQ   rR   r_   r`   r-   r\   r^   F)greater_is_better)r\   r^   scoringaccuracyc                      y)Ng      ?r=   )r\   r6   r7   s      r)   test_scorerztest_rfecv.<locals>.test_scorer   r?   r+   rU   皙?)r   r   r0   rb   rc   rd   r/   listre   r   r   r8   cv_results_keysr2   rf   rO   r   rr   r   r   r    r   n_features_)ro   rh   ri   r6   r7   rfecvkeyrt   rfecv_sparsers   rw   r   scorerr   s                 r)   
test_rfecvr      sd   "1%I;D 	dii))DII/B)CCDAT[[A Cx0q9E	IIaO   %%' 95$$S)*aggaj8889 u~~!''!*,,,
//!
C sDII& 3h#7a@LQHXq!''1Jz))+TYY7 -5AGCx0q'JEOEIIq!$
//!
CsDII& 
#FCx0q&IE	IIaO
//!
CsDII& Cx0q+NE	IIaO !!! Cx0q9E	IIaO  %%' 05$$S)*a///0 u~~!''!*,,,
//!
CsDII&3h#7a@LQHXq!''1Jz))+TYY7 3h#7cBLQHXq!''1Jz))+TYY7r+   c                     t        d      } t               }t        j                  |j                  | j                  t        |j                        df      f   }t        |j                        }t        t               d      }|j                  ||       |j                  j                         D ],  }t        |j                  |         |j                  d   k(  r,J  t        |j                        |j                  d   k(  sJ y )Nr   rQ   rR   r-   r   )r   r   r0   rb   rc   rd   r/   r   re   r   r#   r8   r   r   r2   rf   )rh   ri   r6   r7   r   r   s         r)   test_rfecv_mockclassifierr     s    "1%I;D
dii))DII/B)CCDAT[[A N,15E	IIaO   %%' 95$$S)*aggaj8889 u~~!''!*,,,r+   c                     dd l } ddlm}  |       | _        t	        d      }t               }t        j                  |j                  |j                  t        |j                        df      f   }t        |j                        }t        t        d      dd      }|j                  ||       | j                  }|j!                  d       t        |j#                               dkD  sJ y )	Nr   )StringIOrQ   rR   r_   r`   r-   )r\   r^   verbose)sysior   stdoutr   r   r0   rb   rc   rd   r/   r   re   r   r   r8   seekreadline)r   r   rh   ri   r6   r7   r   verbose_outputs           r)   test_rfecv_verbose_outputr     s    CJ"1%I;D
dii))DII/B)CCDAT[[ACx0q!DE	IIaOZZN~&&()A---r+   c                    t        |       }t               }t        j                  |j                  |j                  t        |j                        df      f   }t        |j                        }ddgddgddgfD ]  \  }}t        t               ||      }|j                  ||       t        j                  |j                  d   |z
  |z        dz   }|j                  j                         D ]  }	t        |j                  |	         |k(  rJ  t        |j                         |j                  d   k(  sJ |j"                  |k\  rJ  y )NrQ   rR   rU   r-      )r\   r^   min_features_to_select)r   r   r0   rb   rc   rd   r/   r   re   r   r#   r8   ceilr2   r   r   rf   r   )
global_random_seedrh   ri   r6   r7   r^   r   r   	score_lenr   s
             r)   test_rfecv_cv_results_sizer   )  s;   "#56I;D
dii))DII/B)CCDAT[[A +,Q!Q!Q(@ ;$$$&#9

 			!QGGQWWQZ*@@DHIAM	$$))+ 	<Cu((-.);;;	< 5>>"aggaj000  $::::;r+   c                      t        t        d            } | j                  dk(  sJ t               }t	        | |j
                  |j                        }|j                         dkD  sJ y )Nr_   r`   
classifiergffffff?)r   r   _estimator_typer   r   rc   re   min)rk   ri   r>   s      r)   test_rfe_estimator_tagsr   B  sV    
c"
#C,...;DCDKK8E99;r+   c                    d}t        d||       \  }}|j                  \  }}t        d      }t        |d      }|j	                  ||      }|j
                  j                         |dz  k(  sJ t        |d	      }|j	                  ||      }|j
                  j                         |dz  k(  sJ t        |d
      }|j	                  ||      }|j
                  j                         |dz  k(  sJ y )Nrq   2   	n_samples
n_featuresrW   r_   r`   g{Gz?r^   rU   r      )r   r2   r   r   r8   r   sum)r   r   r6   r7   r   r\   selectorsels           r)   test_rfe_min_stepr   K  s    J:LDAq GGIz8$I 94(H
,,q!
C<<q000 94(H
,,q!
C<<q000 91%H
,,q!
C<<q000r+   c                    d }d }ddg}ddg}ddg}t        |||      D ]  \  }}}t        |       }	|	j                  d|f      }
|	j                  d      j	                         }t        t        d	      ||
      }|j                  |
|       t        j                  |j                         ||||      k(  sJ t        j                  |j                         ||||      k(  rJ  d}ddg}ddg}t        ||      D ]  \  }}t        |       }	|	j                  d|f      }
|	j                  d      j	                         }t        t        d	      |      }|j                  |
|       |j                  j                         D ]L  }t        |j                  |          ||||      k(  sJ t        |j                  |          ||||      k(  rLJ   y )Nc                 $    d| |z   |z
  dz
  |z  z   S Nr-   r=   r   r]   r^   s      r)   formula1z4test_number_of_subsets_of_features.<locals>.formula1l  s"    Z$&)==AdJKKr+   c                 P    dt        j                  | |z
  t        |      z        z   S r   )r0   r   floatr   s      r)   formula2z4test_number_of_subsets_of_features.<locals>.formula2o  s%    277J)==tLMMMr+      r   rU   d   rR   r_   r`   r[   r-   rq   r   )zipr   rd   randroundr   r   r8   r0   maxrf   r   r   r   r/   )r   r   r   n_features_listn_features_to_select_list	step_listr   r]   r^   rh   r6   r7   rk   r   r   s                  r)   "test_number_of_subsets_of_featuresr   c  s   LN 2hO!"AAI252I3 X.
($ ''9:	3
"34NN3%%'*!5

 	1vvcll#x
<PRV'WWWWvvcll#x
<PRV'WWWWX2 2hOAI; 
D&'9:	3
"34NN3%%'8 44@		!Q$$))+ 	Cu((-.(0$3    u((-.(0$3   		r+   c                    t        |       }t               }t        j                  |j                  |j                  t        |j                        df      f   }|j                  }t        t        d            }|j                  ||       |j                  }|j                  }|j                  d       |j                  ||       t        |j                  |       |j                         |j                  j                         k(  sJ |j                         D ],  }||   t!        j"                  |j                  |         k(  r,J  y )NrQ   rR   r_   r`   r   rU   )n_jobs)r   r   r0   rb   rc   rd   r/   re   r   r   r8   rf   r   rE   r   r   r   approx)	r   rh   ri   r6   r7   r   rfecv_rankingrfecv_cv_results_r   s	            r)   test_rfe_cv_n_jobsr     s   "#56I;D
dii))DII/B)CCDAACx01E	IIaONNM))	A	IIaOennm<!!#u'8'8'='='???? %%' O %u7H7H7M)NNNNOr+   c            	         t        d      } t               }d}t        j                  t        j                  d|t        |j                                    }|j                  }|j                  dkD  j                  t              }t        t        |       ddt        d            }|j                  |||	       |j                  dkD  sJ y )
Nr   rY   )rW   r-   r   rU   )n_splits)r\   r^   r   cv)groups)r   r   r0   floorlinspacer/   re   rc   astypeintr   r   r   r8   r   )rh   ri   number_groupsr   r6   r7   
est_groupss          r)   test_rfe_cv_groupsr     s    "1%I;DMXXbkk!]C4DEFF		A	q  %A(i@q!	J NN1aN'!!A%%%r+   importance_getterzregressor_.coef_zselector, expected_n_featuresr   rY   c                 
   t        ddd      \  }}t        dd      }t        |t        j                  t        j
                        } |||       }|j                  ||      }|j                  j                         |k(  sJ y )	Nr   rq   r   r   auto)dualrW   	regressorfuncinverse_funcr   )	r   r   r	   r0   logexpr8   r   r   )r   r   expected_n_featuresr6   r7   r\   log_estimatorr   s           r)   test_rfe_wrapped_estimatorr     sv     B2AFDAqvA6I."&&rvvM 9JKH
,,q!
C<<!4444r+   zimportance_getter, err_typer   randomc                     | j                   S r%   )
importance)xs    r)   <lambda>r     s
    1<< r+   Selectorc                    t        ddd      \  }}t        d      }t        |t        j                  t        j
                        }t        j                  |      5   |||       }|j                  ||       d d d        y # 1 sw Y   y xY w)	Nr   rq   *   r   r   )r   r   r   )	r   r   r	   r0   r   r   r   r   r8   )r   err_typer   r6   r7   r\   r   models           r)   %test_rfe_importance_getter_validationr    sv     B2BGDAqv&I."&&rvvM 
x	  :KL		!Q  s   BBr   c                 2   t               }|j                  }|j                  }t        j                  |d   d<   t        j
                  |d   d<   t               }| t        ||       }nt        |      }|j                  ||       |j                  |       y )Nr   r-   )r\   r   r   )r   rc   re   r0   naninfr#   r   r   r8   rO   )r   ri   r6   r7   rj   rk   s         r)   test_rfe_allow_nan_inf_in_xr    s{    ;D		AA ffAaDGffAaDG

C	~cb)C GGAqMMM!r+   c                      t        t               t                     } t        d      \  }}t	        | dd      }|j                  ||       |j                  |      j                  d   dk(  sJ y )NTr   rU   $named_steps.logisticregression.coef_)r]   r   r-   )r   r   r   r   r   r8   rO   r2   )pipelinerc   r7   sfms       r)   test_w_pipeline_2d_coef_r    sh    ^-/A/CDH4(GD!
@C GGD!==$$Q'1,,,r+   c                    t        |       }t               }t        j                  |j                  |j                  t        |j                        df      f   }|j                  }t        t        d            }|j                  ||       t        |j                        dz
  }t        |      D cg c]  }d| d
 }}t        j                  |D 	cg c]  }	|j                  |	    c}	      }
t        j                  |
d	
      }t        j                  |
d	
      }t!        |j                  d   |       t!        |j                  d   |       y c c}w c c}	w )NrQ   rR   r_   r`   r   rU   split_test_scorer   )axismean_test_scorestd_test_score)r   r   r0   rb   rc   rd   r/   re   r   r   r8   r   rangeasarraymeanstdr   )r   rh   ri   r6   r7   r   n_split_keysi
split_keysr   	cv_scoresexpected_meanexpected_stds                r)   test_rfecv_std_and_meanr    s   "#56I;D
dii))DII/B)CCDAACx01E	IIaOu(()A-L272EFQE!K(FJF

jIsE--c2IJIGGIA.M66)!,LE%%&78-HE%%&67F GIs   3EEClsRFEc                     t         j                  j                  d      }t         j                  j                  dd      }t	        d      } | |      }|j                  ||       y )N)rq   r   rR   rU   )rq   rU   r   )rV   )r0   r   rd   randintr   r8   )r  r6   r7   rj   rfe_tests        r)   test_multioutputr#  '  sS    
		g&A
		!'*A
 a
0Cc{HLLAr+   c                     t        d      \  }}t        j                  |d<   t        t	               t               t                     } | |d      }|j                  ||       y)z`Check that RFE works with pipeline that accept nans.

    Non-regression test for gh-21743.
    Tr   )r   r   r
  )r\   r   N)r   r0   r  r   r   r   r   r8   )r  r6   r7   pipefss        r)   test_pipeline_with_nansr'  0  s[     %DAqffAdGD 
@
B FF1aLr+   PLSEstimatorc                     t        ddd      \  }} |d      } | |d      j                  ||      }|j                  ||      dkD  sJ y	)
zCheck the behaviour of RFE with PLS estimators.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/12410
    r   rq   r   r   r-   )n_componentsr   g      ?N)r   r8   r>   )r  r(  r6   r7   r\   r   s         r)   test_rfe_plsr+  F  sR     B2AFDAq!,Iia(,,Q2H>>!Q#%%%r+   c                     t               } t        t                     }d}d}t        j                  t
        |      5 }|j                  | j                  | j                        j                  | j                         ddd       t        j                  j                  t
              sJ |t        |j                  j                        v sJ y# 1 sw Y   SxY w)a  Check that we raise the proper AttributeError when the estimator
    does not implement the `decision_function` method, which is decorated with
    `available_if`.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/28108
    r   z/This 'RFE' has no attribute 'decision_function'z>'LinearRegression' object has no attribute 'decision_function'r   N)r   r   r   r   r   AttributeErrorr8   rc   re   rN   
isinstancevalue	__cause__str)ri   rk   	outer_msg	inner_msg	exec_infos        r)   "test_rfe_estimator_attribute_errorr5  T  s     ;D (*
+CAIPI	~Y	7 E9		4;;'99$))DEioo//@@@IOO556666E Es   A CC)QrL   operatorr   numpyr0   r   numpy.testingr   r   r   sklearn.baser   r   sklearn.composer	   sklearn.cross_decompositionr
   r   r   sklearn.datasetsr   r   sklearn.ensembler   sklearn.feature_selectionr   r   sklearn.imputer   sklearn.linear_modelr   r   sklearn.metricsr   r   r   sklearn.model_selectionr   r   sklearn.pipeliner   sklearn.preprocessingr   sklearn.svmr   r   r   sklearn.utilsr   sklearn.utils._testingr    sklearn.utils.fixesr!   r#   rn   markparametrizerx   r   r   r   r   r   r   r   r   r   r   r   r   r   r~   r-  r  r  r  r  r#  r'  r+  r5  r=   r+   r)   <module>rK     s       X X 7 6 H H 6 3 0 ( E B B ? * 0 + + , 2 .# #BA* .99 :9>Q2<(($ .9N8 :N8b-".(;210>BO*&$ *%78:LM 8C8eQZ:PQ5 R5 !		>"	0 c5\2	 3	 ay) *$-G& C<0 1 C<0 1* C<0#|])KL	& M 1	&7r+   