U
    ^»{j9/  ã                   @   s²  d Z ddlZddlmZmZ ddlZddlZddlm	Z	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mZ dd
lmZ ddlmZmZ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Žd,�ej( )d-d.d/g¡d0d1„ ƒƒZ0ed)ef d*d2iŽd,�ej( )d-d.d/g¡d3d4„ ƒƒZ1d5d6„ Z2d7d8„ Z3d9d:„ Z4d;d<„ Z5dS )=zD
Testing for Isolation Forest algorithm (sklearn.ensemble.iforest).
é    N)ÚMockÚpatch)Ú
csc_matrixÚ
csr_matrix)Úload_diabetesÚ	load_irisÚmake_classification)ÚIsolationForest)Ú_average_path_length)Úroc_auc_score)ÚParameterGridÚtrain_test_split)Úcheck_random_state)Úassert_allcloseÚassert_array_almost_equalÚassert_array_equalÚignore_warningsc              	   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%   úb/var/www/html/bwave/python/venv/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_sparse2   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_errorL   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_depthb   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_attributej   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_regressiony   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

(rh   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    rj   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      ÿ
rl   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    
þrq   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\   rm   )r	   r   r   Zscore_samplesrY   Zoffset_)r!   Zclf1Zclf2r%   r%   r&   Útest_score_samplesÚ   s    þþ ÿrr   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       ÿ


ru   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 ri   ©rh   Z
call_countrG   ©Zmocked_get_chunkr\   Zn_predict_callsr    r%   r%   r&   Útest_iforest_chunks_works1  s    
rx   r*   c                 C   s   t ||ƒ | j|kst‚d S ri   rv   rw   r%   r%   r&   Útest_iforest_chunks_works2  s    
ry   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   ÚrandomÚ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_deprecatedH  s    ÿr…   c               	   C   sf   t  d¡} tj d¡}| j| d¡dgd�}tddd�}t 	¡ � t 
dt¡ | |¡ W 5 Q R X d	S )
z¾Check that feature names are preserved when contamination is not "auto".

    Feature names are required for consistency checks during scoring.

    Non-regression test for Issue #25844
    Zpandasr   r`   Úa)r,   Úcolumnsgš™™™™™©?rc   r4   N)r7   Zimportorskipr   rz   r{   Z	DataFramerW   r	   r:   r;   r<   r9   r   )Úpdr-   r>   r„   r%   r%   r&   Ú#test_iforest_preserve_feature_namesV  s    

r‰   )6Ú__doc__r:   Zunittest.mockr   r   Únumpyr   r7   Zscipy.sparser   r   Zsklearn.datasetsr   r   r   Zsklearn.ensembler	   Zsklearn.ensemble._iforestr
   Zsklearn.metricsr   Zsklearn.model_selectionr   r   Zsklearn.utilsr   Zsklearn.utils._testingr   r   r   r   r6   r+   r'   r.   r@   rI   rK   rP   r[   ÚmarkZparametrizerh   rj   rl   rq   rr   ru   rx   ry   r~   r�   r…   r‰   r%   r%   r%   r&   Ú<module>   sX   
þþ"