U
    3d[                     @   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 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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l,m-Z- e. Z/e/j0ddddf e/j1 Z2Z3e- 4e2Z5ej6dd\Z7Z8ej9:ddg idfde fgdd gd!d"fgd#d$ Z;d%d& Z<d'd( Z=d)d* Z>d+d, Z?d-d. Z@d/d0 ZAd1d2 ZBd3d4 ZCd5d6 ZDd7d8 ZEd9d: ZFd;d< ZGd=d> ZHd?d@ ZIdAdB ZJdCdD ZKdEdF ZLej9:dGe2e3ede fdHedIdJfgfe7e8ede fdHedIdJfgfgdKdL ZMej9j:dMede fdNeddOfgdPededdOfdNeddOfgdPgdQdRgdSdTdU ZNej9:dVede fdHedWdOfgddXededWdOfdHedWdOfgddXgdYdZ ZOd[d\ ZPej9:d]d^dd_d`dadbdcdddegfdfdgidhdigfgdjdk ZQdldm ZRdS )nz4Testing for the VotingClassifier and VotingRegressor    N)assert_almost_equalassert_array_equal)assert_array_almost_equal)NotFittedError)LinearRegression)LogisticRegression)
GaussianNB)RandomForestClassifier)RandomForestRegressor)VotingClassifierVotingRegressor)DecisionTreeClassifier)DecisionTreeRegressor)GridSearchCV)datasets)cross_val_scoretrain_test_split)make_multilabel_classification)SVC)OneVsRestClassifier)KNeighborsClassifier)BaseEstimatorClassifierMixinclone)DummyRegressor)StandardScaler      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   s4   t f | }tjt|d |tt W 5 Q R X d S )Nmatch)r   pytestraises
ValueErrorfitXy)paramserr_msgZensemble r,   F/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/ensemble/tests/test_voting.py%test_voting_classifier_estimator_init&   s    
r.   c               	   C   sl   t dt fdt fgdd} d}tjt|d | j W 5 Q R X t| drNt| t	t
 t| drhtd S )Nlr1lr2hardr   voting1predict_proba is not available when voting='hard'r"   predict_proba)r   r   r$   r%   AttributeErrorr5   hasattrAssertionErrorr'   X_scaledr)   )eclfmsgr,   r,   r-   test_predictproba_hardvoting9   s    r<   c               	   C   s   t dt fdt fgdd} tdt fg}d}tjt|d d | t W 5 Q R X tjt|d d | 	t W 5 Q R X tjt|d d | 
t W 5 Q R X tjt|d	 d |t W 5 Q R X tjt|d	 d |
t W 5 Q R X d S )
Nr/   r0   softr2   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(   r5   	transformX_r)r:   eregr;   r,   r,   r-   test_notfittedG   s"    rB   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\tdS )z7Check classification by majority label on dataset iris.	liblinear)solverrandom_state
   n_estimatorsrE   r   rfgnbr1   r2   accuracyZscoring?N)	r   r	   r   r   r   r(   r)   meanr8   global_random_seedclf1clf2clf3r:   Zscoresr,   r,   r-   test_majority_label_iris]   s     rT   c                  C   s   t ddd} tdd}td| fd|fgdd}| tttd	 d
ksLt|tttd	 dksjt|tttd	 dkstdS )zECheck voting classifier selects smaller class label in tie situation.{   rC   )rE   rD   rE   r   rI   r1   r2   I   r    r   N)r   r	   r   r'   r(   r)   r>   r8   )rQ   rR   r:   r,   r,   r-   test_tie_situationj   s    
rX   c                 C   sf   t | d}td| d}t }td|fd|fd|fgddd	dgd
}t|ttdd}| dksbtdS )z>Check classification by average probabilities on dataset iris.rV   rF   rG   r   rI   rJ   r=   r   r    r   r3   r!   rK   rL   rM   N)	r   r	   r   r   r   r9   r)   rN   r8   rO   r,   r,   r-   test_weights_irist   s    
rZ   c                  C   sR  t dd} t dd}t ddd}td| fd|fd|fgddd	gd
}tttdd\}}}}| |||}||||}	||||}
||||}tjt	||	|
gdddd	gd}t
||dd td| fd|fd|fgdd
}td| fd|fd|fgdddgd
}||| ||| ||}||}t
||dd dS )zACheck weighted average regression prediction on diabetes dataset.rN   )strategyZmedianquantile皙?)r[   r\   r   r    rF   )r!   g      ?)Z	test_sizer   )Zaxisr!   decimalN)r   r   r   r@   y_rr'   r>   npZaverageZasarrayr   )Zreg1Zreg2Zreg3rA   Z	X_r_trainZX_r_testZ	y_r_trainZy_r_testZ	reg1_predZ	reg2_predZ	reg3_predZ	ereg_predavgZereg_weights_noneZereg_weights_equalZereg_none_predZereg_equal_predr,   r,   r-   test_weights_regressor   sF    

       

rc   c              	   C   sd  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ddddddg}t||||ddddddg t||||ddddddg t||||ddddddg td|fd|fd|fgddddgd}t||||ddddddg td|fd|fd|fgddddgd}t||||ddddddg dS )z6Manually check predicted class labels for toy dataset.rV   rF   rG   皙      333333ffffff333333皙皙?333333?g @gffffff?g@gffffff@r   r    r   rI   rJ   r1   rY   r=   N)	r   r	   r   ra   arrayr   r'   r>   r   )rP   rQ   rR   rS   r(   r)   r:   r,   r,   r-   test_predict_on_toy_problem   s,    
&$$$$rm   c               	   C   sB  t dd} tdd}t }tddgddgddgd	d
gg}tdddd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}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%dddgd&}||||}t||d d dd' t|	|d d dd' t|
|d d dd' t||d! d dd' t	j
td(d)6 td"| fd#|fd$|fgd*d+}|||| W 5 Q R X d,S )-z1Calculate predicted probabilities on toy dataset.rU   rV   rd   re   rf   rg   rh   ri   rj   rk   r   r    g7sa"?g=?gRhp?gℶZ/?gl^Ԭ;?g(1BW?gU(V6?g&d?g?r]   333333?ffffff?g5w?g9=qX?g_?g$/AY?              ?r      r   r   rI   rJ   r=   rY   r^   r4   r"   r1   r2   N)r   r	   r   ra   rl   r   r'   r5   r   r$   r%   r6   )rQ   rR   rS   r(   r)   Zclf1_resZclf2_resZclf3_resZt00Zt11Zt21Zt31r:   Zeclf_resr,   r,   r-   !test_predict_proba_on_toy_problem   sN    

"	",,,,  rs   c                  C   s`   t ddddd\} }ttdd}td|fgd	d
}z|| | W n tk
rZ   Y dS X dS )z7Check if error is raised for multilabel classification.r    r   FrU   )Z	n_classesZn_labelsZallow_unlabeledrE   Zlinear)kernelZovrr1   r2   N)r   r   r   r   r'   NotImplementedError)r(   r)   clfr:   r,   r,   r-   test_multilabel   s       
rw   c                  C   s|   t dd} tddd}t }td| fd|fd|fgdd	}d
dgddgdddgd
ddggd}t||dd}|tt dS )zCheck GridSearch support.r   rV   r   )rE   rH   r   rI   rJ   r=   r2   rq   g      Y@r1         ?)Zlr__Cr3   r!   r    )	estimatorZ
param_gridZcvN)r   r	   r   r   r   r'   r9   r)   )rQ   rR   rS   r:   r*   Zgridr,   r,   r-   test_gridsearch  s    
 rz   c                 C   s   t | d}td| d}t }tddgddgdd	gd
dgg}tddddg}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.rV   rF   rG   rd   re   rf   rg   rh   ri   rj   rk   r   r    r   rI   rJ   r=   )r   r3   Zn_jobsN)r   r	   r   ra   rl   r   r'   r   r>   r   r5   )rP   rQ   rR   rS   r(   r)   eclf1eclf2r,   r,   r-   test_parallel_fit  s.    
"      r}   c              	   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 5 Q R X G dd dtt}
|
 }tjtdd |jtt|d W 5 Q R X dS )z1Tests sample_weight parameter of VotingClassifierrV   rF   rG   T)ZprobabilityrE   r   rI   Zsvcr=   r2   sample_weight)sizeZknnzJUnderlying estimator KNeighborsClassifier does not support sample weights.r"   c                   @   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)selfr9   r)   r   r,   r,   r-   r'   P  s    z2test_sample_weight.<locals>.ClassifierErrorFit.fitN)__name__
__module____qualname__r'   r,   r,   r,   r-   ClassifierErrorFitO  s   r   z Error unrelated to sample_weightN)r   r	   r   r   r'   r9   r)   ra   oneslenr   r>   r   r5   randomZRandomStateuniformr   r$   r%   r   r   r   )rP   rQ   rR   rS   r{   r|   r   eclf3Zclf4r;   r   rv   r,   r,   r-   test_sample_weight+  sX    
        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|kst d S )Nr   )r8   )r   r(   r)   argsr   r,   r,   r-   r'   ^  s    z5test_sample_weight_kwargs.<locals>.MockClassifier.fitN)r   r   r   __doc__r'   r,   r,   r,   r-   MockClassifier[  s   r   Zmockr=   r2   r~   N)	r   r   r   r'   r(   r)   ra   r   r   )r   rv   r:   r,   r,   r-   test_sample_weight_kwargsX  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st|jd d  | kstd S )NrV   rF   )rH   rE   Z	max_depthr   rI   r=   r   r    )r3   r!   nb)r   r   )r   r	   r   r   r'   r9   r)   
set_paramsr   r>   r   r5   r   
get_paramsr8   )rP   rQ   rR   rS   r{   r|   r,   r,   r-   !test_voting_classifier_set_paramsh  s8    
        r   c               	   C   s  t dd} tddd}t }td| fd|fd|fgdd	d
dgdtt}td| fd|fd|fgdd	d	dgd}|jddtt t|	t|	t t
|jd dkstt|jdksttdd |jD st| d dkst|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 5 Q R X 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 )NrU   rV   rF   rG   r   rI   r   r1   r   r   rx   rY   drop)rI   r    c                 s   s   | ]}t |ttfV  qd S )N)
isinstancer   r   ).0estr,   r,   r-   	<genexpr>  s    z*test_set_estimator_drop.<locals>.<genexpr>r=   )r3   z4All estimators are dropped. At least one is requiredr"   )r   rI   r   F)r   r3   r!   flatten_transformro   rn   rq   rp   )r   r	   r   r   r'   r(   r)   r   r   r>   dictr   r8   r   Zestimators_allr   r   r5   r$   r%   r&   ra   rl   r?   )rQ   rR   rS   r{   r|   r;   ZX1y1r,   r,   r-   test_set_estimator_drop  st    
 " $$"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 )NrV   rF   rG   r   rI   r   r    r=   )r   r!   r3   )r   r    )
r   r	   r   ra   rl   r'   r9   r)   r   r5   )rP   rQ   rR   r{   r|   r,   r,   r-   test_estimator_weights_format  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ddddg}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.rV   rF   rG   rd   re   rf   rg   rh   ri   rj   rk   r   r    r   rI   rJ   r=   r2   Tr   r3   r   F)rr      )r   rr   r    r   N)r   r	   r   ra   rl   r   r'   r   r?   shaper   ZswapaxesZreshape)	rP   rQ   rR   rS   r(   r)   r{   r|   r   r,   r,   r-   test_transform  sH    
"     r   zX, y, voterrI      )rH   c                 C   sn   t |}t | }|j||t|jd |jdd |j||t|jd ||}|j|jksjt	d S )Nr~   r   )r   )
r   r   fit_transformr'   ra   r   r   r   r>   r8   )r(   r)   Zvoterr9   Zy_predr,   r,   r-    test_none_estimator_with_weights  s    
r   r   treerV   r   r   r   )idsc                 C   sL   ddgddgddgg}dddg}t | dr.t| || | jdksHtd S )	Nr   r    r   rr   r   r   r   n_features_in_)r7   r8   r'   r   )r   r(   r)   r,   r,   r-   test_n_features_in  s
    
r   ry   rU   )r   verbosec                 C   s`   t ddgddgddgddgg}t d	d	d
d
g}d}| || t|| d s\td S )Nrd   re   rf   rg   rh   ri   rj   rk   r   r    za\[Voting\].*\(1 of 2\) Processing lr, total=.*\n\[Voting\].*\(2 of 2\) Processing rf, total=.*\n$r   )ra   rl   r'   rer#   Z
readouterrr8   )ry   Zcapsysr(   r)   patternr,   r,   r-   test_voting_verbose4  s    "r   c                  C   sj   ddgddgddgg} dddg}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   rr   r   r   r   r   r   rV   )ignorer   r   Zvotingregressor_lrZvotingregressor_treeN)r   r   r   r'   get_feature_names_outr   )r(   r)   r3   	names_outexpected_namesr,   r,   r-   %test_get_features_names_out_regressorU  s    
r   zkwargs, expected_namesr=   )r3   r   Zvotingclassifier_lr0Zvotingclassifier_lr1Zvotingclassifier_lr2Zvotingclassifier_tree0Zvotingclassifier_tree1Zvotingclassifier_tree2r3   r1   Zvotingclassifier_lrZvotingclassifier_treec                 C   s   ddgddgddgddgg}ddddg}t f d	d
tddfdtddfgi| }||| ||}| }|jd t|kstt	|| dS )zBCheck get_feature_names_out for classifier for different settings.r   r    r   rr   r   r   rk   r   r   r   rV   r   N)
r   r   r   r'   r?   r   r   r   r8   r   )kwargsr   r(   r)   r3   ZX_transr   r,   r,   r-   &test_get_features_names_out_classifieri  s    
r   c               	   C   s|   ddgddgddgg} dddg}t dtdd	fd
tdd	fgddd}|| | d}tjt|d |  W 5 Q R X dS )zJCheck that error is raised when voting="soft" and flatten_transform=False.r   r    r   rr   r   r   r   r   rV   r   r=   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)   r3   r;   r,   r,   r-   ,test_get_features_names_out_classifier_error  s    
r   )Sr   r$   r   Znumpyra   Zsklearn.utils._testingr   r   r   Zsklearn.exceptionsr   Zsklearn.linear_modelr   r   Zsklearn.naive_bayesr   Zsklearn.ensembler	   r
   r   r   Zsklearn.treer   r   Zsklearn.model_selectionr   Zsklearnr   r   r   Zsklearn.datasetsr   Zsklearn.svmr   Zsklearn.multiclassr   Zsklearn.neighborsr   Zsklearn.baser   r   r   Zsklearn.dummyr   Zsklearn.preprocessingr   Z	load_irisZirisdatatargetr(   r)   r   r9   Zload_diabetesr@   r`   markZparametrizer.   r<   rB   rT   rX   rZ   rc   rm   rs   rw   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r,   r,   r,   r-   <module>   s   

$1-A




