o
    ?Hh҂                     @   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   *   )	n_classesrandom_state   cvT)n_splitsshuffler3   final_estimatorr3   passthroughFc                 C   sF  t ttttdd\}}}}dt fdt fg}t||| |d}||| || |	| |
||dks:J ||}	|rCdnd}
|	jd	 |
ksNJ |r]t||	d d d
d f  |jdd ||| || |	| |d u r||| ||}	|rdnd}|	jd	 |ksJ |rt||	d d d
d f  d S d S )Nr1   stratifyr3   lrsvc
estimatorsr8   r5   r:   皙?
         dropr=      r0   )r   r!   X_irisy_irisr   r#   r   fitpredictpredict_probascore	transformshaper*   
set_paramsdecision_function)r5   r8   r:   X_trainX_testy_trainy_testr@   clfX_transexpected_column_countexpected_column_count_drop r[   d/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/sklearn/ensemble/tests/test_stacking.pytest_stacking_classifier_irisC   s>   







r]   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s;J dt fdt	 fg}|j
|d ||| ||}|jd
 dks_J d S )NT
return_X_yr1   r;   r=   rfr9   r0   r@   r5   rD   r4   r>   r@   )r
   r   r!   r   r   r   rK   rO   rP   r#   rQ   )	XyrS   rT   rU   _r@   rW   rX   r[   r[   r\   :test_stacking_classifier_drop_column_binary_classificationq   s    

rf   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   r;   r=   rF   r>   r   r9   rB   n_estimatorsr3      r@   r8   r5   )r   r!   rI   rJ   r#   r   r   rK   r*   rL   rM   rO   )rS   rT   rU   re   r@   r`   rW   clf_dropr[   r[   r\   'test_stacking_classifier_drop_estimator   s    rm   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   r9   rg   svrr   rB   rh   rj   rk   )r   r!   
X_diabetes
y_diabetesr$   r   r   rK   r*   rL   rO   )rS   rT   rU   re   r@   r`   regreg_dropr[   r[   r\   &test_stacking_regressor_drop_estimator   s   
rs   zfinal_estimator, predict_params
return_stdc                 C   s2  t tttdd\}}}}dt fdt fg}t||| |d}	|	|| |	j|fi |}
|r2dnd}|r>t	|
|ks>J |	
|}|rGdnd}|jd |ksRJ |rat||d d d	d f  |	jd
d |	|| |	| |	
|}|r{dnd}|jd |ksJ |rt||d d d	d f  d S d S )Nr1   r9   r=   rn   r?   r4   rD      rF   rG      )r   r!   ro   rp   r   r$   r   rK   rL   lenrO   rP   r*   rQ   )r5   r8   predict_paramsr:   rS   rT   rU   re   r@   rq   resultexpected_result_lengthrX   rY   rZ   r[   r[   r\    test_stacking_regressor_diabetes   s:   



r|   sparse_containerc           	      C      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|sFJ |j|jksNJ d S )Nr1   r9   r=   rn   rB   rh   rj   Tr?   rv   )r   r!   ro   rp   r   r$   r   r   rK   rO   r+   r   issparseformat	r}   rS   rT   rU   re   r@   r`   rW   rX   r[   r[   r\   *test_stacking_regressor_sparse_passthrough      
r   c           	      C   r~   )Nr1   r9   r=   r>   rB   rh   rj   Tr?   rE   )r   r!   rI   rJ   r   r#   r   r   rK   rO   r+   r   r   r   r   r[   r[   r\   +test_stacking_classifier_sparse_passthrough   r   r   c                  C   sh   t td d td d } }dt fdt fg}t|d}|| | || }|jd dks2J d S )Nd   r=   r`   rb   rD   r4   )	r!   rI   rJ   r   r   r   rK   rO   rP   )X_y_r@   rW   X_metar[   r[   r\   )test_stacking_classifier_drop_binary_prob  s   

r   c                   @   s   e Zd Zdd Zdd ZdS )NoWeightRegressorc                 C   s   t  | _| j||S N)r   rq   rK   selfrc   rd   r[   r[   r\   rK     s   zNoWeightRegressor.fitc                 C   s   t |jd S )Nr   )nponesrP   )r   rc   r[   r[   r\   rL      s   zNoWeightRegressor.predictN)__name__
__module____qualname__rK   rL   r[   r[   r[   r\   r     s    r   c                   @   s   e Zd Zdd ZdS )NoWeightClassifierc                 C   s   t dd| _| j||S )N
stratified)strategy)r   rW   rK   r   r[   r[   r\   rK   %  s   zNoWeightClassifier.fitN)r   r   r   rK   r[   r[   r[   r\   r   $  s    r   zy, params, type_err, msg_errr@   zInvalid 'estimators' attribute,r=   svmiP  max_iterrM   )r@   stack_methodz+does not implement the method predict_probacorzdoes not support sample weightr@   r8   c                 C   j   t j||d$ tdi |ddi}|jtt| ttjd d W d    d S 1 s.w   Y  d S Nmatchr5   r0   r   sample_weightr[   )	pytestraisesr   rK   r!   rI   r   r   rP   )rd   paramstype_errmsg_errrW   r[   r[   r\   test_stacking_classifier_error*  s   *""r   c                 C   r   r   )	r   r   r   rK   r!   ro   r   r   rP   )rd   r   r   r   rq   r[   r[   r\   test_stacking_regressor_errorY  s   ""r   zestimator, X, yrb   r   r   r   )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   r7   r3   r5   rF   rG   rD   )	r	   rQ   r   r   randomRandomStater*   rK   rO   )	estimatorrc   rd   estimator_fullestimator_dropr[   r[   r\   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   rb   )r   r   r#   rK   rI   rJ   )rW   r[   r[   r\   )test_stacking_classifier_stratify_default  s   r   zstacker, X, yr   rk   r^   c                 C   sB  t |d }tdg| dgt ||   }t|||dd\}}}}}	}ttd | || W d    n1 s;w   Y  | |}
ttd | j||t|j	d W d    n1 saw   Y  | |}t
|
| ttd | j|||	d W d    n1 sw   Y  | |}t|
|  dksJ d S )	Nr4   g?g?r1   r9   )categoryr   r   )rx   r   arrayr   r,   r   rK   rL   r   rP   r*   abssum)stackerrc   rd   n_half_samplestotal_sample_weightrS   rT   rU   re   sample_weight_trainy_pred_no_weighty_pred_unit_weighty_pred_biasedr[   r[   r\    test_stacking_with_sample_weight  s*   !



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)expected_sample_weightr   r   r   )r   r)   rK   rI   rJ   r   r   rP   )r   r[   r[   r\   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 q'tjt	dd t|j
j|j
j W d    d S 1 sOw   Y  d S )Nr0   r   rj   z	Not equalr   )r	   rQ   rK   zipestimators_r*   coef_r   r   AssertionErrorfinal_estimator_)r   rc   rd   stacker_cv_3stacker_cv_5est_cv_3est_cv_5r[   r[   r\   test_stacking_cv_influence  s   !"r   z7Stacker, Estimator, stack_method, final_estimator, X, yrL   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sWJ tdd |jD scJ |jD ]}t||}|| qfdS )z2Check the behaviour of stacking when `cv='prefit'`r1   g      ?)r3   	test_sized0d1rK   )name)side_effectprefit)r@   r5   r8   c                 S   s   g | ]\}}|qS r[   r[   ).0re   r   r[   r[   r\   
<listcomp>X  s    z(test_stacking_prefit.<locals>.<listcomp>c                 s   s    | ]	}|j jd kV  qdS )r   N)rK   
call_count)r   r   r[   r[   r\   	<genexpr>Z  s    z'test_stacking_prefit.<locals>.<genexpr>N)	r   rK   r   getattrr   setattrr   allassert_called_with)Stacker	Estimatorr   r8   rc   rd   X_train1X_train2y_train1y_train2r@   re   r   
stack_funcpredict_method_mockedr   stack_func_mockr[   r[   r\   test_stacking_prefit*  s,   



r   r   ra   c                 C   s<   t t | || W d    d S 1 sw   Y  d S r   )r   r   r   rK   )r   rc   rd   r[   r[   r\   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 s4w   Y  ||| d
}tjt|d	 |j W d    d S 1 sWw   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   )superrK   n_features_in_r   	__class__r[   r\   rK     s   z<test_stacking_without_n_features_in.<locals>.MyEstimator.fit)r   r   r   __doc__rK   __classcell__r[   r[   r   r\   MyEstimator  s    r   r   r   )r3   	n_samplesr=   rb   z' object has no attribute n_features_in_r   z6'MyEstimator' object has no attribute 'n_features_in_')r   r   r   AttributeErrorr   rK   )make_datasetStackingr   r   rc   rd   r   msgr[   r[   r\   #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s0J tt	
|jdd	d
r>J ||}	|	j|jksKJ 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   r;   r0   estrM   r@   r8   r   r   rD   )axisg      ?N)r   X_multilabely_multilabelr   r   rK   rO   rP   anyr   iscloser   rL   )
r   rS   rT   rU   rV   	n_outputsr@   r   rX   y_predr[   r[   r\   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s1J |	|}|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   r;   r0   r   rR   r   r   N)
r   r   r   r   r   r   rK   rO   rP   rL   )	rS   rT   rU   rV   r   r@   r   rX   r   r[   r[   r\   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sEJ | d	krNg d
}ndgt| }|
j|ks\J |t| }|rk||jd 7 }|
|}|j|jd |fks|J 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   r;   r0   mlpr9   r`   ridge)r@   r8   r:   r   r   )rM   rM   rR   rL   rD   r   N)r   r   r   copyr    r   r   r   r   rK   r   rL   rP   rx   stack_method_rO   classes_r   r   )r   r:   rS   rT   rU   rV   y_train_before_fitr   r@   r8   rW   r   expected_stack_methodsn_features_X_transrX   r[   r[   r\   0test_stacking_classifier_multilabel_auto_predict  s>   



 r  z,stacker, feature_names, X, y, expected_names)stackingclassifier_lr0stackingclassifier_lr1stackingclassifier_lr2stackingclassifier_svm0stackingclassifier_svm1stackingclassifier_svm2)otherrF   stackingclassifier_lrstackingclassifier_svmstackingregressor_lrstackingregressor_svm)StackingClassifier_multiclassStackingClassifier_binaryr   c                 C   sF   | j |d | t|| |rt||f}| |}t|| dS )z/Check get_feature_names_out works for stacking.)r:   N)rQ   rK   r!   r   concatenateget_feature_names_outr   )r   feature_namesrc   rd   expected_namesr:   	names_outr[   r[   r\   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s1J dS )zNCheck that a regressor can be used as the first layer in `StackingClassifier`.r1   r;   r   rb   rA   N)
r   r!   rI   rJ   r   r   rK   rL   rM   rN   )rS   rT   rU   rV   rW   r[   r[   r\   '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 s@w   Y  t	|j
jtsNJ |t|j
jv sXJ 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   r9   r=   r`   r4   rh   r0   rk   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   rK   rR   
isinstancevalue	__cause__str)rc   rd   r@   r8   rW   	outer_msg	inner_msg	exec_infor[   r[   r\   -test_stacking_final_estimator_attribute_errorh  s   r!  zEstimator, Childc                 C   sT   t jtdd | d| gjttg ddd W d   dS 1 s#w   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   rW   )rD   rD   rD   rD   rD   ar   metadataN)r   r   
ValueErrorrK   rI   rJ   )r   Childr[   r[   r\   *test_routing_passed_metadata_not_supported  s   "r'  )enable_metadata_routingc                 C   s   | d| fg}|   d S )Nsub_est)get_metadata_routing)r   r&  r   r[   r[   r\   %test_get_metadata_routing_without_fit  s   
r+  zprop, prop_valuer   )r$  r"  c              	   C   s&  | d|t  djdi |difd|t  djdi |difg|t  djd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
|scJ |D ]}td|dd|d||i qeqV|jj	}t
|sJ td|d	 d
d
|d||i dS )z5Test that metadata is routed correctly for Stacking*.sub_est1)registryTsub_est2)r8   rD   rK   )objmethodparentsplit_paramsrL   Nr[   )r'   set_fit_requestset_predict_requestrK   rI   rJ   fit_transformrL   r@   r-  rx   r(   r   )r   r&  prop
prop_valuer   r   r-  r)  r[   r[   r\   -test_metadata_routing_for_stacking_estimators  sH   


	
r9  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   dS 1 s9w   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   rI   rP   r   r   r   r%  reescaperK   rJ   )r   r&  r   r$  r   error_messager[   r[   r\   3test_metadata_routing_error_for_stacking_estimators  s   
"r=  )xr   r:  unittest.mockr   numpyr   r   numpy.testingr   scipyr   sklearnr   sklearn.baser   r   r   r	   sklearn.datasetsr
   r   r   r   r   r   sklearn.dummyr   r   sklearn.ensembler   r   r   r   sklearn.exceptionsr   r   sklearn.linear_modelr   r   r   r   sklearn.model_selectionr   r   r   sklearn.neighborsr   sklearn.neural_networkr    sklearn.preprocessingr!   sklearn.svmr"   r#   r$   %sklearn.tests.metadata_routing_commonr%   r&   r'   r(   sklearn.utils._mockingr)   sklearn.utils._testingr*   r+   r,   sklearn.utils.fixesr-   r.   r/   diabetesdatatargetro   rp   irisrI   rJ   r   r   X_binaryy_binarymarkparametrizer]   rf   rm   rs   r|   r   r   r   r   r   r%  	TypeErrorr   r   r   r   r   r   filterwarningsr   r   r   r   r   r   r  r  r  r  r!  r'  r+  r   rP   r9  r=  r[   r[   r[   r\   <module>   s    
'$

	
)




	


		
#	


-

4<!
.