U
    ½mœdŠ-  ã                   @   sÊ  d Z ddlZddlZddl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mZmZ ddlmZ ddlmZ ddlmZmZ ddlmZmZ eƒ Zeƒ Z dd„ Z!dd„ Z"dd„ Z#dd„ Z$dd„ Z%dd„ Z&dd„ Z'ej( )ddd g¡d!d"„ ƒZ*d#d$„ Z+d%d&„ Z,d'd(„ Z-d)d*„ Z.d+d,„ Z/ed-ef d.d/iŽd0�ej( )d1d2d3g¡d4d5„ ƒƒZ0ed-ef d.d6iŽd0�ej( )d1d2d3g¡d7d8„ ƒƒZ1d9d:„ Z2d;d<„ Z3d=d>„ Z4dS )?zD
Testing for Isolation Forest algorithm (sklearn.ensemble.iforest).
é    N)Úassert_array_equal)Úassert_array_almost_equal)Úignore_warnings)Úassert_allclose)ÚParameterGrid)ÚIsolationForest)Ú_average_path_length)Útrain_test_split)Úload_diabetesÚ	load_irisÚmake_classification)Úcheck_random_state)Úroc_auc_score)Ú
csc_matrixÚ
csr_matrix)ÚMockÚpatchc              	   C   s†   t  ddgddgg¡}t  ddgddgg¡}tdgdddgddgd	œƒ}tƒ �. |D ]"}tf d
| i|—Ž |¡ |¡ qTW 5 Q R X dS )z6Check Isolation Forest for various parameter settings.r   é   é   é   ç      à?ç      ð?TF)Ún_estimatorsÚmax_samplesÚ	bootstrapÚrandom_stateN)ÚnpÚarrayr   r   r   ÚfitÚpredict)Úglobal_random_seedÚX_trainÚX_testÚgridÚparams© r%   ú\/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/ensemble/tests/test_iforest.pyÚtest_iforest$   s    ÿÿþr'   c                 C   s¶   t | ƒ}ttjdd… |d�\}}tddgddgdœƒ}ttfD ]p}||ƒ}||ƒ}|D ]V}tf d	| d
œ|—Ž |¡}	|	 	|¡}
tf d	| d
œ|—Ž |¡}| 	|¡}t
|
|ƒ qXq@dS )z=Check IForest for various parameter settings on sparse input.Né2   ©r   r   r   TF)r   r   é
   )r   r   )r   r	   ÚdiabetesÚdatar   r   r   r   r   r   r   )r    Úrngr!   r"   r#   Zsparse_formatZX_train_sparseZX_test_sparser$   Zsparse_classifierZsparse_resultsZdense_classifierZdense_resultsr%   r%   r&   Útest_iforest_sparse4   s4     ÿÿþ
 ÿÿþ
r.   c               	   C   sÖ   t j} d}tjt|d�� tdd� | ¡ W 5 Q R X t ¡ �" t 	dt¡ tdd� | ¡ W 5 Q R X t ¡ �( t 	dt¡ tt
 d¡d� | ¡ W 5 Q R X t t¡�( tƒ  | ¡ | dd…d	d…f ¡ W 5 Q R X dS )
z7Test that it gives proper exception on deficient input.ú3max_samples will be set to n_samples for estimation©Úmatchéè  ©r   ÚerrorÚautor   Nr   )Úirisr,   ÚpytestÚwarnsÚUserWarningr   r   ÚwarningsÚcatch_warningsÚsimplefilterr   Zint64ZraisesÚ
ValueErrorr   )ÚXÚwarn_msgr%   r%   r&   Útest_iforest_errorN   s    

 r@   c               	   C   sF   t j} tƒ  | ¡}|jD ](}|jtt t 	| j
d ¡¡ƒkst‚qdS )zDCheck max_depth recalculation when max_samples is reset to n_samplesr   N)r6   r,   r   r   Úestimators_Ú	max_depthÚintr   ÚceilÚlog2ÚshapeÚAssertionError)r>   ÚclfZestr%   r%   r&   Útest_recalculate_max_depthd   s    
rI   c               	   C   s˜   t j} tƒ  | ¡}|j| jd ks&t‚tdd�}d}tjt	|d�� | | ¡ W 5 Q R X |j| jd kslt‚tdd� | ¡}|jd| jd  ks”t‚d S )Nr   iô  r3   r/   r0   gš™™™™™Ù?)
r6   r,   r   r   Úmax_samples_rF   rG   r7   r8   r9   )r>   rH   r?   r%   r%   r&   Útest_max_samples_attributel   s    
rK   c                 C   sŒ   t | ƒ}ttj|d�\}}td| d� |¡}|jdd� | |¡}|jdd� | |¡}t||ƒ td| d� |¡}| |¡}t||ƒ dS )zCheck parallel regression.r)   r   )Ún_jobsr   r   )rL   r   N)	r   r	   r+   r,   r   r   Ú
set_paramsr   r   )r    r-   r!   r"   ZensembleÚy1Úy2Zy3r%   r%   r&   Ú test_iforest_parallel_regression{   s    



rP   c           	      C   s´   t | ƒ}d| dd¡ }| t |d |d f¡¡}|dd… }|jdddd	�}t |dd… |f¡}t d
gd dgd  ¡}td|d� |¡}| 	|¡ }t
||ƒdks°t‚dS )z#Test Isolation Forest performs wellg333333Ó?iX  r   Nr2   éÿÿÿÿr   )éÈ   r   )ÚlowÚhighÚsizer   rR   éd   )r   r   g\�Âõ(\ï?)r   ÚrandnZpermutationr   ZvstackÚuniformr   r   r   Údecision_functionr   rG   )	r    r-   r>   r!   Z
X_outliersr"   Úy_testrH   Zy_predr%   r%   r&   Útest_iforest_performance�   s    r[   Úcontaminationç      Ð?r5   c              	   C   s¦   ddgddgddgddgddgddgddgddgg}t || d	�}| |¡ | |¡ }| |¡}t |dd … ¡t |d d… ¡ksˆt‚t|d
dg ddg  ƒ d S )NéþÿÿÿrQ   r   r   é   é   éûÿÿÿé	   )r   r\   é   )	r   r   rY   r   r   ÚminÚmaxrG   r   )r\   r    r>   rH   Zdecision_funcÚpredr%   r%   r&   Útest_iforest_works§   s    4

(rg   c                  C   s&   t j} tƒ  | ¡}|j|jks"t‚d S ©N)r6   r,   r   r   rJ   Z_max_samplesrG   )r>   rH   r%   r%   r&   Útest_max_samples_consistency¶   s    ri   c                  C   sV   t dƒ} ttjd d… tjd d… | d�\}}}}tdd�}| ||¡ | |¡ d S )Nr   r(   r)   gš™™™™™é?)Zmax_features)r   r	   r+   r,   Útargetr   r   r   )r-   r!   r"   Zy_trainrZ   rH   r%   r%   r&   Ú test_iforest_subsampled_features½   s      ÿ
rk   c                  C   sÐ   dt  d¡t j  d } dt  d¡t j  d }ttdgƒdgƒ ttdgƒdgƒ ttd	gƒd
gƒ ttdgƒ| gƒ ttdgƒ|gƒ ttt  dd	ddg¡ƒdd
| |gƒ tt  d¡ƒ}t|t  |¡ƒ d S )Nç       @g      @gš™™™™™ù?g     0�@g}ÿ­¿Ì÷ÿ?r   g        r   r   r   é   iç  )	r   ÚlogZeuler_gammar   r   r   Zaranger   Úsort)Z
result_oneZ
result_twoZavg_path_lengthr%   r%   r&   Ú test_iforest_average_path_lengthÈ   s    
þrp   c                  C   s¨   ddgddgddgg} t dd� | ¡}t ƒ  | ¡}t| ddgg¡| ddgg¡|j ƒ t| ddgg¡| ddgg¡|j ƒ t| ddgg¡| ddgg¡ƒ d S )Nr   r   gš™™™™™¹?)r\   rl   )r   r   r   Zscore_samplesrY   Zoffset_)r!   Zclf1Zclf2r%   r%   r&   Útest_score_samplesÜ   s    þþ ÿrq   c                  C   sv   t dƒ} |  dd¡}tdd| dd�}| |¡ |jd }|jdd� | |¡ t|jƒdks`t‚|jd |ksrt‚dS )	z/Test iterative addition of iTrees to an iForestr   é   r   r*   T)r   r   r   Z
warm_start)r   N)r   rW   r   r   rA   rM   ÚlenrG   )r-   r>   rH   Ztree_1r%   r%   r&   Útest_iforest_warm_startí   s       ÿ


rt   z*sklearn.ensemble._iforest.get_chunk_n_rowsZreturn_valuer   )Zside_effectzcontamination, n_predict_calls)r]   r   )r5   r   c                 C   s   t ||ƒ | j|kst‚d S rh   ©rg   Z
call_countrG   ©Zmocked_get_chunkr\   Zn_predict_callsr    r%   r%   r&   Útest_iforest_chunks_works1  s    
rw   r*   c                 C   s   t ||ƒ | j|kst‚d S rh   ru   rv   r%   r%   r&   Útest_iforest_chunks_works2  s    
rx   c                  C   s|  t  d¡} tƒ }| | ¡ t j d¡}t| | ¡dkƒs<t‚t| | 	dd¡¡dkƒsZt‚t| | d ¡dkƒstt‚t| | d ¡dkƒsŽt‚t  
| 	dd¡dd¡} tƒ }| | ¡ t| | ¡dkƒsÊt‚t| | 	dd¡¡dkƒsèt‚t| t  d¡¡dkƒ�st‚| 	dd¡} tƒ }| | ¡ t| | ¡dkƒ�s:t‚t| | 	dd¡¡dkƒ�sZt‚t| t  d¡¡dkƒ�sxt‚dS )z=Test whether iforest predicts inliers when using uniform data)rV   r*   r   r   rV   r*   N)r   Zonesr   r   ÚrandomZRandomStateÚallr   rG   rW   Úrepeat)r>   Ziforestr-   r%   r%   r&   Útest_iforest_with_uniform_data  s(    



 r|   c                  C   s2   t dddd�\} }t| ƒ} tdddd� | ¡ d	S )
zdCheck that Isolation Forest does not segfault with n_jobs=2

    Non-regression test for #23252
    iL rV   r   )Z	n_samplesZ
n_featuresr   r*   é   r   )r   r   rL   N)r   r   r   r   )r>   Ú_r%   r%   r&   Ú*test_iforest_with_n_jobs_does_not_segfault?  s    r   c               	   C   s^   t  ddgddgg¡} t  ddg¡}tƒ }| | |¡ d}tjt|d�� |j W 5 Q R X d S )Nr   r   r   r`   r   zoAttribute `base_estimator_` was deprecated in version 1.2 and will be removed in 1.4. Use `estimator_` instead.r0   )r   r   r   r   r7   r8   ÚFutureWarningZbase_estimator_)r>   ÚyÚmodelr?   r%   r%   r&   Ú'test_base_estimator_property_deprecatedJ  s    ÿrƒ   )5Ú__doc__r7   r:   Únumpyr   Zsklearn.utils._testingr   r   r   r   Zsklearn.model_selectionr   Zsklearn.ensembler   Zsklearn.ensemble._iforestr   r	   Zsklearn.datasetsr
   r   r   Zsklearn.utilsr   Zsklearn.metricsr   Zscipy.sparser   r   Zunittest.mockr   r   r6   r+   r'   r.   r@   rI   rK   rP   r[   ÚmarkZparametrizerg   ri   rk   rp   rq   rt   rw   rx   r|   r   rƒ   r%   r%   r%   r&   Ú<module>   s^   
þþ"