o
    ?Hhj                     @   s,  d Z ddl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mZmZmZ ddlm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% ddl&m'Z' ddl(m)Z)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1m2Z2m3Z3 e4 Z5e5j6ddddf e5j7Z8Z9e% :e8Z;ej<dd\Z=Z>ej?@ddg idfde fgddgddfgdd ZAd d! ZBd"d# ZCd$d% ZDd&d' ZEd(d) ZFd*d+ ZGd,d- ZHd.d/ ZId0d1 ZJd2d3 ZKd4d5 ZLej?Md6d7d8 ZNd9d: ZOd;d< ZPd=d> ZQd?d@ ZRdAdB ZSej?@dCe8e9ede fdDedEdFfgfe=e>ede fdDedEdFfgfgdGdH ZTej?j@dIede fdJe/ddKfgdLededdKfdJe.ddKfgdLgdMdNgdOdPdQ ZUej?@dRede fdDedSdKfgddTededSdKfdDedSdKfgddTgdUdV ZVdWdX ZWej?@dYdZdd[g d\fd]d^id_d`gfgdadb ZXdcdd ZYej?@deee)fee*fgdfdg ZZej?@deee)fee*fgeddhdidj Z[ej?@deee)fee*fgej?@dkdldmgeddhdndo Z\ej?@deee)fee*fgeddhdpdq Z]dS )rz4Testing for the VotingClassifier and VotingRegressor    N)config_contextdatasets)BaseEstimatorClassifierMixinclone)make_multilabel_classification)DummyRegressor)RandomForestClassifierRandomForestRegressorVotingClassifierVotingRegressor)NotFittedError)LinearRegressionLogisticRegression)GridSearchCVcross_val_scoretrain_test_split)OneVsRestClassifier)
GaussianNB)KNeighborsClassifier)StandardScaler)SVC)ConsumingClassifierConsumingRegressor	_Registrycheck_recorded_metadata)DecisionTreeClassifierDecisionTreeRegressor)assert_almost_equalassert_array_almost_equalassert_array_equal      T)
return_X_yzparams, err_msg
estimatorszGInvalid 'estimators' attribute, 'estimators' should be a non-empty listlr   )r$   weightsz0Number of `estimators` and weights must be equalc                 C   sN   t di | }tjt|d |tt W d    d S 1 s w   Y  d S )Nmatch )r   pytestraises
ValueErrorfitXy)paramserr_msgensembler*   r*   b/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/sklearn/ensemble/tests/test_voting.py%test_voting_classifier_estimator_init0   s   "r5   c                  C   s   t dt fdt fgdd} d}d}tjt|d}| j W d    n1 s'w   Y  t|jjts5J |t	|jjv s?J t
| drFJ | tt t
| drSJ d S )	Nlr1lr2hardr$   voting1predict_proba is not available when voting='hard'3'VotingClassifier' has no attribute 'predict_proba'r(   predict_proba)r   r   r+   r,   AttributeErrorr=   
isinstancevalue	__cause__strhasattrr.   X_scaledr0   )eclf	inner_msg	outer_msg	exec_infor*   r*   r4   test_predictproba_hardvotingC   s   rI   c                  C   sb  t dt fdt fgdd} tdt fg}d}tjt|d d | t W d    n1 s1w   Y  tjt|d d | 	t W d    n1 sOw   Y  tjt|d d | 
t W d    n1 smw   Y  tjt|d	 d |t W d    n1 sw   Y  tjt|d	 d |
t W d    d S 1 sw   Y  d S )
Nr6   r7   softr9   drzfThis %s instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.r   r(   r   )r   r   r   r   r+   r,   r   predictr/   r=   	transformX_r)rE   eregmsgr*   r*   r4   test_notfittedU   s,   "rQ   c                 C   s`   t d| d}td| d}t }td|fd|fd|fgdd	}t|ttd
d}| dks.J dS )z7Check classification by majority label on dataset iris.	liblinear)solverrandom_state
   n_estimatorsrT   r%   rfgnbr8   r9   accuracyscoring?N)r   r	   r   r   r   r/   r0   meanglobal_random_seedclf1clf2clf3rE   scoresr*   r*   r4   test_majority_label_irisk   s   re   c                  C   s   t ddd} tdd}td| fd|fgdd}| tttd	 d
ks&J |tttd	 dks5J |tttd	 dksDJ dS )zECheck voting classifier selects smaller class label in tie situation.{   rR   )rT   rS   rT   r%   rX   r8   r9   I   r&   r!   N)r   r	   r   r.   r/   r0   rL   )ra   rb   rE   r*   r*   r4   test_tie_situationx   s   
"ri   c                 C   sd   t | d}td| d}t }td|fd|fd|fgdg dd	}t|ttd
d}| dks0J dS )z>Check classification by average probabilities on dataset iris.rg   rU   rV   r%   rX   rY   rJ   r!   r&   rU   r$   r:   r'   rZ   r[   r]   N)r   r	   r   r   r   rD   r0   r^   r_   r*   r*   r4   test_weights_iris   s   
rl   c                  C   sL  t dd} t dd}t ddd}td| fd|fd|fgg dd}tttd	d
\}}}}| |||}||||}	||||}
||||}tjt	||	|
gdg dd}t
||dd td| fd|fd|fgdd}td| fd|fd|fgg dd}||| ||| ||}||}t
||dd dS )zACheck weighted average regression prediction on diabetes dataset.r^   )strategymedianquantile皙?)rm   ro   rj   )r'   g      ?)	test_sizer   )axisr'   r&   decimalNr!   r!   r!   )r   r   r   rN   y_rr.   rL   npaverageasarrayr   )reg1reg2reg3rO   	X_r_trainX_r_test	y_r_trainy_r_test	reg1_pred	reg2_pred	reg3_pred	ereg_predavgereg_weights_noneereg_weights_equalereg_none_predereg_equal_predr*   r*   r4   test_weights_regressor   s8   



r   c              	   C   s0  t | d}td| d}t }tddgddgdd	gd
dgddgddgg}tg d}t||||g d t||||g d t||||g d td|fd|fd|fgdg dd}t||||g d td|fd|fd|fgdg dd}t||||g d dS )z6Manually check predicted class labels for toy dataset.rg   rU   rV   皙      333333ffffff333333皙皙?333333?g @gffffff?g@gffffff@)r!   r!   r!   r&   r&   r&   r%   rX   rY   r8   ru   rk   rJ   N)	r   r	   r   rw   arrayr    r.   rL   r   )r`   ra   rb   rc   r/   r0   rE   r*   r*   r4   test_predict_on_toy_problem   s,   
& r   c                  C   s  t dd} tdd}t }tddgddgddgd	d
gg}tg d}tddgddgddgddgg}tddgddgddgddgg}tddgddgddgddgg}d|d d  |d d  |d d  d  }d|d! d!  |d! d!  |d! d!  d  }	d|d d!  |d d!  |d d!  d  }
d|d" d!  |d" d!  |d" d!  d  }td#| fd$|fd%|fgd&g d'd(}||||}t||d d d!d) t|	|d! d! d!d) t|
|d d! d!d) t||d" d! d!d) d*}d+}t	j
t|d, }td#| fd$|fd%|fgd-d.}|||| W d/   n	1 s&w   Y  t|jjts5J |t|jjv s@J d/S )0z1Calculate predicted probabilities on toy dataset.rf   rg   r   r   r   r   r   r   r   r   r!   r!   r&   r&   g7sa"?g=?gRhp?gℶZ/?gl^Ԭ;?g(1BW?gU(V6?g&d?g?rp   333333?ffffff?g5w?g9=qX?g_?g$/AY?              ?r&   r      r!   r"   r%   rX   rY   rJ   )r&   r!   r!   rk   rs   r;   r<   r(   r8   r9   N)r   r	   r   rw   r   r   r.   r=   r   r+   r,   r>   r?   r@   rA   rB   )ra   rb   rc   r/   r0   clf1_resclf2_resclf3_rest00t11t21t31rE   eclf_resrF   rG   rH   r*   r*   r4   !test_predict_proba_on_toy_problem   sP   

""	,,,,r   c                  C   s\   t ddddd\} }ttdd}td|fgd	d
}z	|| | W dS  ty-   Y dS w )z7Check if error is raised for multilabel classification.r&   r!   Frf   )	n_classesn_labelsallow_unlabeledrT   linear)kernelovrr8   r9   N)r   r   r   r   r.   NotImplementedError)r/   r0   clfrE   r*   r*   r4   test_multilabel  s   
r   c                  C   sx   t dd} tddd}t }td| fd|fd|fgdd	}d
dgddgg dg dgd}t||dd}|tt dS )zCheck GridSearch support.r!   rg   r"   )rT   rW   r%   rX   rY   rJ   r9   r   g      Y@r8   )      ?r   r   )r   r   r   )lr__Cr:   r'   r&   )	estimator
param_gridcvN)r   r	   r   r   r   r.   rD   r0   )ra   rb   rc   rE   r1   gridr*   r*   r4   test_gridsearch  s   
r   c                 C   s   t | d}td| d}t }tddgddgdd	gd
dgg}tg d}td|fd|fd|fgddd||}td|fd|fd|fgddd||}t|||| t	|
||
| dS )z:Check parallel backend of VotingClassifier on toy dataset.rg   rU   rV   r   r   r   r   r   r   r   r   r   r%   rX   rY   rJ   r!   )r$   r:   n_jobsr&   N)r   r	   r   rw   r   r   r.   r    rL   r   r=   )r`   ra   rb   rc   r/   r0   eclf1eclf2r*   r*   r4   test_parallel_fit)  s"   
"r   zignore::FutureWarningc                 C   s  t | d}td| d}td| d}td|fd|fd|fgd	d
jtttt	tfd}td|fd|fd|fgd	d
tt}t
|t|t t|t|t tj| jt	tfd}td|fgd	d
}|tt| |tt| t
|t|t t|t|t t }td|fd|fd|fgd	d
}d}	tjt|	d |tt| W d   n1 sw   Y  G dd dtt}
|
 }tjtdd |jtt|d W d   dS 1 sw   Y  dS )z1Tests sample_weight parameter of VotingClassifierrg   rU   rV   T)probabilityrT   r%   rX   svcrJ   r9   sample_weight)sizeknnzJUnderlying estimator KNeighborsClassifier does not support sample weights.r(   Nc                   @   s   e Zd Zdd ZdS )z.test_sample_weight.<locals>.ClassifierErrorFitc                 S   s   t d)Nz!Error unrelated to sample_weight.)	TypeError)selfrD   r0   r   r*   r*   r4   r.   c  s   z2test_sample_weight.<locals>.ClassifierErrorFit.fitN)__name__
__module____qualname__r.   r*   r*   r*   r4   ClassifierErrorFitb  s    r   z Error unrelated to sample_weight)r   r	   r   r   r.   rD   r0   rw   oneslenr    rL   r   r=   randomRandomStateuniformr   r+   r,   r   r   r   )r`   ra   rb   rc   r   r   r   eclf3clf4rP   r   r   r*   r*   r4   test_sample_weight=  sL   
"r   c                  C   sJ   G dd dt t} |  }td|fgdd}|jtttttfd dS )z:Check that VotingClassifier passes sample_weight as kwargsc                   @   s   e Zd ZdZdd ZdS )z1test_sample_weight_kwargs.<locals>.MockClassifierzAMock Classifier to check that sample_weight is received as kwargsc                 _   s   d|v sJ d S )Nr   r*   )r   r/   r0   argsr   r*   r*   r4   r.   q  s   z5test_sample_weight_kwargs.<locals>.MockClassifier.fitN)r   r   r   __doc__r.   r*   r*   r*   r4   MockClassifiern  s    r   mockrJ   r9   r   N)	r   r   r   r.   r/   r0   rw   r   r   )r   r   rE   r*   r*   r4   test_sample_weight_kwargsk  s    r   c                 C   s   t | d}td| d d}t }td|fd|fgdddgd	tt}td|fd
|fgdddgd	}|j|dtt t|	t|	t t
|t|t |jd d  | ks`J |jd d  | ksoJ d S )Nrg   rU   )rW   rT   	max_depthr%   rX   rJ   r!   r&   )r:   r'   nb)r   r   )r   r	   r   r   r.   rD   r0   
set_paramsr    rL   r   r=   r$   
get_params)r`   ra   rb   rc   r   r   r*   r*   r4   !test_voting_classifier_set_params{  s(   
"r   c                  C   s  t dd} tddd}t }td| fd|fd|fgdg d	d
tt}td| fd|fd|fgdg dd
}|jddtt t|	t|	t t
|jd dksVJ t|jdks_J tdd |jD skJ | d dksuJ |jddtt |jddtt t|	t|	t t|t|t d}tjt|d |jddddtt W d    n1 sw   Y  tdgdgg}tddg}td|fd|fgdddgdd||}td|fd|fgdddgdd}|jdd|| t||tddgddggddgddggg t||tddgddggg |jdd |jdd t||tddgddgg t||tdgdgg d S )Nrf   rg   rU   rV   r%   rX   r   r8   )r!   r   r   rk   )r!   r!   r   drop)rX   r&   c                 s   s    | ]
}t |ttfV  qd S )N)r?   r   r   ).0estr*   r*   r4   	<genexpr>  s    
z*test_set_estimator_drop.<locals>.<genexpr>rJ   )r:   z4All estimators are dropped. At least one is requiredr(   )r%   rX   r   r!   r   r   F)r$   r:   r'   flatten_transformr   r   r   r   )r   r	   r   r   r.   r/   r0   r   r    rL   dictr$   r   estimators_allr   r   r=   r+   r,   r-   rw   r   rM   )ra   rb   rc   r   r   rP   X1y1r*   r*   r4   test_set_estimator_drop  sr   
$$""r   c                 C   s   t | d}td| d}td|fd|fgddgdd	}td|fd|fgtd
dd	}|tt |tt t|	t|	t d S )Nrg   rU   rV   r%   rX   r!   r&   rJ   )r$   r'   r:   )r!   r&   )
r   r	   r   rw   r   r.   rD   r0   r   r=   )r`   ra   rb   r   r   r*   r*   r4   test_estimator_weights_format  s   
r   c           	      C   s6  t | d}td| d}t }tddgddgdd	gd
dgg}tg d}td|fd|fd|fgdd||}td|fd|fd|fgddd||}td|fd|fd|fgddd||}t||j	d t||j	d t||j	d t
|||| t
||ddd|| dS )z:Check transform method of VotingClassifier on toy dataset.rg   rU   rV   r   r   r   r   r   r   r   r   r   r%   rX   rY   rJ   r9   Tr$   r:   r   F)r      )r"   r   r&   r   r!   N)r   r	   r   rw   r   r   r.   r    rM   shaper   swapaxesreshape)	r`   ra   rb   rc   r/   r0   r   r   r   r*   r*   r4   test_transform  s>   
"r   zX, y, voterrX      )rW   c                 C   sn   t |}t | }|j||t|jd |jdd |j||t|jd ||}|j|jks5J d S )Nr   r   )r%   )	r   r   fit_transformr.   rw   r   r   r   rL   )r/   r0   voterrD   y_predr*   r*   r4    test_none_estimator_with_weights  s   
r   r   treerg   r$   r   r   )idsc                 C   sJ   ddgddgddgg}g d}t | drJ | || | jdks#J d S )	Nr!   r&   r"   r   r   r   r   r!   r&   n_features_in_)rC   r.   r   )r   r/   r0   r*   r*   r4   test_n_features_in+  s
   r   r   rf   )r$   verbosec                 C   s`   t ddgddgddgddgg}t g d	}d
}t| || t|| d s.J d S )Nr   r   r   r   r   r   r   r   r   za\[Voting\].*\(1 of 2\) Processing lr, total=.*\n\[Voting\].*\(2 of 2\) Processing rf, total=.*\n$r   )rw   r   r   r.   rer)   
readouterr)r   capsysr/   r0   patternr*   r*   r4   test_voting_verboseF  s   "r   c                  C   sh   ddgddgddgg} g d}t dt fd	td
dfdgd}|| | | }ddg}t|| dS )z1Check get_feature_names_out output for regressor.r!   r&   r"   r   r   r   r   r%   r   r   rg   )ignorer   r   votingregressor_lrvotingregressor_treeN)r   r   r   r.   get_feature_names_outr    )r/   r0   r:   	names_outexpected_namesr*   r*   r4   %test_get_features_names_out_regressore  s   r   zkwargs, expected_namesrJ   )r:   r   )votingclassifier_lr0votingclassifier_lr1votingclassifier_lr2votingclassifier_tree0votingclassifier_tree1votingclassifier_tree2r:   r8   votingclassifier_lrvotingclassifier_treec                 C   s   ddgddgddgddgg}g d}t dd	d
tddfdtddfgi| }||| ||}| }|jd t|ksAJ t|| dS )zBCheck get_feature_names_out for classifier for different settings.r!   r&   r"   r   r   r   r   )r   r!   r&   r   r$   r%   r   rg   r   Nr*   )	r   r   r   r.   rM   r   r   r   r    )kwargsr   r/   r0   r:   X_transr   r*   r*   r4   &test_get_features_names_out_classifiery  s   
r
  c                  C   s   ddgddgddgg} g d}t dtd	d
fdtd	d
fgddd}|| | d}tjt|d |  W d   dS 1 sAw   Y  dS )zJCheck that error is raised when voting="soft" and flatten_transform=False.r!   r&   r"   r   r   r   r   r%   r   rg   r   rJ   Fr   zYget_feature_names_out is not supported when `voting='soft'` and `flatten_transform=False`r(   N)r   r   r   r.   r+   r,   r-   r   )r/   r0   r:   rP   r*   r*   r4   ,test_get_features_names_out_classifier_error  s   
"r  zEstimator, Childc                 C   sx   t ddgddgddgg}g d}tjtdd | d	| gj||g d
dd W d   dS 1 s5w   Y  dS )zTest that the right error message is raised when metadata is passed while
    not supported when `enable_metadata_routing=False`.r   r!   r&   r   r   r!   r&   r"   z1is only supported if enable_metadata_routing=Truer(   r   ru   ar   metadataN)rw   r   r+   r,   r-   r.   )	EstimatorChildr/   r0   r*   r*   r4   *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*   r4   %test_get_metadata_routing_without_fit  s   r  propr   r  c                 C   s   t ddgddgddgg}g d}g dd}}| d	|t d
jdi |difd|t d
jdi |difg}|j||fi ||dkrH|n|i |jD ]*}|dkr[||i}	n||i}	|d j}
t|
sjJ |
D ]}td|ddd|	 qlqPdS )z3Test that metadata is routed correctly for Voting*.r   r!   r&   r   r   r  ru   r  sub_est1)registryTsub_est2r   r.   )objmethodparentNr*   )	rw   r   r   set_fit_requestr.   r$   r  r   r   )r  r  r  r/   r0   r   r  r   r   r  r  r  r*   r*   r4   +test_metadata_routing_for_voting_estimators  s.   $


r  c                 C   s   t ddgddgddgg}g d}g dd}}| d	| fg}d
|j d}tjtt|d |j||||d W d   dS 1 sGw   Y  dS )zCTest that the right error is raised when metadata is not requested.r   r!   r&   r   r   r  ru   r  r  zb[sample_weight, metadata] are passed but are not explicitly set as requested or not requested for z.fitr(   r  N)	rw   r   r   r+   r,   r-   r   escaper.   )r  r  r/   r0   r   r  r   error_messager*   r*   r4   1test_metadata_routing_error_for_voting_estimators  s   "r"  )^r   r   numpyrw   r+   sklearnr   r   sklearn.baser   r   r   sklearn.datasetsr   sklearn.dummyr   sklearn.ensembler	   r
   r   r   sklearn.exceptionsr   sklearn.linear_modelr   r   sklearn.model_selectionr   r   r   sklearn.multiclassr   sklearn.naive_bayesr   sklearn.neighborsr   sklearn.preprocessingr   sklearn.svmr   %sklearn.tests.metadata_routing_commonr   r   r   r   sklearn.treer   r   sklearn.utils._testingr   r   r    	load_irisirisdatatargetr/   r0   r   rD   load_diabetesrN   rv   markparametrizer5   rI   rQ   re   ri   rl   r   r   r   r   r   r   filterwarningsr   r   r   r   r   r   r   r   r   r   r
  r  r  r  r  r"  r*   r*   r*   r4   <module>   s   

$4

-A

	


!