U
    -e1                     @   sT  d Z ddlZddlZddlZddlZddlmZmZ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lmZmZmZ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$m%Z%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8 ddl9m:Z: ddgddgddgddgddgddggZ;ddddddgZ<eddddfZ=eddddddfZ>eddddfZ?edddddfZ@e ZAejBCdede=fede>fed e=fed e>fede?fed e?fe1d e?fe$d e?fe$d e@fe%d e=fe%d e>fe&d e@fgejBCd!d"ejBCd#dgddgfejBCd$d%d&d' ZDd(d) ZEejBCd!dd*gd+d, ZFejBCd!dd*gd-d. ZGejBCd/d0d1d2d3d4d5d6gd7d8 ZHejBCd9eId:ejBCd;e$ d fedd<d fedd<d=fedd<d fedd<d=fgd>d? ZJejBCd@eIddAdB ZKejBCdCedd<edd<fejBCd9dDdEdF ZLejBCdCe$ edd<edddddGe1dd<fejBCdHdIdJdK ZMejBCdLejNjOejNjPejQjRejSjTejSjUejQjVfdMdN ZWG dOdP dPeeZXejBYdQejBCdRedddSd#dgidTfe$ dgdUdVdWfedd<dgdUd=dXdYfedd<dgdUddXdYfe$ dgd=dZd[d\fe$ dgd=d]d[d\fe$ dgd=d^d_fgd`da ZZejBCdbe$ edd<gejBCd#ddcgddde Z[ejBCdbe$ edd<gdfdg Z\ejBCdbe$ edd<gdhdi Z]djdk Z^dldm Z_dndo Z`dpdq ZaejBjCdbe%drddsedd:dtgdudvgdwejBjCdxdee. dydz d{D fe- d|dz d}D fee. d~dz d{D fddgdddgdwejBjCd#ddgddz d{D gddgdwdd ZbejBjCddeAjcd dfddgdfddz d{D dfddddgdfgdddddgdwdd ZdejBCdbe$ e% e e gdd ZeejBCde$e@fe%e=fgdd ZfejBCde$e@fe%e=fgdd ZgejBCdbe$ e% e e gejBCddddgdd ZhejBCde$e@fe%e=fgdd Zidd Zjdd Zkdd Zldd ZmdS )z,
Testing for the partial dependence module.
    N)BaseEstimatorClassifierMixincloneis_regressor)KMeans)make_column_transformer)	load_irismake_classificationmake_regression)DummyClassifier)GradientBoostingClassifierGradientBoostingRegressorHistGradientBoostingClassifierHistGradientBoostingRegressorRandomForestRegressor)NotFittedError)partial_dependence)_grid_from_X_partial_dependence_brute_partial_dependence_recursion)LinearRegressionLogisticRegressionMultiTaskLasso)r2_score)make_pipeline)PolynomialFeaturesRobustScalerStandardScalerscale)DecisionTreeRegressor)assert_is_subtree)	_IS_32BIT)assert_allcloseassert_array_equal)check_random_state      2   )	n_samplesrandom_state   )r*   	n_classesn_clusters_per_classr+   )r*   	n_targetsr+   zEstimator, method, dataautobrutegrid_resolution)   
   featureskind)average
individualbothc                    s*  |  }t |dr|jdd |\\}}}	|jd }
||| t||||| d}||d  }}|	f fddtt|D }|	|
f fd	dtt|D }|d
kr|jj|kstn:|dkr|j	j|kstn |jj|kst|j	j|kstt| f}|d k	stt
|j|ks&td S )Nn_estimatorsr(   )r:   r   )Xr5   methodr6   r2   grid_valuesc                    s   g | ]} qS  r>   .0_r2   r>   q/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/sklearn/inspection/tests/test_partial_dependence.py
<listcomp>s   s     z%test_output_shape.<locals>.<listcomp>c                    s   g | ]} qS r>   r>   r?   rB   r>   rC   rD   w   s     r7   r8   )hasattrZ
set_paramsshapefitr   rangelenr7   AssertionErrorr8   npasarray)	Estimatorr<   datar2   r5   r6   estr;   yr/   Zn_instancesresultpdpaxesZexpected_pdp_shapeZexpected_ice_shapeZexpected_axes_shaper>   rB   rC   test_output_shapeC   s<    

 rT   c                  C   sN  d} d}ddg}t ddgddgg}t|| ||\}}t|ddgddgddgddgg t||j t jd}d	}|jd
d}t|| ||d\}}|j|| |jd fkst	t |jd|fkst	d}d||d d df< |
| t|| ||d\}}|j|| |jd fkst	|d j|fks4t	|d j|fksJt	d S )N皙?ffffff?d   Fr'   r(   r,      r      )   r(   sizerB      90  )rK   rL   r   r#   TrandomRandomStatenormalrF   rJ   shuffle)percentilesr2   is_categoricalr;   gridrS   rngZn_unique_valuesr>   r>   rC   test_grid_from_X   s<    "   

   
ri   rX   c              
   C   sr   t d}d}dg}|dddddddd	gi}t|||| d
\}}|jd|jd fks\t|d jdksntdS )jCheck that `_grid_from_X` always sample from categories and does not
    depend from the percentiles.
    pandasrU   TZcat_featureABCDErB   r3   r'   r   )r3   N)pytestimportorskip	DataFramer   rF   rJ   )r2   pdre   rf   r;   rg   rS   r>   r>   rC   !test_grid_from_X_with_categorical   s    
   
ru   c                 C   s   t d}d}ddg}|ddddddd	dddg
d
d
d
dddddddg
d}| }t|||| d\}}| dkr|jdkst|d jd |d kst|d
 jd | kstnB|jdkst|d jd |d kst|d
 jd |d kstdS )rj   rk   rU   TFrl   rm   rn   ro   rp   r'   r(   r3         )catnumrB   r,   )rZ   r(   r   ry   )   r(   rx   N)rq   rr   rs   nuniquer   rF   rJ   )r2   rt   re   rf   r;   r{   rg   rS   r>   r>   rC   #test_grid_from_X_heterogeneous_type   s,    
   
r|   z%grid_resolution, percentiles, err_msg)r(   )r   g-C6?zpercentiles are too close)rX   )r'   r(   r,   rY   .'percentiles' must be a sequence of 2 elements)rX   r_   r}   )rX   )r&   rW   ('percentiles' values must be in \[0, 1\])rX   )rV   r(   r~   )rX   )g?皙?z+percentiles\[0\] must be strictly less than)r'   rU   z1'grid_resolution' must be strictly greater than 1c              	   C   sH   t ddgddgg}dg}tjt|d t||||  W 5 Q R X d S )Nr'   r(   r,   rY   Fmatch)rK   rL   rq   raises
ValueErrorr   )r2   re   err_msgr;   rf   r>   r>   rC   test_grid_from_X_error   s    r   target_featurer3   zest, methodr+   	recursionc                 C   s   t dddd\}}||  }| || tj|gtjd}tdgdgg}|dkrnt| |||dd	\}}nt| ||}g }	d
D ]0}
| }|
|d d |f< |		| 
|  q|d }|dkrdnd}tj||	|dstd S )Nr   r3   )r+   
n_featuresZn_informativedtype      ?{   r1   r0   )response_method)r   r   r   r   gMbP?)rtol)r
   meanrG   rK   arrayint32r   r   copyappendpredictZallcloserJ   )rO   r<   r   r;   rP   r5   rg   rR   ZpredictionsZmean_predictionsvalZX_r   r>   r>   rC   test_partial_dependence_helpers   s,        r   seedc                 C   sr  t j| }d}d}|||}||d }||  }d}d}tdd d||d}t|t t j	j
}	tddd||	d	}
t||	d
}||| |
|| ||| z(t|j|
d j t|j|d j W n" tk
r   tstdY d S X |ddd}t|D ]X}t j|gt j	d}t|||}t|
||}t|||}t j|| t j|| qd S )N  r3   r4   r   r'   F)r:   Zmax_featuresZ	bootstrap	max_depthr+   Zsquared_error)r:   Zlearning_rate	criterionr   r+   )r   r+   )r   r   z)this should only fail on 32 bit platformsr)   r&   r   )rK   ra   rb   Zrandnr   r   r$   randintZiinfor   maxr   r   rG   r    Ztree_rJ   r!   reshaperH   r   r   testingr"   )r   rh   r*   r   r;   rP   r   Z	tree_seedZforestZequiv_random_stateZgbdttreerg   fr5   Z
pdp_forestZpdp_gbdtZpdp_treer>   r>   rC   /test_recursion_decision_tree_vs_forest_and_gbdt*  sR    
r   rO   )r   r'   r(   r,   rY   r3   c                 C   sv   t dddd\}}t|dks$t| || t| ||gdddd}t| ||gdd	dd}t|d |d d
d d S )Nr(   r'   r-   r.   r+   r   Zdecision_functionr   r7   )r   r<   r6   r1   gHz>)Zatol)r	   rK   r   rJ   rG   r   r"   )rO   r   r;   rP   Zpreds_1Zpreds_2r>   r>   rC    test_recursion_decision_functionq  s(    	r   )r+   Zmin_samples_leafZmax_leaf_nodesmax_iterpower)r'   r(   c                 C   s   t jd}d}d}|j|dfd}|d d |f | }| || t| |g|ddd}|d	 d d
d}|d d }	t|d|}t	 ||	}
t
|	|
|}|dkstd S )Nr      r(   r3   r\   r   r7   )r5   r;   r2   r6   r=   r&   r'   )ZdegreeGz?)rK   ra   rb   rc   rG   r   r   r   fit_transformr   r   r   rJ   )rO   r   rh   r*   Ztarget_variabler;   rP   rR   Znew_XZnew_ylrr2r>   r>   rC   #test_partial_dependence_easy_target  s&        r   rM   c              	   C   s`   t dddd\}}t||gj}|  }||| tjtdd t||dg W 5 Q R X d S )Nr,   r'   r   r   z3Multiclass-multioutput estimators are not supportedr   )	r	   rK   r   r`   rG   rq   r   r   r   )rM   r;   rP   rO   r>   r>   rC   test_multiclass_multioutput  s     r   c                   @   s   e Zd Zdd ZdS ) NoPredictProbaNoDecisionFunctionc                 C   s   ddg| _ | S )Nr   r'   )Zclasses_)selfr;   rP   r>   r>   rC   rG     s    
z$NoPredictProbaNoDecisionFunction.fitN)__name__
__module____qualname__rG   r>   r>   r>   rC   r     s   r   zignore:A Bunch will be returnedzestimator, params, err_msg)r+   Zn_initz4'estimator' must be a fitted regressor or classifierZpredict_proba)r5   r   z7The response_method parameter is ignored for regressors)r5   r   r<   zC'recursion' method, the response_method must be 'decision_function'r8   )r5   r<   r6   zCThe 'recursion' method only applies when 'kind' is set to 'average'r9   )r5   r<   z=Only the following estimators support the 'recursion' method:c              	   C   sF   t dd\}}| || tjt|d t| |f| W 5 Q R X d S )Nr   r   r   r	   rG   rq   r   r   r   )	estimatorparamsr   r;   rP   r>   r>   rC   test_partial_dependence_error  s    .r   r   i'  c              	   C   sJ   t dd\}}| || d}tjt|d t| ||g W 5 Q R X d S )Nr   r   zall features must be inr   r   )r   r5   r;   rP   r   r>   r>   rC   /test_partial_dependence_unknown_feature_indices  s
    r   c              	   C   sb   t d}tdd\}}||}| || dg}d}t jt|d t| || W 5 Q R X d S )Nrk   r   r   ra   z/A given column is not a column of the dataframer   )rq   rr   r	   rs   rG   r   r   r   )r   rt   r;   rP   dfr5   r   r>   r>   rC   .test_partial_dependence_unknown_feature_string&  s    

r   c                 C   s4   t dd\}}| || t| t|dgdd d S )Nr   r   r7   )r6   )r	   rG   r   list)r   r;   rP   r>   r>   rC   test_partial_dependence_X_list5  s    r   c               	   C   sz   t t dd} | tt tjtdd t| tdgddd W 5 Q R X tjtdd t| tdgddd W 5 Q R X d S )Nr   )initr+   z9Using recursion method with a non-constant init predictorr   r   r7   )r<   r6   )	r   r   rG   r;   rP   rq   warnsUserWarningr   )Zgbcr>   r>   rC   (test_warning_recursion_non_constant_init?  s      r   c            	      C   s   d} t jd}|jd| td}|| }| }||   || < t j||f }t | }d||< t	ddd}|j
|||d	 t||dgd
d}t |d
 |d d dkstd S )Nr   i@ r(   )r]   r   g     @@r4   r'   )r:   r+   sample_weightr7   )r5   r6   r=   )r   r'   r   )rK   ra   rb   r   boolZrandr   Zc_onesr   rG   r   ZcorrcoefrJ   )	Nrh   maskxrP   r;   r   clfrR   r>   r>   rC   9test_partial_dependence_sample_weight_of_fitted_estimatorQ  s    

r   c               	   C   sR   t dd} | jtttttd tjt	dd t
| tdgd W 5 Q R X d S )Nr'   r   r   z#does not support partial dependencer   r5   )r   rG   r;   rP   rK   r   rI   rq   r   NotImplementedErrorr   )r   r>   r>   rC   test_hist_gbdt_sw_not_supportedk  s    
 r   c                  C   s   t  } t }tdd}t||}||| j| j || j| j d}t|| j|gddd}t||	| j|gddd}t
|d |d  t
|d d |d d |j|  |j|   d S )N*   r   r   r4   r7   r5   r2   r6   r=   )r   r   r   r   rG   r   rN   targetr   Z	transformr"   scale_mean_)irisscalerr   piper5   pdp_pipepdp_clfr>   r>   rC    test_partial_dependence_pipelinev  s4    

    

r   r   r   r+   )r+   r:   zestimator-brutezestimator-recursion)Zidspreprocessorc                 C   s   g | ]}t j| qS r>   r   feature_namesr@   ir>   r>   rC   rD     s     rD   r   r(   c                 C   s   g | ]}t j| qS r>   r   r   r>   r>   rC   rD     s     r'   r,   c                 C   s   g | ]}t j| qS r>   r   r   r>   r>   rC   rD     s     Zpassthrough)	remainderNonezcolumn-transformerzcolumn-transformer-passthroughc                 C   s   g | ]}t j| qS r>   r   r   r>   r>   rC   rD     s     zfeatures-integerzfeatures-stringc                 C   s  t d}|jttjtjd}t|| }||tj	 t
|||ddd}|d k	rjt||}ddg}n|}ddg}t| |tj	}	t
|	||d	ddd
}
t|d |
d  |d k	r|jd }t|d d |
d d |jd  |jd   nt|d d |
d d  d S )Nrk   columnsr4   r7   r   r   r'   r(   r1   )r5   r<   r2   r6   Zstandardscalerr=   )rq   rr   rs   r   r   rN   r   r   rG   r   r   r   r   r"   Znamed_transformers_r   r   )r   r   r5   rt   r   r   r   ZX_procZfeatures_clfr   r   r   r>   r>   rC   !test_partial_dependence_dataframe  sB    

    
	

r   zfeatures, expected_pd_shape)r   r,   r4   r   )r,   r4   r4   c                 C   s   g | ]}t j| qS r>   r   r   r>   r>   rC   rD     s     TFz
scalar-intz
scalar-strzlist-intzlist-strr   c                 C   s   t d}|jtjtjd}tt dd dD ft dd dD f}t	|t
dd	d
}||tj t||| ddd}|d j|kstt|d t|d jd kstd S )Nrk   r   c                 S   s   g | ]}t j| qS r>   r   r   r>   r>   rC   rD     s     z8test_partial_dependence_feature_type.<locals>.<listcomp>r   c                 S   s   g | ]}t j| qS r>   r   r   r>   r>   rC   rD     s     r   r   r   r   r4   r7   r   r=   r'   )rq   rr   rs   r   rN   r   r   r   r   r   r   rG   r   r   rF   rJ   rI   )r5   Zexpected_pd_shapert   r   r   r   r   r>   r>   rC   $test_partial_dependence_feature_type  s(    
 
    r   c              	   C   s   t j}tt ddgft ddgf}t|| }tjtdd t	||ddgdd W 5 Q R X tjtdd t	| |ddgdd W 5 Q R X d S )	Nr   r(   r'   r,   zis not fitted yetr   r4   )r5   r2   )
r   rN   r   r   r   r   rq   r   r   r   )r   r;   r   r   r>   r>   rC    test_partial_dependence_unfitted  s    
 
r   zEstimator, datac           	      C   sj   |  }|\\}}}| || t||ddgdd}t||ddgdd}tj|d dd}t||d  d S )Nr'   r(   r7   r;   r5   r6   r8   )Zaxis)rG   r   rK   r   r"   )	rM   rN   rO   r;   rP   r/   pdp_avgpdp_indZavg_indr>   r>   rC   +test_kind_average_and_average_of_individual  s    r   c           	      C   s   |  }|\\}}}t |jd }||| t||ddgdd}t||ddgd|d}t|d |d  t|d |d  dS )	zDCheck that `sample_weight` does not have any effect on reported ICE.r   r'   r(   r8   r   )r;   r5   r6   r   r=   N)rK   ZarangerF   rG   r   r"   )	rM   rN   rO   r;   rP   r/   r   Zpdp_nswpdp_swr>   r>   rC   =test_partial_dependence_kind_individual_ignores_sample_weight   s    	    r   non_null_weight_idxc                 C   s   t jt j }}tt ddgft ddgf}t|| ||}t	|}d||< t
||ddgd|dd}t
||ddgddd	}t|rdntt|}	t|	D ]"}
t|d |
 | |d |
  qd
S )a   Check that if we pass a `sample_weight` of zeros with only one index with
    sample weight equals one, then the average `partial_dependence` with this
    `sample_weight` is equal to the individual `partial_dependence` of the
    corresponding index.
    r   r(   r'   r,   r7   r4   )r6   r   r2   r8   )r6   r2   N)r   rN   r   r   r   r   r   rG   rK   Z
zeros_liker   r   rI   uniquerH   r"   )r   r   r;   rP   r   r   r   r   r   Z
output_dimr   r>   r>   rC   +test_partial_dependence_non_null_weight_idx6  s.     

r   c                 C   s   |  }|\\}}}| || d|ddgdd }}t|f|d|i}tt|}t|f|d|i}	t|d |	d  dtt| }t|f|d|i}
t|d |
d  dS )zFCheck that `sample_weight=None` is equivalent to having equal weights.Nr'   r(   r7   r   r   )rG   r   rK   r   rI   r"   )rM   rN   rO   r;   rP   r/   r   r   Zpdp_sw_noneZpdp_sw_unitZpdp_sw_doublingr>   r>   rC   7test_partial_dependence_equivalence_equal_sample_weight_  s    
r   c               	   C   sb   t  } t\\}}}t|}| || tjtdd" t| |dg|dd dd W 5 Q R X dS )zjCheck that we raise an error when the size of `sample_weight` is not
    consistent with `X` and `y`.
    zsample_weight.shape ==r   r   r'   Nr4   )r5   r   r2   )	r   binary_classification_datarK   	ones_likerG   rq   r   r   r   rO   r;   rP   r/   r   r>   r>   rC   0test_partial_dependence_sample_weight_size_errorw  s    
   
 r   c               	   C   s^   t  } t\\}}}t|}| j|||d tjtdd t| |dgd|d W 5 Q R X dS )zaCheck that we raise an error when `sample_weight` is provided with
    `"recursion"` method.
    r   z+'recursion' method can only be applied whenr   r   r   )r5   r<   r   N)	r   regression_datarK   r   rG   rq   r   r   r   r   r>   r>   rC   4test_partial_dependence_sample_weight_with_recursion  s    
    r   c               	   C   s   t  } t\\}}}| || t| |ddgdd}d}t  tdt |d }W 5 Q R X tj	t|d |d	 }W 5 Q R X ||kst
d
S )z@Test that deprecation warning is raised when values is accessed.r'   r(   r7   r   z`Key: 'values', is deprecated in 1.3 and will be removed in 1.5. Please use 'grid_values' insteaderrorr=   r   valuesN)r   r   rG   r   warningscatch_warningssimplefilterFutureWarningrq   r   rJ   )rO   r;   rP   rA   r   msgr=   r   r>   r>   rC   /test_partial_dependence_bunch_values_deprecated  s    
r   c               	   C   s   t jdddt jgtddd} t ddddg}ddlm} t|dd	t 	| |}t
jtd
d t|| dgd W 5 Q R X dS )znCheck that we raise a proper error when a column has mixed types and
    the sorting of `np.unique` will fail.rl   rm   rn   r   r&   r'   r   )OrdinalEncoder)Zencoded_missing_valuez'The column #0 contains mixed data typesr   r   N)rK   r   nanobjectr   sklearn.preprocessingr   r   r   rG   rq   r   r   r   )r;   rP   r   r   r>   r>   rC   test_mixed_type_categorical  s      r  )n__doc__r   numpyrK   rq   ZsklearnZsklearn.baser   r   r   r   Zsklearn.clusterr   Zsklearn.composer   Zsklearn.datasetsr   r	   r
   Zsklearn.dummyr   Zsklearn.ensembler   r   r   r   r   Zsklearn.exceptionsr   Zsklearn.inspectionr   Z&sklearn.inspection._partial_dependencer   r   r   Zsklearn.linear_modelr   r   r   Zsklearn.metricsr   Zsklearn.pipeliner   r  r   r   r   r   Zsklearn.treer   Zsklearn.tree.tests.test_treer    Zsklearn.utilsr!   Zsklearn.utils._testingr"   r#   Zsklearn.utils.validationr$   r;   rP   r   Zmulticlass_classification_datar   Zmultioutput_regression_datar   markZparametrizerT   ri   ru   r|   r   rH   r   r   r   r   r   ZDecisionTreeClassifierZExtraTreeClassifierZensembleZExtraTreesClassifierZ	neighborsZKNeighborsClassifierZRadiusNeighborsClassifierZRandomForestClassifierr   r   filterwarningsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r>   r>   r>   rC   <module>   s  (   /'



,
F   





, 	 
 


+

	


	
