U
    ½mœd“K  ã                   @   s’  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„ dƒZ2dd„ Z3dd„ Z4dd„ Z5dd „ Z6d!d"„ Z7d#d$„ Z8d%d&„ Z9d'd(„ Z:d)d*„ Z;d+d,„ Z<d-d.„ Z=d/d0„ Z>d1d2„ Z?d3d4„ Z@ejA Bd5ed6ƒd6g¡ejA Bd7ed8fed9fg¡d:d;„ ƒƒZCejA Bd<d=eDfd>eEfd?d@„ eEfg¡ejA BdAeeg¡dBdC„ ƒƒZFejA BdDdd8g¡dEdF„ ƒZGdGdH„ ZHdIdJ„ ZIejA BdKeeg¡dLdM„ ƒZJejA BdKeeg¡ejA BdNeeeg¡dOdP„ ƒƒZKdS )Qz'
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                   @   sZ   e Zd ZdZddd„Zdd„ Zdd„ ZeZeZeZ	dd
d„Z
ddd„Zdd„ Zdd„ Zd	S )ÚMockClassifierz@
    Dummy classifier to test recursive feature elimination
    r   c                 C   s
   || _ d S ©N©Ú	foo_param)Úselfr"   © r$   úa/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/feature_selection/tests/test_rfe.pyÚ__init__&   s    zMockClassifier.__init__c                 C   s0   t |ƒt |ƒkst‚tj|jd tjd�| _| S )Né   )Zdtype)ÚlenÚAssertionErrorÚnpZonesÚshapeZfloat64Úcoef_©r#   ÚXÚyr$   r$   r%   Úfit)   s    zMockClassifier.fitc                 C   s
   |j d S )Nr   )r+   )r#   ÚTr$   r$   r%   Úpredict.   s    zMockClassifier.predictNc                 C   s   dS )Ng        r$   r-   r$   r$   r%   Úscore5   s    zMockClassifier.scoreTc                 C   s
   d| j iS )Nr"   r!   )r#   Údeepr$   r$   r%   Ú
get_params8   s    zMockClassifier.get_paramsc                 K   s   | S r    r$   )r#   Úparamsr$   r$   r%   Ú
set_params;   s    zMockClassifier.set_paramsc                 C   s   ddiS )NÚ	allow_nanTr$   )r#   r$   r$   r%   Ú
_more_tags>   s    zMockClassifier._more_tags)r   )NN)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r&   r0   r2   Zpredict_probaZdecision_functionÚ	transformr3   r5   r7   r9   r$   r$   r$   r%   r   !   s   


r   c                  C   s°   t dƒ} tƒ }tj|j| jt|jƒdfd�f }|j}td| dd�}t	|ddd	�}| 
||¡ t|jƒ|jd
 ksvt‚tdd�}t	|ddd	�}| 
||¡ t| ¡ | ¡ ƒ d S )Nr   é   ©Úsizeé   é   )Ún_estimatorsÚrandom_stateÚ	max_depthé   çš™™™™™¹?©Ú	estimatorÚn_features_to_selectÚstepr'   Úlinear©Zkernel)r   r   r*   Úc_ÚdataÚnormalr(   Útargetr   r   r0   Úranking_r+   r)   r   r   Zget_support)Ú	generatorÚirisr.   r/   ÚclfÚrfeZclf_svcZrfe_svcr$   r$   r%   Útest_rfe_features_importanceB   s    "
rX   c                  C   s:  t dƒ} tƒ }tj|j| jt|jƒdfd�f }t |¡}|j	}t
dd�}t|ddd�}| ||¡ | |¡}| ||¡ t|jƒ|jd	 ks’t‚t
dd�}t|ddd�}	|	 ||¡ |	 |¡}
|j|jjksÒt‚t|d d
… |jd d
… ƒ t| |¡| |j¡ƒ | ||¡| |j|j	¡k�s(t‚t||
 ¡ ƒ d S )Nr   r?   r@   rM   rN   rG   rH   rI   r'   é
   )r   r   r*   rO   rP   rQ   r(   r   Ú
csr_matrixrR   r   r   r0   r>   rS   r+   r)   r   r2   r3   Útoarray)rT   rU   r.   ÚX_sparser/   rV   rW   ÚX_rZ
clf_sparseZ
rfe_sparseÚ
X_r_sparser$   r$   r%   Útest_rfeW   s(    "




"r_   c               	   C   s°   G dd„ dt tƒ} tdd�\}}tjtdd�� t| ƒ d� ||¡ W 5 Q R X tjtdd��& t| ƒ d�j||d	d
� ||¡ W 5 Q R X t| ƒ d�j||d	d
�j||d	d
� d S )Nc                   @   s    e Zd Zddd„Zddd„ZdS )z0test_RFE_fit_score_params.<locals>.TestEstimatorNc                 S   s2   |d krt dƒ‚tdd� ||¡| _| jj| _| S )Núfit: prop cannot be NonerM   rN   )Ú
ValueErrorr   r0   Úsvc_r,   ©r#   r.   r/   Úpropr$   r$   r%   r0   z   s
    
z4test_RFE_fit_score_params.<locals>.TestEstimator.fitc                 S   s   |d krt dƒ‚| j ||¡S )Núscore: prop cannot be None)ra   rb   r3   rc   r$   r$   r%   r3   �   s    z6test_RFE_fit_score_params.<locals>.TestEstimator.score)N)N)r:   r;   r<   r0   r3   r$   r$   r$   r%   ÚTestEstimatory   s   
rf   T©Z
return_X_yr`   )Úmatch©rJ   re   Zfoo)rd   )	r   r   r   ÚpytestÚraisesra   r   r0   r3   )rf   r.   r/   r$   r$   r%   Útest_RFE_fit_score_paramsv   s    *rl   c                  C   s”   t dƒ} tƒ }tj|j| jt|jƒdfd�f }|j}tdd�}t	|ddd�}| 
||¡ t	|d	dd�}| 
||¡ t|j|jƒ t|j|jƒ d S )
Nr   r?   r@   rM   rN   rG   rH   rI   gš™™™™™Ù?)r   r   r*   rO   rP   rQ   r(   rR   r   r   r0   r   rS   Úsupport_)rT   rU   r.   r/   rV   Zrfe_numZrfe_percr$   r$   r%   Útest_rfe_percent_n_features�   s    "
rn   c                  C   sš   t dƒ} tƒ }tj|j| jt|jƒdfd�f }|j}tƒ }t	|ddd�}| 
||¡ | |¡}| 
||¡ t|jƒ|jd ks„t‚|j|jjks–t‚d S )Nr   r?   r@   rG   rH   rI   r'   )r   r   r*   rO   rP   rQ   r(   rR   r   r   r0   r>   rS   r+   r)   )rT   rU   r.   r/   rV   rW   r]   r$   r$   r%   Útest_rfe_mockclassifier£   s    "
ro   c                  C   s°  t dƒ} tƒ }tj|j| jt|jƒdfd�f }t|jƒ}t	t
dd�dd�}| ||¡ |j ¡ D ] }t|j| ƒ|jd ksbt‚qbt|jƒ|jd ksœt‚| |¡}t||jƒ t	t
dd�dd�}t |¡}| ||¡ | |¡}	t|	 ¡ |jƒ ttdd	�}
t	t
dd�d|
d
�}t|jƒ||ƒ | |¡}t||jƒ tdƒ}t	t
dd�d|d
�}| ||¡ | |¡}t||jƒ dd„ }t	t
dd�d|d
�}| ||¡ |jdk�s°t‚t	t
dd�dd�}| ||¡ |j ¡ D ]}t|j| ƒdk�sØt‚�qØt|jƒ|jd k�st‚| |¡}t||jƒ t	t
dd�dd�}t |¡}| ||¡ | |¡}	t|	 ¡ |jƒ t	t
dd�dd�}t |¡}| ||¡ | |¡}	t|	 ¡ |jƒ d S )Nr   r?   r@   rM   rN   r'   ©rJ   rL   F)Zgreater_is_better)rJ   rL   ÚscoringÚaccuracyc                 S   s   dS )Ng      ð?r$   )rJ   r.   r/   r$   r$   r%   Útest_scorerá   s    ztest_rfecv.<locals>.test_scorerrC   çš™™™™™É?)r   r   r*   rO   rP   rQ   r(   ÚlistrR   r   r   r0   Úcv_results_Úkeysr+   r)   rS   r>   r   r   rZ   r[   r   r   r   r   Ún_features_)rT   rU   r.   r/   ÚrfecvÚkeyr]   Zrfecv_sparser\   r^   rq   Zscorerrs   r$   r$   r%   Ú
test_rfecvµ   s^    "










r{   c                  C   sœ   t dƒ} tƒ }tj|j| jt|jƒdfd�f }t|jƒ}t	t
ƒ dd�}| ||¡ |j ¡ D ] }t|j| ƒ|jd ks^t‚q^t|jƒ|jd ks˜t‚d S )Nr   r?   r@   r'   rp   )r   r   r*   rO   rP   rQ   r(   ru   rR   r   r   r0   rv   rw   r+   r)   rS   )rT   rU   r.   r/   ry   rz   r$   r$   r%   Útest_rfecv_mockclassifier  s    "
r|   c                  C   sž   ddl m}  dd l}| ƒ |_tdƒ}tƒ }tj|j|j	t
|jƒdfd�f }t|jƒ}ttdd�ddd�}| ||¡ |j}| d¡ t
| ¡ ƒdksšt‚d S )	Nr   )ÚStringIOr?   r@   rM   rN   r'   )rJ   rL   Úverbose)Úior}   ÚsysÚstdoutr   r   r*   rO   rP   rQ   r(   ru   rR   r   r   r0   ÚseekÚreadliner)   )r}   r€   rT   rU   r.   r/   ry   Zverbose_outputr$   r$   r%   Útest_rfecv_verbose_output  s    "

r„   c           
      C   sâ   t | ƒ}tƒ }tj|j|jt|jƒdfd�f }t|jƒ}ddgddgddgfD ]Œ\}}t	t
ƒ ||d�}| ||¡ t |jd | | ¡d }|j ¡ D ]}	t|j|	 ƒ|ksšt‚qšt|jƒ|jd ksÎt‚|j|ksPt‚qPd S )Nr?   r@   rC   r'   é   )rJ   rL   Úmin_features_to_select)r   r   r*   rO   rP   rQ   r(   ru   rR   r   r   r0   Úceilr+   rv   rw   r)   rS   rx   )
Úglobal_random_seedrT   rU   r.   r/   rL   r†   ry   Z	score_lenrz   r$   r$   r%   Útest_rfecv_cv_results_size+  s     "
ýr‰   c                  C   sF   t tdd�ƒ} | jdkst‚tƒ }t| |j|jƒ}| ¡ dksBt‚d S )NrM   rN   Ú
classifiergffffffæ?)	r   r   Z_estimator_typer)   r   r   rP   rR   Úmin)rW   rU   r3   r$   r$   r%   Útest_rfe_estimator_tagsD  s
    rŒ   c                 C   s¸   d}t d|| d�\}}|j\}}tdd�}t|dd�}| ||¡}|j ¡ |d ksXt‚t|d	d�}| ||¡}|j ¡ |d ks†t‚t|d
d�}| ||¡}|j ¡ |d ks´t‚d S )NrY   é2   ©Ú	n_samplesÚ
n_featuresrE   rM   rN   g{®Gáz„?©rL   rC   rt   é   )r   r+   r   r   r0   rm   Úsumr)   )rˆ   r�   r.   r/   r�   rJ   ÚselectorÚselr$   r$   r%   Útest_rfe_min_stepM  s"      ÿ


r–   c                 C   s€  dd„ }dd„ }ddg}ddg}ddg}t |||ƒD ]ˆ\}}}t| ƒ}	|	jd|fd	�}
|	 d¡ ¡ }ttd
d�||d�}| |
|¡ t 	|j
¡||||ƒks t‚t 	|j
¡||||ƒks4t‚q4d}ddg}ddg}t ||ƒD ]ž\}}t| ƒ}	|	jd|fd	�}
|	 d¡ ¡ }ttd
d�|d�}| |
|¡ |j ¡ D ]F}t|j| ƒ||||ƒk�sVt‚t|j| ƒ||||ƒk�s2t‚�q2qÜd S )Nc                 S   s   d| | | d |  S ©Nr'   r$   ©r�   rK   rL   r$   r$   r%   Úformula1n  s    z4test_number_of_subsets_of_features.<locals>.formula1c                 S   s   dt  | | t|ƒ ¡ S r—   )r*   r‡   Úfloatr˜   r$   r$   r%   Úformula2q  s    z4test_number_of_subsets_of_features.<locals>.formula2é   r…   rC   éd   r@   rM   rN   rI   r'   rY   rp   )Úzipr   rQ   ZrandÚroundr   r   r0   r*   ÚmaxrS   r)   r   rv   rw   r(   )rˆ   r™   r›   Zn_features_listZn_features_to_select_listZ	step_listr�   rK   rL   rT   r.   r/   rW   ry   rz   r$   r$   r%   Ú"test_number_of_subsets_of_featurese  sR    	  ÿý  ÿ  ÿr¡   c           	      C   sÆ   t | ƒ}tƒ }tj|j|jt|jƒdfd�f }|j}tt	dd�d�}| 
||¡ |j}|j}|jdd� | 
||¡ t|j|ƒ | ¡ |j ¡ ks˜t‚| ¡ D ] }|| t |j| ¡ks t‚q d S )Nr?   r@   rM   rN   ri   rC   )Zn_jobs)r   r   r*   rO   rP   rQ   r(   rR   r   r   r0   rS   rv   r7   r   rw   r)   rj   Zapprox)	rˆ   rT   rU   r.   r/   ry   Zrfecv_rankingZrfecv_cv_results_rz   r$   r$   r%   Útest_rfe_cv_n_jobs¦  s    "r¢   c                  C   s€   t dƒ} tƒ }d}t t d|t|jƒ¡¡}|j}|jdk t	¡}t
t| d�ddtdd�d�}|j|||d	� |jdks|t‚d S )
Nr   rG   ©rE   r'   rr   rC   )Zn_splits)rJ   rL   rq   Úcv)Úgroups)r   r   r*   ÚfloorZlinspacer(   rR   rP   ZastypeÚintr   r   r   r0   rx   r)   )rT   rU   Znumber_groupsr¥   r.   r/   Z
est_groupsr$   r$   r%   Útest_rfe_cv_groups»  s    ür¨   Úimportance_getterzregressor_.coef_zselector, expected_n_featuresr’   rG   c                 C   s\   t dddd�\}}tdd�}t|tjtjd�}||| d�}| ||¡}|j ¡ |ksXt	‚d S )Nr�   rY   r   rŽ   r£   ©Z	regressorÚfuncZinverse_func©r©   )
r   r   r   r*   ÚlogÚexpr0   rm   r“   r)   )r©   r”   Zexpected_n_featuresr.   r/   rJ   Úlog_estimatorr•   r$   r$   r%   Útest_rfe_wrapped_estimatorÍ  s    
  ÿr°   zimportance_getter, err_typeÚautoÚrandomc                 C   s   | j S r    )Z
importance)Úxr$   r$   r%   Ú<lambda>å  ó    r´   ÚSelectorc              	   C   s\   t dddd�\}}tƒ }t|tjtjd�}t |¡� ||| d�}| ||¡ W 5 Q R X d S )Nr�   rY   é*   rŽ   rª   r¬   )	r   r   r   r*   r­   r®   rj   rk   r0   )r©   Zerr_typer¶   r.   r/   rJ   r¯   Úmodelr$   r$   r%   Ú%test_rfe_importance_getter_validationà  s    
  ÿr¹   r¤   c                 C   sn   t ƒ }|j}|j}tj|d d< tj|d d< tƒ }| d k	rJt|| d�}n
t|d�}| 	||¡ | 
|¡ d S )Nr   r'   )rJ   r¤   ri   )r   rP   rR   r*   ÚNaNZInfr   r   r   r0   r>   )r¤   rU   r.   r/   rV   rW   r$   r$   r%   Útest_rfe_allow_nan_inf_in_xõ  s    
r»   c                  C   sR   t tƒ tƒ ƒ} tdd�\}}t| ddd�}| ||¡ | |¡jd dksNt‚d S )NTrg   rC   z$named_steps.logisticregression.coef_)rK   r©   r'   )	r   r   r   r   r   r0   r>   r+   r)   )ZpipelinerP   r/   Zsfmr$   r$   r%   Útest_w_pipeline_2d_coef_  s    ýr¼   c           
         sÊ   t | ƒ}tƒ }tj|j|jt|jƒdfd�f }|j}tt	dd�d�‰ ˆ  
||¡ tˆ jƒd }dd„ t|ƒD ƒ}t ‡ fd	d„|D ƒ¡}tj|d
d�}tj|d
d�}	tˆ jd |ƒ tˆ jd |	ƒ d S )Nr?   r@   rM   rN   ri   rC   c                 S   s   g | ]}d |› d�‘qS )ÚsplitZ_test_scorer$   )Ú.0Úir$   r$   r%   Ú
<listcomp>  s     z+test_rfecv_std_and_mean.<locals>.<listcomp>c                    s   g | ]}ˆ j | ‘qS r$   )rv   )r¾   rz   ©ry   r$   r%   rÀ   !  s     r   )ZaxisZmean_test_scoreZstd_test_score)r   r   r*   rO   rP   rQ   r(   rR   r   r   r0   rv   ÚrangeZasarrayZmeanZstdr   )
rˆ   rT   rU   r.   r/   Zn_split_keysZ
split_keysZ	cv_scoresZexpected_meanZexpected_stdr$   rÁ   r%   Útest_rfecv_std_and_mean  s    "rÃ   ÚClsRFEc                 C   s@   t jjdd�}t jjddd�}tdd�}| |ƒ}| ||¡ d S )N)rY   r…   r@   rC   )rY   rC   r’   )rD   )r*   r²   rQ   Úrandintr   r0   )rÄ   r.   r/   rV   Zrfe_testr$   r$   r%   Útest_multioutput)  s
    
rÆ   ÚPLSEstimatorc                 C   sH   t dddd�\}}|dd�}| |dd� ||¡}| ||¡dksDt‚d	S )
z�Check the behaviour of RFE with PLS estimators.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/12410
    r�   rY   r   rŽ   r'   )Zn_componentsr‘   g      à?N)r   r0   r3   r)   )rÄ   rÇ   r.   r/   rJ   r”   r$   r$   r%   Útest_rfe_pls2  s    
rÈ   )Lr=   Úoperatorr   rj   Únumpyr*   Znumpy.testingr   r   r   Zscipyr   Zsklearn.baser   r   Zsklearn.cross_decompositionr	   r
   r   Zsklearn.feature_selectionr   r   Zsklearn.datasetsr   r   Zsklearn.metricsr   Zsklearn.svmr   r   r   Zsklearn.linear_modelr   Zsklearn.ensembler   Zsklearn.model_selectionr   r   Zsklearn.composer   Zsklearn.pipeliner   Zsklearn.preprocessingr   Zsklearn.utilsr   Zsklearn.utils._testingr   r   r   r   rX   r_   rl   rn   ro   r{   r|   r„   r‰   rŒ   r–   r¡   r¢   r¨   ÚmarkZparametrizer°   ra   ÚAttributeErrorr¹   r»   r¼   rÃ   rÆ   rÈ   r$   r$   r$   r%   Ú<module>   sz   !Q	A 
ÿ
ýþ

