a
    ;Zakn                     @   s6  d Z ddlZddlZddl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mZ ddl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*m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1 ddl0m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 d d!gd!d!gd!d gd"d"gd"d#gd#d"ggZ9g d$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 Z?ej@Ad*ej@Bd+ed,e;fed,e<fed-e;fed-e<fed,e=fed-e=fed-e=fed-e=fed-e>fed-e;fed-e<fed-e>fgej@Bd.d/ej@Bd0d"gd"d#gfej@Bd1d2d3d4 ZCd5d6 ZDej@Bd7g d8d9d: ZEej@Bd;eFd<ej@Bd=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@dA ZGej@BdBeFd"dCdD ZHej@BdEedd>edd>fej@Bd;dFdGdH ZIej@BdEe edd>edd"dd"dIedd>fej@BdJdKdLdM ZJej@BdNejKjLejKjMejNjOejPjQejPjRejNjSfdOdP ZTG dQdR dRe,e+ZUej@Ad*ej@BdSe d0d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d>dgdZdVd[feU dgd,dVd\feU dgdUdVd]feU dgd^dVd_fe dgdZd`dafe dgd?dbdcddfe dgd?dedcddfe dgd?d`dffgdgdh ZVej@Bdidjdkgdldm ZWej@Bdne edd>gej@Bd0d!dogdpdq ZXej@Bdne edd>gdrds ZYej@Bdne edd>gdtdu ZZdvdw Z[dxdy Z\dzd{ Z]d|d} Z^ej@jBdned~ddedd<dgddgdej@jBddee# dd dD fe$ dd dD fee# dd dD fddgg ddej@jBd0dd#gdd dD gddgddd Z_ej@jBdde?j`d dfdd#gdfdd dD dfg ddfgg dddd Zaej@Bdne e e e gdd Zbej@Bdee>fee;fgdd Zcdd ZddS )z,
Testing for the partial dependence module.
    N)partial_dependence)_grid_from_X_partial_dependence_brute_partial_dependence_recursion)GradientBoostingClassifier)GradientBoostingRegressor)RandomForestRegressor)HistGradientBoostingClassifier)HistGradientBoostingRegressor)LinearRegression)LogisticRegression)MultiTaskLasso)DecisionTreeRegressor)	load_iris)make_classificationmake_regression)KMeans)make_column_transformer)r2_score)PolynomialFeatures)StandardScaler)RobustScaler)scale)make_pipeline)DummyClassifier)BaseEstimatorClassifierMixinclone)NotFittedError)assert_allclose)assert_array_equal)	_IS_32BIT)check_random_state)assert_is_subtree      )r%   r%   r%   r&   r&   r&   2   )	n_samplesrandom_state   )r)   	n_classesn_clusters_per_classr*   )r)   	n_targetsr*   zignore:A Bunch will be returnedzEstimator, method, dataautobrutegrid_resolution)   
   featureskind)legacyaverage
individualbothc                    s@  |  }|\\}}}	|j d }
||| t||||| d}|dkrH|n
||d f\}}|	g fddtt|D R }|	|
g fddtt|D R }|dkr|j |ksJ nV|dkr|jj |ksJ n<|d	kr|jj |ksJ n"|jj |ksJ |jj |ksJ t| f}|d us&J t|j |ks<J d S )
Nr   )Xr4   methodr5   r1   r6   valuesc                    s   g | ]} qS  r=   .0_r1   r=   Olib/python3.9/site-packages/sklearn/inspection/tests/test_partial_dependence.py
<listcomp>s       z%test_output_shape.<locals>.<listcomp>c                    s   g | ]} qS r=   r=   r>   rA   r=   rB   rC   w   rD   r7   r8   )	shapefitr   rangelenr7   r8   npasarray)	Estimatorr;   datar1   r4   r5   estr:   yr.   Zn_instancesresultpdpaxesZexpected_pdp_shapeZexpected_ice_shapeZexpected_axes_shaper=   rA   rB   test_output_shapeC   s<    
	"rR   c                  C   s@  d} d}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sJ t |jd|fksJ d}d||d d df< |	| t|| |d\}}|j|| |jd fksJ |d j|fks&J |d j|fks<J d S )N皙?ffffff?d   r&   r'   r+      r      )   r'   sizerA      90  )
rI   rJ   r   r    TrandomRandomStatenormalrE   Zshuffle)percentilesr1   r:   gridrQ   rngZn_unique_valuesr=   r=   rB   test_grid_from_X   s&    "
re   z%grid_resolution, percentiles, err_msg))r'   )r   g-C6?zpercentiles are too close)rV   )r&   r'   r+   rW   .'percentiles' must be a sequence of 2 elements)rV   r]   rf   )rV   )r%   rU   ('percentiles' values must be in \[0, 1\])rV   )rT   r'   rg   )rV   )g?皙?z+percentiles\[0\] must be strictly less than)r&   rS   z1'grid_resolution' must be strictly greater than 1c                 C   sV   t ddgddgg}tjt|d t|| |d W d    n1 sH0    Y  d S )Nr&   r'   r+   rW   match)r1   rb   )rI   rJ   pytestraises
ValueErrorr   )r1   rb   err_msgr:   r=   r=   rB   test_grid_from_X_error   s    ro   target_featurer2   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sJ d S )Nr   r2   )r*   
n_featuresZn_informativedtype      ?{   r0   r/   )response_method)rv   rw   rr   rh   gMbP?)rtol)r   meanrF   rI   arrayint32r   r   copyappendpredictZallclose)rM   r;   rp   r:   rN   r4   rc   rP   ZpredictionsZmean_predictionsvalZX_ry   r=   r=   rB   test_partial_dependence_helpers   s$    
r   seedc                 C   sp  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y   tsJ dY d S 0 |ddd}t|D ]X}t j|gt j	d}t|||}t|
||}t|||}t j|| t j|| qd S )N  r2   r3   r   r&   F)n_estimatorsZmax_featuresZ	bootstrap	max_depthr*   Zsquared_error)r   Zlearning_rateZ	criterionr   r*   )r   r*   )r   r   z)this should only fail on 32 bit platformsr(   r%   rt   )rI   r_   r`   Zrandnrz   r   r"   randintZiinfor|   maxr   r   rF   r#   Ztree_AssertionErrorr!   reshaperG   r{   r   Ztestingr   )r   rd   r)   rs   r:   rN   r   Z	tree_seedZforestZequiv_random_stateZgbdttreerc   fr4   Z
pdp_forestZpdp_gbdtZpdp_treer=   r=   rB   /test_recursion_decision_tree_vs_forest_and_gbdt   sR    
r   rM   )r   r&   r'   r+   rW   r2   c                 C   sv   t dddd\}}t|dks$J | || t| ||gdddd}t| ||gdd	dd}t|d |d d
d d S )Nr'   r&   r,   r-   r*   rv   decision_functionrr   r7   )rx   r;   r5   r0   gHz>)Zatol)r   rI   rz   rF   r   r   )rM   rp   r:   rN   Zpreds_1Zpreds_2r=   r=   rB    test_recursion_decision_function:  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sJ d S )Nr      r'   r2   rZ   r   r7   )r4   r:   r1   r5   r<   r%   r&   )ZdegreeGz?)rI   r_   r`   ra   rF   r   r   r   fit_transformr   r   r   )rM   r   rd   r)   Ztarget_variabler:   rN   rP   Znew_XZnew_yZlrZr2r=   r=   rB   #test_partial_dependence_easy_target`  s    r   rK   c                 C   st   t dddd\}}t||gj}|  }||| tjtdd t||dg W d    n1 sf0    Y  d S )Nr+   r&   r   r   z3Multiclass-multioutput estimators are not supportedri   )	r   rI   r{   r^   rF   rk   rl   rm   r   )rK   r:   rN   rM   r=   r=   rB   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:   rN   r=   r=   rB   rF     s    
z$NoPredictProbaNoDecisionFunction.fitN)__name__
__module____qualname__rF   r=   r=   r=   rB   r     s   r   zestimator, params, err_msgz4'estimator' must be a fitted regressor or classifierZpredict_proba)r4   rx   z7The response_method parameter is ignored for regressors)r4   rx   r;   zC'recursion' method, the response_method must be 'decision_function'Zblahblahz=response_method blahblah is invalid. Accepted response_methodzBThe estimator has no predict_proba and no decision_function methodz*The estimator has no predict_proba method.r   z.The estimator has no decision_function method.)r4   r;   zEblahblah is invalid. Accepted method names are brute, recursion, autor8   )r4   r;   r5   zCThe 'recursion' method only applies when 'kind' is set to 'average'r9   z=Only the following estimators support the 'recursion' method:c                 C   s^   t dd\}}| || tjt|d" t| |fi | W d    n1 sP0    Y  d S )Nr   rq   ri   r   rF   rk   rl   rm   r   )	estimatorparamsrn   r:   rN   r=   r=   rB   test_partial_dependence_error  s    Gr   zwith_dataframe, err_msg)T'Only array-like or scalar are supported)Fr   c                 C   s|   t dd\}}| r&td}||}t ||}tjt|d& t||t	dddd W d    n1 sn0    Y  d S )Nr   rq   pandasri   r'   r&   r4   )
r   rk   importorskip	DataFramer   rF   rl   	TypeErrorr   slice)Zwith_dataframern   r:   rN   pdr   r=   r=   rB   #test_partial_dependence_slice_error  s    

r   r   i'  c                 C   s^   t dd\}}| || d}tjt|d t| ||g W d    n1 sP0    Y  d S )Nr   rq   zall features must be inri   r   )r   r4   r:   rN   rn   r=   r=   rB   /test_partial_dependence_unknown_feature_indices  s
    r   c                 C   sv   t d}tdd\}}||}| || dg}d}t jt|d t| || W d    n1 sh0    Y  d S )Nr   r   rq   r_   z/A given column is not a column of the dataframeri   )rk   r   r   r   rF   rl   rm   r   )r   r   r:   rN   dfr4   rn   r=   r=   rB   .test_partial_dependence_unknown_feature_string  s    

r   c                 C   s4   t dd\}}| || t| t|dgdd d S )Nr   rq   r7   )r5   )r   rF   r   list)r   r:   rN   r=   r=   rB   test_partial_dependence_X_list)  s    r   c                  C   s   t t dd} | tt tjtdd$ t| tdgddd W d    n1 sR0    Y  tjtdd$ t| tdgddd W d    n1 s0    Y  d S )Nr   )initr*   z9Using recursion method with a non-constant init predictorri   rr   r7   )r;   r5   )	r   r   rF   r:   rN   rk   warnsUserWarningr   )Zgbcr=   r=   rB   (test_warning_recursion_non_constant_init3  s    2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sJ d S )Nr   i@ r'   )r[   ru   g     @@r3   r&   )r   r*   sample_weightr7   )r4   r5   r<   )r   r&   r   )rI   r_   r`   r   boolZrandr}   Zc_onesr   rF   r   Zcorrcoef)	Nrd   maskxrN   r:   r   clfrP   r=   r=   rB   %test_partial_dependence_sample_weightE  s    

r   c                  C   sf   t dd} | jtttttd tjt	dd  t
| tdgd W d    n1 sX0    Y  d S )Nr&   rq   r   z#does not support partial dependenceri   r   )r
   rF   r:   rN   rI   r   rH   rk   rl   NotImplementedErrorr   )r   r=   r=   rB   test_hist_gbdt_sw_not_supported_  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*   rq   r   r3   r7   r4   r1   r5   r<   )r   r   r   r   rF   r   rL   targetr   Z	transformr   scale_mean_)irisscalerr   piper4   pdp_pipepdp_clfr=   r=   rB    test_partial_dependence_pipelinej  s,    



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=   rB   rC     rD   rC   r   r'   c                 C   s   g | ]}t j| qS r=   r   r   r=   r=   rB   rC     rD   r&   r+   c                 C   s   g | ]}t j| qS r=   r   r   r=   r=   rB   rC     rD   Zpassthrough)Z	remainder)Nonezcolumn-transformerzcolumn-transformer-passthroughc                 C   s   g | ]}t j| qS r=   r   r   r=   r=   rB   rC     rD   zfeatures-integerzfeatures-stringc                 C   s  t d}|jttjtjd}t|| }||tj	 t
|||ddd}|d urjt||}ddg}n|}ddg}t| |tj	}	t
|	||d	ddd
}
t|d |
d  |d ur|jd }t|d d |
d d |jd  |jd   nt|d d |
d d  d S )Nr   columnsr3   r7   r   r   r&   r'   r0   )r4   r;   r1   r5   Zstandardscalerr<   )rk   r   r   r   r   rL   r   r   rF   r   r   r   r   r   Znamed_transformers_r   r   )r   r   r4   r   r   r   r   ZX_procZfeatures_clfr   r   r   r=   r=   rB   !test_partial_dependence_dataframe  s:    



	

r   zfeatures, expected_pd_shape)r   r+   r3   r   )r+   r3   r3   c                 C   s   g | ]}t j| qS r=   r   r   r=   r=   rB   rC     rD   )TFTF)z
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sJ t|d t|d jd ksJ d S )Nr   r   c                 S   s   g | ]}t j| qS r=   r   r   r=   r=   rB   rC     rD   z8test_partial_dependence_feature_type.<locals>.<listcomp>r   c                 S   s   g | ]}t j| qS r=   r   r   r=   r=   rB   rC     rD   r   r   r   r   r3   r7   r   r<   r&   )rk   r   r   r   rL   r   r   r   r   r   r   rF   r   r   rE   rH   )r4   Zexpected_pd_shaper   r   r   r   r   r=   r=   rB   $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 d    n1 sf0    Y  tjtdd$ t	| |ddgdd W d    n1 s0    Y  d S )	Nr   r'   r&   r+   zis not fitted yetri   r3   )r4   r1   )
r   rL   r   r   r   r   rk   rl   r   r   )r   r:   r   r   r=   r=   rB    test_partial_dependence_unfitted  s    

2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:   r4   r5   r8   )Zaxis)rF   r   rI   rz   r   )	rK   rL   rM   r:   rN   r.   Zpdp_avgZpdp_indZavg_indr=   r=   rB   +test_kind_average_and_average_of_individual  s    r   c                  C   s   t  } t\\}}}| || d}tjt|d" t| |ddgd W d    n1 sX0    Y  tjt|d$ t| |ddgdd W d    n1 s0    Y  d S )NzCA Bunch will be returned in place of 'predictions' from version 1.1ri   r&   r'   )r:   r4   r6   r   )r   binary_classification_datarF   rk   r   FutureWarningr   )rM   r:   rN   r.   rn   r=   r=   rB   test_warning_for_kind_legacy  s    0r   )e__doc__ZnumpyrI   rk   ZsklearnZsklearn.inspectionr   Z&sklearn.inspection._partial_dependencer   r   r   Zsklearn.ensembler   r   r   r	   r
   Zsklearn.linear_modelr   r   r   Zsklearn.treer   Zsklearn.datasetsr   r   r   Zsklearn.clusterr   Zsklearn.composer   Zsklearn.metricsr   Zsklearn.preprocessingr   r   r   r   Zsklearn.pipeliner   Zsklearn.dummyr   Zsklearn.baser   r   r   Zsklearn.exceptionsr   Zsklearn.utils._testingr   r    Zsklearn.utilsr!   Zsklearn.utils.validationr"   Zsklearn.tree.tests.test_treer#   r:   rN   r   Zmulticlass_classification_dataZregression_dataZmultioutput_regression_datar   ZmarkfilterwarningsZparametrizerR   re   ro   rG   r   r   r   r   r   ZDecisionTreeClassifierZExtraTreeClassifierZensembleZExtraTreesClassifierZ	neighborsZKNeighborsClassifierZRadiusNeighborsClassifierZRandomForestClassifierr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r=   r=   r=   rB   <module>   s  (
0"

,
F









E
	



+


	

