U
    _»{jPK  ã                   @   sz  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 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!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.m/Z/ ddl0m1Z1 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,d-„ Z>d.d/„ Z?d0d1„ Z@ejA Bd2ed3ƒd3g¡ejA Bd4ed5fed6fg¡d7d8„ ƒƒZCejA Bd9d:eDfd;eEfd<d=„ eEfg¡ejA Bd>eeg¡d?d@„ ƒƒZFejA BdAdd5g¡dBdC„ ƒZGdDdE„ ZHdFdG„ ZIejA BdHeeg¡dIdJ„ ƒZJejA BdHeeg¡ejA BdKeeeg¡dLdM„ ƒƒZKdS )Nz'
Testing Recursive feature elimination
é    )Ú
attrgetterN)Úassert_allcloseÚassert_array_almost_equalÚassert_array_equal)Úsparse)ÚBaseEstimatorÚClassifierMixin)ÚTransformedTargetRegressor)ÚCCAÚPLSCanonicalÚPLSRegression)Ú	load_irisÚmake_friedman1)ÚRandomForestClassifier)ÚRFEÚRFECV)ÚLogisticRegression)Ú
get_scorerÚmake_scorerÚzero_one_loss)Ú
GroupKFoldÚcross_val_score)Úmake_pipeline)ÚStandardScaler)ÚSVCÚSVRÚ	LinearSVR)Úcheck_random_state)Úignore_warningsc                   @   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$   úg/var/www/html/bwave/python/venv/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%   Úscore0   s    zMockClassifier.scoreTc                 C   s
   d| j iS )Nr"   r!   )r#   Údeepr$   r$   r%   Ú
get_params3   s    zMockClassifier.get_paramsc                 K   s   | S r    r$   )r#   Úparamsr$   r$   r%   Ú
set_params6   s    zMockClassifier.set_paramsc                 C   s   ddiS )NÚ	allow_nanTr$   )r#   r$   r$   r%   Ú
_more_tags9   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_importance=   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_rfeR   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   u   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%   ÚTestEstimatort   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_paramsq   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 } ddlm} |ƒ | _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)ÚsysÚior}   Ú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_tags?  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_stepH  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%   Úformula1i  s    z4test_number_of_subsets_of_features.<locals>.formula1c                 S   s   dt  | | t|ƒ ¡ S r—   )r*   r‡   Úfloatr˜   r$   r$   r%   Úformula2l  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_features`  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d�}t|tjtjd�}||| d�}| ||¡}|j ¡ |ksZt	‚d S )	Nr�   rY   r   rŽ   Úauto)ÚdualrE   ©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_typer©   Úrandomc                 C   s   | j S r    )Z
importance)Úxr$   r$   r%   Ú<lambda>à  ó    r´   ÚSelectorc              	   C   s`   t dddd�\}}tdd�}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*   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*   ÚnanÚ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_pls-  s    
rÉ   )Lr=   Úoperatorr   Únumpyr*   rj   Znumpy.testingr   r   r   Zscipyr   Zsklearn.baser   r   Zsklearn.composer	   Zsklearn.cross_decompositionr
   r   r   Zsklearn.datasetsr   r   Zsklearn.ensembler   Zsklearn.feature_selectionr   r   Zsklearn.linear_modelr   Zsklearn.metricsr   r   r   Zsklearn.model_selectionr   r   Zsklearn.pipeliner   Zsklearn.preprocessingr   Zsklearn.svmr   r   r   Zsklearn.utilsr   Zsklearn.utils._testingr   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>   st   !Q	A 
ÿ
ýþ

