a
    h҂                     @   s   d Z ddlZddlm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mZmZmZ ddlmZmZmZmZmZmZ dd	lmZmZ dd
lmZmZmZm Z  ddl!m"Z"m#Z# ddl$m%Z%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z; ddl<m=Z= ddl>m?Z?m@Z@mAZA ddlBmCZCmDZDmEZE e ZFeFjGeFjH ZIZJe ZKeKjGeKjH ZLZMeddd\ZNZOeddd\ZPZQejRSdde+ddddgejRSddeddgejRSdd dgd!d" ZTd#d$ ZUd%d& ZVd'd( ZWejRSdde*ddddgejRSd)di feddi fe d*difgejRSdd dgd+d, ZXejRSd-eCeD eE d.d/ ZYejRSd-eCeD eE d0d1 ZZd2d3 Z[G d4d5 d5eeZ\G d6d7 d7eeZ]ejRSd8eMd9g ie^d:feMd;e& fd<e4d=d>fgd?d@e^dAfeMd9d;e& fdBe] fgie_dCfeMd;e& fdBe5d=d>fge] dDe_dCfgdEdF Z`ejRSd8eJd9g ie^d:feJd9d;e% fdBe\ fgie_dCfeJd;e% fdBe6 fge\ dDe_dCfgdGdH ZaejRjSdIed;e&ddfd<e5ddfgdJeLddK eMddK fe d;e% fd<e6ddfgdJeIeJfgdLdMgdNdOdP ZbdQdR ZcejRjSdSed;e& fd<e5ddfge& e*dddTdUgeddVR e d;e% fd<e6ddfge% e*dddTdUeIeJfgdLdMgdNdWdX ZddYdZ ZeejRfd[ejRjSdSed;e& fd<e5ddfge& dDgeddVR e d;e% fd<e6ddfge% dDeIeJfgdLdMgdNd\d] ZgejRSd^eed?e&ddeLeMfe ed_e% eIeJfgd`da ZhejRSdSed;e& fd<e4 fgdbdceLeMfe d;e% fd<e6 fgdbdceIeJfgddde ZiejRSdfeee&fee e%fgdgdh ZjejRjSdie0ddeddgdjdkgdNdldm Zkdndo ZlejRSdpdqd_gejRSdd dgdrds ZmejRjSdted;e&ddfd<e5ddfgdJeKjneLeMg dufed;e&ddfdvd<e5ddfgdJeKjneLddK eMddK dwdxgfe d;e% fd<e6ddfgdJeFjneIeJdydzgfgg d{dNejRSddd gd|d} Zod~d Zpdd ZqejRSdee8fe e9fgdd ZrejRSdee8fe e9fgedddd ZsejRSdee8fe e9fgejRSddeteLjud fdgedddd ZvejRSdee8fe e9fgedddd ZwdS )z+Test the stacking classifier and regressor.    N)Mock)assert_array_equal)sparse)config_context)BaseEstimatorClassifierMixinRegressorMixinclone)load_breast_cancerload_diabetes	load_irismake_classificationmake_multilabel_classificationmake_regression)DummyClassifierDummyRegressor)RandomForestClassifierRandomForestRegressorStackingClassifierStackingRegressor)ConvergenceWarningNotFittedError)LinearRegressionLogisticRegressionRidgeRidgeClassifier)KFoldStratifiedKFoldtrain_test_split)KNeighborsClassifier)MLPClassifier)scale)SVC	LinearSVC	LinearSVR)ConsumingClassifierConsumingRegressor	_Registrycheck_recorded_metadata)CheckingClassifier)assert_allcloseassert_allclose_dense_sparseignore_warnings)COO_CONTAINERSCSC_CONTAINERSCSR_CONTAINERS   *   )Z	n_classesrandom_state   cvT)Zn_splitsshuffler2   final_estimatorr2   passthroughFc                 C   sH  t ttttdd\}}}}dt fdt fg}t||| |d}||| || |	| |
||dkstJ ||}	|rdnd}
|	jd	 |
ksJ |rt||	d d d
d f  |jdd ||| || |	| |d u r|| ||}	|rdnd}|	jd	 |ks$J |rDt||	d d d
d f  d S )Nr1   Zstratifyr2   lrsvc
estimatorsr6   r4   r8   皙?
         dropr:      r0   )r   r!   X_irisy_irisr   r#   r   fitpredictpredict_probascore	transformshaper*   
set_paramsdecision_function)r4   r6   r8   X_trainX_testy_trainy_testr=   clfX_transexpected_column_countexpected_column_count_drop rX   `/var/www/html/assistant/venv/lib/python3.9/site-packages/sklearn/ensemble/tests/test_stacking.pytest_stacking_classifier_irisC   s<    







rZ   c            	      C   s   t dd\} }tt| ||dd\}}}}dt fdtddfg}t|dd	}||| ||}|jd
 dksvJ dt fdt	 fg}|j
|d ||| ||}|jd
 dksJ d S )NTZ
return_X_yr1   r9   r:   rfr7   r0   r=   r4   rA   r3   r;   r=   )r
   r   r!   r   r   r   rH   rL   rM   r#   rN   )	XyrP   rQ   rR   _r=   rT   rU   rX   rX   rY   :test_stacking_classifier_drop_column_binary_classificationq   s     

rb   c                  C   s   t ttttdd\} }}}ddtddfg}tddd}tdtddfg|d	d
}t||d	d
}|| | || | t|	||	| t|
||
| t|||| d S )Nr1   r9   r:   rC   r;   r   r7   r?   Zn_estimatorsr2      r=   r6   r4   )r   r!   rF   rG   r#   r   r   rH   r*   rI   rJ   rL   )rP   rQ   rR   ra   r=   r\   rT   Zclf_droprX   rX   rY   'test_stacking_classifier_drop_estimator   s     rg   c                  C   s   t tttdd\} }}}ddtddfg}tddd}tdtddfg|dd	}t||dd	}|| | || | t|	||	| t|
||
| d S )
Nr1   r7   rc   svrr   r?   rd   re   rf   )r   r!   
X_diabetes
y_diabetesr$   r   r   rH   r*   rI   rL   )rP   rQ   rR   ra   r=   r\   regZreg_droprX   rX   rY   &test_stacking_regressor_drop_estimator   s    
rl   zfinal_estimator, predict_paramsZ
return_stdc                 C   s2  t tttdd\}}}}dt fdt fg}t||| |d}	|	|| |	j|fi |}
|rddnd}|r|t	|
|ks|J |	
|}|rdnd}|jd |ksJ |rt||d d d	d f  |	jd
d |	|| |	| |	
|}|rdnd}|jd |ksJ |r.t||d d d	d f  d S )Nr1   r7   r:   rh   r<   r3   rA      rC   rD      )r   r!   ri   rj   r   r$   r   rH   rI   lenrL   rM   r*   rN   )r4   r6   Zpredict_paramsr8   rP   rQ   rR   ra   r=   rk   resultZexpected_result_lengthrU   rV   rW   rX   rX   rY    test_stacking_regressor_diabetes   s8    



rr   sparse_containerc           	      C   s   t | tttdd\}}}}dt fdt fg}tddd}t||ddd	}||| |	|}t
||d d d
d f  t|sJ |j|jksJ d S )Nr1   r7   r:   rh   r?   rd   re   Tr<   rn   )r   r!   ri   rj   r   r$   r   r   rH   rL   r+   r   issparseformat	rs   rP   rQ   rR   ra   r=   r\   rT   rU   rX   rX   rY   *test_stacking_regressor_sparse_passthrough   s    
rw   c           	      C   s   t | tttdd\}}}}dt fdt fg}tddd}t||ddd	}||| |	|}t
||d d d
d f  t|sJ |j|jksJ d S )Nr1   r7   r:   r;   r?   rd   re   Tr<   rB   )r   r!   rF   rG   r   r#   r   r   rH   rL   r+   r   rt   ru   rv   rX   rX   rY   +test_stacking_classifier_sparse_passthrough   s    
rx   c                  C   sh   t td d td d  } }dt fdt fg}t|d}|| | || }|jd dksdJ d S )Nd   r:   r\   r^   rA   r3   )	r!   rF   rG   r   r   r   rH   rL   rM   )ZX_Zy_r=   rT   ZX_metarX   rX   rY   )test_stacking_classifier_drop_binary_prob  s    

rz   c                   @   s   e Zd Zdd Zdd ZdS )NoWeightRegressorc                 C   s   t  | _| j||S N)r   rk   rH   selfr_   r`   rX   rX   rY   rH     s    zNoWeightRegressor.fitc                 C   s   t |jd S )Nr   )nponesrM   )r~   r_   rX   rX   rY   rI      s    zNoWeightRegressor.predictN)__name__
__module____qualname__rH   rI   rX   rX   rX   rY   r{     s   r{   c                   @   s   e Zd Zdd ZdS )NoWeightClassifierc                 C   s   t dd| _| j||S )NZ
stratified)Zstrategy)r   rT   rH   r}   rX   rX   rY   rH   %  s    zNoWeightClassifier.fitN)r   r   r   rH   rX   rX   rX   rY   r   $  s   r   zy, params, type_err, msg_errr=   zInvalid 'estimators' attribute,r:   svmiP  Zmax_iterrJ   )r=   stack_methodz+does not implement the method predict_probaZcorzdoes not support sample weightr=   r6   c                 C   sh   t j||dF tf i |ddi}|jtt| ttjd d W d    n1 sZ0    Y  d S Nmatchr4   r0   r   sample_weight)	pytestraisesr   rH   r!   rF   r   r   rM   )r`   paramstype_errmsg_errrT   rX   rX   rY   test_stacking_classifier_error*  s    *r   c                 C   sh   t j||dF tf i |ddi}|jtt| ttjd d W d    n1 sZ0    Y  d S r   )	r   r   r   rH   r!   ri   r   r   rM   )r`   r   r   r   rk   rX   rX   rY   test_stacking_regressor_errorY  s    r   zestimator, X, yr^   ry   r   r   )Zidsc                 C   s   t | }|jtdtjddd t | }|jdd |jtdtjddd t||||d d dd f |||| d S )NTr   r5   r2   r4   rC   rD   rA   )	r	   rN   r   r   randomZRandomStater*   rH   rL   )	estimatorr_   r`   Zestimator_fullZestimator_droprX   rX   rY   test_stacking_randomnessw  s     r   c                  C   s2   t dtddfdtddfgd} | tt d S )Nr:   i'  r   r   r^   )r   r   r#   rH   rF   rG   )rT   rX   rX   rY   )test_stacking_classifier_stratify_default  s    r   zstacker, X, yr   rf   r[   c                 C   sF  t |d }tdg| dgt ||   }t|||dd\}}}}}	}ttd | || W d    n1 sv0    Y  | |}
ttd( | j||t|j	d W d    n1 s0    Y  | |}t
|
| ttd  | j|||	d W d    n1 s0    Y  | |}t|
|  dksBJ d S )	Nr3   g?g?r1   r7   )categoryr   r   )rp   r   arrayr   r,   r   rH   rI   r   rM   r*   abssum)stackerr_   r`   Zn_half_samplesZtotal_sample_weightrP   rQ   rR   ra   Zsample_weight_trainZy_pred_no_weightZy_pred_unit_weightZy_pred_biasedrX   rX   rY    test_stacking_with_sample_weight  s$    !*
6

0
r   c                  C   s>   t dtddfgtddd} | jttttjd d d S )Nr:   T)Zexpected_sample_weightr   r   r   )r   r)   rH   rF   rG   r   r   rM   )r   rX   rX   rY   0test_stacking_classifier_sample_weight_fit_param  s
    r   z-ignore::sklearn.exceptions.ConvergenceWarningc                 C   s   t | }t | }|jdd |jdd ||| ||| t|j|jD ]\}}t|j|j qNtjt	dd" t|j
j|j
j W d    n1 s0    Y  d S )Nr0   r   re   z	Not equalr   )r	   rN   rH   zipestimators_r*   Zcoef_r   r   AssertionErrorfinal_estimator_)r   r_   r`   Zstacker_cv_3Zstacker_cv_5Zest_cv_3Zest_cv_5rX   rX   rY   test_stacking_cv_influence  s    !r   z7Stacker, Estimator, stack_method, final_estimator, X, yrI   c                 C   s   t ||ddd\}}}}	d| ||fd| ||fg}
|
D ]:\}}tdd|_t||}t|d}||_t||| q@| |
d	|d
}|||	 |jdd |
D ksJ tdd |jD sJ |jD ]}t||}|| qdS )z2Check the behaviour of stacking when `cv='prefit'`r1   g      ?)r2   Z	test_sizeZd0Zd1rH   )name)Zside_effectprefit)r=   r4   r6   c                 S   s   g | ]\}}|qS rX   rX   ).0ra   r   rX   rX   rY   
<listcomp>X      z(test_stacking_prefit.<locals>.<listcomp>c                 s   s   | ]}|j jd kV  qdS )r   N)rH   Z
call_count)r   r   rX   rX   rY   	<genexpr>Z  r   z'test_stacking_prefit.<locals>.<genexpr>N)	r   rH   r   getattrr   setattrr   allZassert_called_with)ZStacker	Estimatorr   r6   r_   r`   ZX_train1ZX_train2Zy_train1Zy_train2r=   ra   r   Z
stack_funcZpredict_method_mockedr   Zstack_func_mockrX   rX   rY   test_stacking_prefit*  s*    



r   r   r]   c                 C   s:   t t | || W d    n1 s,0    Y  d S r|   )r   r   r   rH   )r   r_   r`   rX   rX   rY   test_stacking_prefit_errorb  s    r   z!make_dataset, Stacking, Estimatorc                 C   s   G dd d|}| ddd\}}|d| fgd}|j  d}tjt|d	 |j W d    n1 sh0    Y  ||| d
}tjt|d	 |j W d    n1 s0    Y  d S )Nc                       s    e Zd ZdZ fddZ  ZS )z8test_stacking_without_n_features_in.<locals>.MyEstimatorz Estimator without n_features_in_c                    s   t  || | `d S r|   )superrH   n_features_in_r}   	__class__rX   rY   rH     s    z<test_stacking_without_n_features_in.<locals>.MyEstimator.fit)r   r   r   __doc__rH   __classcell__rX   rX   r   rY   MyEstimator  s   r   r   ry   )r2   Z	n_samplesr:   r^   z' object has no attribute n_features_in_r   z6'MyEstimator' object has no attribute 'n_features_in_')r   r   r   AttributeErrorr   rH   )Zmake_datasetZStackingr   r   r_   r`   r   msgrX   rX   rY   #test_stacking_without_n_features_in  s    $r   r   r    r   c           
      C   s   t tttdd\}}}}d}d| fg}t|t dd||}||}|j|jd |fks`J tt	
|jdd	d
r|J ||}	|	j|jksJ dS )zCheck the behaviour for the multilabel classification case and the
    `predict_proba` stacking method.

    Estimators are not consistent with the output arrays and we need to ensure that
    we handle all cases.
    r1   r9   r0   estrJ   r=   r6   r   r   rA   )Zaxisg      ?N)r   X_multilabely_multilabelr   r   rH   rL   rM   anyr   iscloser   rI   )
r   rP   rQ   rR   rS   	n_outputsr=   r   rU   y_predrX   rX   rY   1test_stacking_classifier_multilabel_predict_proba  s"    


r   c            	      C   s   t tttdd\} }}}d}dt fg}t|t dd| |}||}|j|jd |fksbJ |	|}|j|jks|J dS )	zCheck the behaviour for the multilabel classification case and the
    `decision_function` stacking method. Only `RidgeClassifier` supports this
    case.
    r1   r9   r0   r   rO   r   r   N)
r   r   r   r   r   r   rH   rL   rM   rI   )	rP   rQ   rR   rS   r   r=   r   rU   r   rX   rX   rY   5test_stacking_classifier_multilabel_decision_function  s     

r   r   autoc                 C   s  t tttdd\}}}}| }d}dtddfdtddfdt fg}t }	t||	|| d	||}
t
|| |
|}|j|jksJ | d	krg d
}ndgt| }|
j|ksJ |t| }|r||jd 7 }|
|}|j|jd |fksJ t
|
jtddgg|  dS )zCheck the behaviour for the multilabel classification case for stack methods
    supported for all estimators or automatically picked up.
    r1   r9   r0   Zmlpr7   r\   ridge)r=   r6   r8   r   r   )rJ   rJ   rO   rI   rA   r   N)r   r   r   copyr    r   r   r   r   rH   r   rI   rM   rp   Zstack_method_rL   Zclasses_r   r   )r   r8   rP   rQ   rR   rS   Zy_train_before_fitr   r=   r6   rT   r   Zexpected_stack_methodsZn_features_X_transrU   rX   rX   rY   0test_stacking_classifier_multilabel_auto_predict  s>    



r   z,stacker, feature_names, X, y, expected_names)Zstackingclassifier_lr0Zstackingclassifier_lr1Zstackingclassifier_lr2Zstackingclassifier_svm0Zstackingclassifier_svm1Zstackingclassifier_svm2)otherrC   Zstackingclassifier_lrZstackingclassifier_svmZstackingregressor_lrZstackingregressor_svm)ZStackingClassifier_multiclassZStackingClassifier_binaryr   c                 C   sF   | j |d | t|| |r.t||f}| |}t|| dS )z/Check get_feature_names_out works for stacking.)r8   N)rN   rH   r!   r   ZconcatenateZget_feature_names_outr   )r   feature_namesr_   r`   Zexpected_namesr8   Z	names_outrX   rX   rY   test_get_feature_names_out  s    B
r   c                  C   sf   t ttttdd\} }}}tdt fgd}|| | || || |	||dksbJ dS )zNCheck that a regressor can be used as the first layer in `StackingClassifier`.r1   r9   r   r^   r>   N)
r   r!   rF   rG   r   r   rH   rI   rJ   rK   )rP   rQ   rR   rS   rT   rX   rX   rY   'test_stacking_classifier_base_regressor\  s    

r   c                  C   s   t dd\} }dt fdtdddfg}tddd}t||dd}d	}d
}tjt|d"}|| ||  W d   n1 s0    Y  t	|j
jtsJ |t|j
jv sJ dS )a
  Check that we raise the proper AttributeError when the final estimator
    does not implement the `decision_function` method, which is decorated with
    `available_if`.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/28108
    r1   r7   r:   r\   r3   rd   r0   rf   z>This 'StackingClassifier' has no attribute 'decision_function'zD'RandomForestClassifier' object has no attribute 'decision_function'r   N)r   r   r   r   r   r   r   rH   rO   
isinstancevalue	__cause__str)r_   r`   r=   r6   rT   Z	outer_msgZ	inner_msgZ	exec_inforX   rX   rY   -test_stacking_final_estimator_attribute_errorh  s    0r   zEstimator, Childc                 C   sR   t jtdd0 | d| gjttg ddd W d   n1 sD0    Y  dS )zTest that the right error message is raised when metadata is passed while
    not supported when `enable_metadata_routing=False`.z1is only supported if enable_metadata_routing=Truer   rT   )rA   rA   rA   rA   rA   ar   metadataN)r   r   
ValueErrorrH   rF   rG   )r   ChildrX   rX   rY   *test_routing_passed_metadata_not_supported  s    r   )Zenable_metadata_routingc                 C   s   | d| fg}|   d S )Nsub_est)Zget_metadata_routing)r   r   r   rX   rX   rY   %test_get_metadata_routing_without_fit  s    
r   zprop, prop_valuer   )r   r   c              	   C   s(  | d|t  djf i |difd|t  djf i |difg|t  djf i |did}|jttfi ||i |jttfi ||i |jtfi ||i |jD ]@}|d j	}t
|sJ |D ] }tf |dd|d||i qq|jj	}t
|sJ tf |d	 d
d
|d||i dS )z5Test that metadata is routed correctly for Stacking*.Zsub_est1)registryTZsub_est2)r6   rA   rH   )objmethodparentZsplit_paramsrI   N)r'   Zset_fit_requestZset_predict_requestrH   rF   rG   Zfit_transformrI   r=   r   rp   r(   r   )r   r   propZ
prop_valuer   r   r   r   rX   rX   rY   -test_metadata_routing_for_stacking_estimators  sF    



r   c                 C   s~   t tjd d }}| d| fg}d|j d}tjtt	|d" |j
tt||d W d   n1 sp0    Y  dS )	zCTest that the right error is raised when metadata is not requested.r   r   r   zb[sample_weight, metadata] are passed but are not explicitly set as requested or not requested for z.fitr   r   N)r   r   rF   rM   r   r   r   r   reescaperH   rG   )r   r   r   r   r   error_messagerX   rX   rY   3test_metadata_routing_error_for_stacking_estimators  s    
r   )xr   r   Zunittest.mockr   numpyr   r   Znumpy.testingr   Zscipyr   Zsklearnr   Zsklearn.baser   r   r   r	   Zsklearn.datasetsr
   r   r   r   r   r   Zsklearn.dummyr   r   Zsklearn.ensembler   r   r   r   Zsklearn.exceptionsr   r   Zsklearn.linear_modelr   r   r   r   Zsklearn.model_selectionr   r   r   Zsklearn.neighborsr   Zsklearn.neural_networkr    Zsklearn.preprocessingr!   Zsklearn.svmr"   r#   r$   Z%sklearn.tests.metadata_routing_commonr%   r&   r'   r(   Zsklearn.utils._mockingr)   Zsklearn.utils._testingr*   r+   r,   Zsklearn.utils.fixesr-   r.   r/   Zdiabetesdatatargetri   rj   ZirisrF   rG   r   r   ZX_binaryZy_binarymarkZparametrizerZ   rb   rg   rl   rr   rw   rx   rz   r{   r   r   	TypeErrorr   r   r   r   r   r   filterwarningsr   r   r   r   r   r   r   r   r   r   r   r   r   r   rM   r   r   rX   rX   rX   rY   <module>   s   
'$

	)





	

	
	
#	


-

4<!
.