a
    hj                     @   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)Z
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   sL   t f i | }tjt|d |tt W d    n1 s>0    Y  d S )Nmatch)r   pytestraises
ValueErrorfitXy)paramserr_msgZensemble r1   ^/var/www/html/assistant/venv/lib/python3.9/site-packages/sklearn/ensemble/tests/test_voting.py%test_voting_classifier_estimator_init0   s    r3   c                  C   s   t dt fdt fgdd} d}d}tjt|d}| j W d    n1 sN0    Y  t|jjtsjJ |t	|jjv s~J t
| drJ | tt t
| drJ 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_scaledr.   )eclf	inner_msg	outer_msg	exec_infor1   r1   r2   test_predictproba_hardvotingC   s    $rG   c                  C   sd  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 sb0    Y  tjt|d d | 	t W d    n1 s0    Y  tjt|d d | 
t W d    n1 s0    Y  tjt|d	 d |t W d    n1 s0    Y  tjt|d	 d |
t W d    n1 sV0    Y  d S )
Nr4   r5   softr7   Z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)rC   eregmsgr1   r1   r2   test_notfittedU   s"    (((*rN   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_estimatorsrQ   r$   rfgnbr6   r7   accuracyZscoring?N)r   r	   r   r   r   r-   r.   meanglobal_random_seedclf1clf2clf3rC   Zscoresr1   r1   r2   test_majority_label_irisk   s    r`   c                  C   s   t ddd} tdd}td| fd|fgdd}| tttd	 d
ksLJ |tttd	 dksjJ |tttd	 dksJ dS )zECheck voting classifier selects smaller class label in tie situation.{   rO   )rQ   rP   rQ   r$   rU   r6   r7   I   r%   r!   N)r   r	   r   r,   r-   r.   rI   )r]   r^   rC   r1   r1   r2   test_tie_situationx   s    
rd   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s`J dS )z>Check classification by average probabilities on dataset iris.rb   rR   rS   r$   rU   rV   rH   r!   r%   rR   r#   r8   r&   rW   rX   rY   N)r   r	   r   r   r   rB   r.   rZ   r[   r1   r1   r2   test_weights_iris   s    
rg   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.rZ   )strategyZmedianquantile皙?)rh   ri   re   )r&   g      ?)Z	test_sizer   )Zaxisr&   r%   decimalNr!   r!   r!   )r   r   r   rK   y_rr,   rI   npZaverageZasarrayr   )Zreg1Zreg2Zreg3rL   Z	X_r_trainZX_r_testZ	y_r_trainZy_r_testZ	reg1_predZ	reg2_predZ	reg3_predZ	ereg_predZavgZereg_weights_noneZereg_weights_equalZereg_none_predZereg_equal_predr1   r1   r2   test_weights_regressor   s8    



rp   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.rb   rR   rS   皙      333333ffffff333333皙皙?333333?g @gffffff?g@gffffff@)r!   r!   r!   r%   r%   r%   r$   rU   rV   r6   rm   rf   rH   N)	r   r	   r   ro   arrayr    r,   rI   r   )r\   r]   r^   r_   r-   r.   rC   r1   r1   r2   test_predict_on_toy_problem   s,    
&rz   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 sL0    Y  t|jjtsjJ |t|jjv sJ d/S )0z1Calculate predicted probabilities on toy dataset.ra   rb   rq   rr   rs   rt   ru   rv   rw   rx   r!   r!   r%   r%   g7sa"?g=?gRhp?gℶZ/?gl^Ԭ;?g(1BW?gU(V6?g&d?g?rj   333333?ffffff?g5w?g9=qX?g_?g$/AY?              ?r%   r      r!   r"   r$   rU   rV   rH   )r%   r!   r!   rf   rk   r9   r:   r'   r6   r7   N)r   r	   r   ro   ry   r   r,   r;   r   r)   r*   r<   r=   r>   r?   r@   )r]   r^   r_   r-   r.   Zclf1_resZclf2_resZclf3_resZt00Zt11Zt21Zt31rC   Zeclf_resrD   rE   rF   r1   r1   r2   !test_predict_proba_on_toy_problem   sN    

"	",,,,2r   c                  C   s^   t ddddd\} }ttdd}td|fgd	d
}z|| | W n tyX   Y dS 0 dS )z7Check if error is raised for multilabel classification.r%   r!   Fra   )Z	n_classesZn_labelsZallow_unlabeledrQ   Zlinear)ZkernelZovrr6   r7   N)r   r   r   r   r,   NotImplementedError)r-   r.   clfrC   r1   r1   r2   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!   rb   r"   )rQ   rT   r$   rU   rV   rH   r7   r   g      Y@r6   )      ?r   r   )r   r   r   )Zlr__Cr8   r&   r%   )	estimatorZ
param_gridZcvN)r   r	   r   r   r   r,   rB   r.   )r]   r^   r_   rC   r/   gridr1   r1   r2   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.rb   rR   rS   rq   rr   rs   rt   ru   rv   rw   rx   r{   r$   rU   rV   rH   r!   )r#   r8   Zn_jobsr%   N)r   r	   r   ro   ry   r   r,   r    rI   r   r;   )r\   r]   r^   r_   r-   r.   eclf1eclf2r1   r1   r2   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 sz0    Y  G dd dtt}
|
 }tjtdd  |jtt|d W d   n1 s0    Y  dS )z1Tests sample_weight parameter of VotingClassifierrb   rR   rS   T)ZprobabilityrQ   r$   rU   ZsvcrH   r7   sample_weight)sizeZ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d S )Nz!Error unrelated to sample_weight.)	TypeError)selfrB   r.   r   r1   r1   r2   r,   c  s    z2test_sample_weight.<locals>.ClassifierErrorFit.fitN)__name__
__module____qualname__r,   r1   r1   r1   r2   ClassifierErrorFitb  s   r   z Error unrelated to sample_weight)r   r	   r   r   r,   rB   r.   ro   oneslenr    rI   r   r;   randomZRandomStateuniformr   r)   r*   r   r   r   )r\   r]   r^   r_   r   r   r   eclf3Zclf4rM   r   r   r1   r1   r2   test_sample_weight=  sH    
.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   r1   )r   r-   r.   argsr   r1   r1   r2   r,   q  s    z5test_sample_weight_kwargs.<locals>.MockClassifier.fitN)r   r   r   __doc__r,   r1   r1   r1   r2   MockClassifiern  s   r   ZmockrH   r7   r   N)	r   r   r   r,   r-   r.   ro   r   r   )r   r   rC   r1   r1   r2   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sJ |jd d  | ksJ d S )Nrb   rR   )rT   rQ   	max_depthr$   rU   rH   r!   r%   )r8   r&   nb)r   r   )r   r	   r   r   r,   rB   r.   
set_paramsr    rI   r   r;   r#   
get_params)r\   r]   r^   r_   r   r   r1   r1   r2   !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sJ t|jdksJ tdd |jD sJ | d dksJ |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 s0    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 )Nra   rb   rR   rS   r$   rU   r   r6   )r!   r   r   rf   )r!   r!   r   drop)rU   r%   c                 s   s   | ]}t |ttfV  qd S )N)r=   r   r   ).0estr1   r1   r2   	<genexpr>  s   z*test_set_estimator_drop.<locals>.<genexpr>rH   )r8   z4All estimators are dropped. At least one is requiredr'   )r$   rU   r   r!   r   r   F)r#   r8   r&   flatten_transformr}   r|   r   r~   )r   r	   r   r   r,   r-   r.   r   r    rI   dictr#   r   Zestimators_allr   r   r;   r)   r*   r+   ro   ry   rJ   )r]   r^   r_   r   r   rM   ZX1y1r1   r1   r2   test_set_estimator_drop  sp    
8$$"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 )Nrb   rR   rS   r$   rU   r!   r%   rH   )r#   r&   r8   )r!   r%   )
r   r	   r   ro   ry   r,   rB   r.   r   r;   )r\   r]   r^   r   r   r1   r1   r2   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.rb   rR   rS   rq   rr   rs   rt   ru   rv   rw   rx   r{   r$   rU   rV   rH   r7   Tr#   r8   r   F)r      )r"   r   r%   r   r!   N)r   r	   r   ro   ry   r   r,   r    rJ   shaper   ZswapaxesZreshape)	r\   r]   r^   r_   r-   r.   r   r   r   r1   r1   r2   test_transform  s>    
"r   zX, y, voterrU      )rT   c                 C   sn   t |}t | }|j||t|jd |jdd |j||t|jd ||}|j|jksjJ d S )Nr   r   )r$   )	r   r   fit_transformr,   ro   r   r   r   rI   )r-   r.   ZvoterrB   Zy_predr1   r1   r2    test_none_estimator_with_weights  s    
r   r   treerb   r#   r   r   )Zidsc                 C   sJ   ddgddgddgg}g d}t | dr,J | || | jdksFJ d S )	Nr!   r%   r"   r   r   r   r   r!   r%   n_features_in_)rA   r,   r   )r   r-   r.   r1   r1   r2   test_n_features_in+  s
    r   r   ra   )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 )Nrq   rr   rs   rt   ru   rv   rw   rx   r{   za\[Voting\].*\(1 of 2\) Processing lr, total=.*\n\[Voting\].*\(2 of 2\) Processing rf, total=.*\n$r   )ro   ry   r   r,   rer(   Z
readouterr)r   Zcapsysr-   r.   patternr1   r1   r2   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   rb   )ignorer   r   Zvotingregressor_lrZvotingregressor_treeN)r   r   r   r,   get_feature_names_outr    )r-   r.   r8   	names_outexpected_namesr1   r1   r2   %test_get_features_names_out_regressore  s    r   zkwargs, expected_namesrH   )r8   r   )Zvotingclassifier_lr0Zvotingclassifier_lr1Zvotingclassifier_lr2Zvotingclassifier_tree0Zvotingclassifier_tree1Zvotingclassifier_tree2r8   r6   Zvotingclassifier_lrZvotingclassifier_treec                 C   s   ddgddgddgddgg}g d}t f d	d
tddfdtddfgi| }||| ||}| }|jd t|ksJ t|| dS )zBCheck get_feature_names_out for classifier for different settings.r!   r%   r"   r   r   r   rx   )r   r!   r%   r   r#   r$   r   rb   r   N)	r   r   r   r,   rJ   r   r   r   r    )kwargsr   r-   r.   r8   ZX_transr   r1   r1   r2   &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   n1 s0    Y  dS )zJCheck that error is raised when voting="soft" and flatten_transform=False.r!   r%   r"   r   r   r   r   r$   r   rb   r   rH   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-   r.   r8   rM   r1   r1   r2   ,test_get_features_names_out_classifier_error  s    r   zEstimator, Childc                 C   sv   t ddgddgddgg}g d}tjtdd0 | d	| gj||g d
dd W d   n1 sh0    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   rm   ar   metadataN)ro   ry   r)   r*   r+   r,   )	EstimatorChildr-   r.   r1   r1   r2   *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   r1   r1   r2   %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f i |difd|t d
jf i |difg}|j||fi ||dkr|n|i |jD ]T}|dkr||i}	n||i}	|d j}
t|
sJ |
D ]}tf |ddd|	 qqdS )z3Test that metadata is routed correctly for Voting*.r   r!   r%   r   r   r   rm   r   Zsub_est1)registryTZsub_est2r   r,   )objmethodparentN)	ro   ry   r   Zset_fit_requestr,   r#   r   r   r   )r   r   r   r-   r.   r   r   r   r   r   r   r   r1   r1   r2   +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   n1 s0    Y  dS )zCTest that the right error is raised when metadata is not requested.r   r!   r%   r   r   r   rm   r   r   zb[sample_weight, metadata] are passed but are not explicitly set as requested or not requested for z.fitr'   r   N)	ro   ry   r   r)   r*   r+   r   escaper,   )r   r   r-   r.   r   r   r   error_messager1   r1   r2   1test_metadata_routing_error_for_voting_estimators  s    r   )^r   r   numpyro   r)   Zsklearnr   r   Zsklearn.baser   r   r   Zsklearn.datasetsr   Zsklearn.dummyr   Zsklearn.ensembler	   r
   r   r   Zsklearn.exceptionsr   Zsklearn.linear_modelr   r   Zsklearn.model_selectionr   r   r   Zsklearn.multiclassr   Zsklearn.naive_bayesr   Zsklearn.neighborsr   Zsklearn.preprocessingr   Zsklearn.svmr   Z%sklearn.tests.metadata_routing_commonr   r   r   r   Zsklearn.treer   r   Zsklearn.utils._testingr   r   r    Z	load_irisZirisdatatargetr-   r.   r   rB   Zload_diabetesrK   rn   markZparametrizer3   rG   rN   r`   rd   rg   rp   rz   r   r   r   r   filterwarningsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r1   r1   r1   r2   <module>   s  

$4

-A

	


!