B
    0dR                 @   s<  d Z ddl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, e- Z.e.j/ddddf e.j0 Z1Z2ej3dd\Z4Z5ej67ddg idfde fgdd d!fde fgdd"gd#d$fgd%d& Z8d'd( Z9d)d* Z:d+d, Z;d-d. Z<d/d0 Z=d1d2 Z>d3d4 Z?d5d6 Z@d7d8 ZAd9d: ZBd;d< ZCd=d> ZDd?d@ ZEdAdB ZFdCdD ZGdEdF ZHdGdH ZIej67dIe1e2ede fdJedKdLfgfe4e5ede fdJedKdLfgfgdMdN ZJej6j7dOede fdPeddQfgdRededdQfdPeddQfgdRgdSdTgdUdVdW ZKej67dXede fdJedYdQfgddZededYdQfdJedYdQfgddZgd[d\ ZLdS )]z4Testing 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      T)Z
return_X_yzparams, err_msg
estimatorsz@Invalid 'estimators' attribute, 'estimators' should be a list oflrerror)r   votingz7Voting must be 'soft' or 'hard'; got \(voting='error'\)   )r   weightsz0Number of `estimators` and weights must be equalc          	   C   s4   t f | }tjt|d |tt W d Q R X d S )N)match)r   pytestraises
ValueErrorfitXy)paramserr_msgZensemble r,   T/var/www/html/venv/lib/python3.7/site-packages/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 d Q R X t| drNt| t	t
 t| drhtd S )Nlr1lr2hard)r   r    z1predict_proba is not available when voting='hard')r#   predict_proba)r   r   r$   r%   AttributeErrorr2   hasattrAssertionErrorr'   r(   r)   )eclfmsgr,   r,   r-   test_predictproba_hardvoting<   s    r8   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 d Q R X tjt|d d | 	t W d Q R X tjt|d d | 
t W d Q R X tjt|d	 d |t W d Q R X tjt|d	 d |
t W d Q R X d S )
Nr/   r0   soft)r   r    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(   r2   	transformX_r)r6   eregr7   r,   r,   r-   test_notfittedJ   s    r>   c              C   sb   t ddd} tddd}t }td| fd|fd|fgd	d
}t|ttdd}t| ddd dS )z7Check classification by majority label on dataset iris.	liblinear{   )solverrandom_state
   )n_estimatorsrB   r   rfgnbr1   )r   r    accuracy)scoringgffffff?r!   )decimalN)	r   r	   r   r   r   r(   r)   r   mean)clf1clf2clf3r6   scoresr,   r,   r-   test_majority_label_iris`   s    rO   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.r@   r?   )rB   rA   )rB   r   rE   r1   )r   r    I   r!   r   N)r   r	   r   r'   r(   r)   r:   r5   )rK   rL   r6   r,   r,   r-   test_tie_situationl   s    
rQ   c              C   sf   t dd} tdd}t }td| fd|fd|fgdddd	gd
}t|ttdd}t| ddd dS )z>Check classification by average probabilities on dataset iris.r@   )rB   r   rE   rF   r9   r   r!   rC   )r   r    r"   rG   )rH   g(\?)rI   N)	r   r	   r   r   r   r(   r)   r   rJ   )rK   rL   rM   r6   rN   r,   r,   r-   test_weights_irisv   s    

rR   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.rJ   )strategyZmedianquantileg?)rS   rT   r   r!   rC   )r"   g      ?)Z	test_sizer   )Zaxisr"   )rI   N)r   r   r   r<   y_rr'   r:   npZaverageZasarrayr   )Zreg1Zreg2Zreg3r=   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   s.    

""

rX   c           	   C   sb  t d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.r@   )rB   gg      g333333gffffffg333333gg?g333333?g @gffffff?g@gffffff@r   r!   r   rE   rF   r1   )r   r    r"   r9   N)	r   r	   r   rV   arrayr   r'   r:   r   )rK   rL   rM   r(   r)   r6   r,   r,   r-   test_predict_on_toy_problem   s&    

*$$$$rZ   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 d,Q R X d,S )-z1Calculate predicted probabilities on toy dataset.r@   )rB   gg      g333333gffffffg333333gg?g333333?r   r!   g7sa"?g=?gRhp?gℶZ/?gl^Ԭ;?g(1BW?gU(V6?g&d?g?g?g333333?gffffff?g5w?g9=qX?g_?g$/AY?g        g      ?r      r   r   rE   rF   r9   )r   r    r"   )rI   z1predict_proba is not available when voting='hard')r#   r1   )r   r    N)r   r	   r   rV   rY   r   r'   r2   r   r$   r%   r3   )rK   rL   rM   r(   r)   Zclf1_resZclf2_resZclf3_resZt00Zt11Zt21Zt31r6   Zeclf_resr,   r,   r-   !test_predict_proba_on_toy_problem   s>    

"",,,,r\   c              C   s^   t ddddd\} }ttdd}td|fgd	d
}y|| | W n tk
rX   dS X dS )z7Check if error is raised for multilabel classification.r!   r   Fr@   )Z	n_classesZn_labelsZallow_unlabeledrB   Zlinear)ZkernelZovrr1   )r   r    N)r   r   r   r   r'   NotImplementedError)r(   r)   clfr6   r,   r,   r-   test_multilabel   s    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dgdddgd
ddggd}t||dd}|tjtj dS )zCheck GridSearch support.r   )rB   r   )rB   rD   r   rE   rF   r9   )r   r    g      ?g      Y@r1   g      ?)Zlr__Cr    r"   r!   )	estimatorZ
param_gridZcvN)	r   r	   r   r   r   r'   irisdatatarget)rK   rL   rM   r6   r*   gridr,   r,   r-   test_gridsearch  s    
re   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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.r@   )rB   gg      g333333gffffffg333333gg?g333333?r   r!   r   rE   rF   r9   )r   r    Zn_jobsN)r   r	   r   rV   rY   r   r'   r   r:   r   r2   )rK   rL   rM   r(   r)   eclf1eclf2r,   r,   r-   test_parallel_fit  s    

"rh   c           	   C   s  t dd} tdd}td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d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Q R X G dd dtt}	|	 }
tjtdd |
jtt|d
 W dQ R X dS )z1Tests sample_weight parameter of VotingClassifierr@   )rB   T)ZprobabilityrB   r   rE   Zsvcr9   )r   r    )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)selfr(   r)   ri   r,   r,   r-   r'   O  s    z2test_sample_weight.<locals>.ClassifierErrorFit.fitN)__name__
__module____qualname__r'   r,   r,   r,   r-   ClassifierErrorFitN  s   rp   z Error unrelated to sample_weight)r   r	   r   r   r'   r(   r)   rV   oneslenr   r:   r   r2   randomZRandomStateuniformr   r$   r%   rk   r   r   )rK   rL   rM   rf   rg   ri   eclf3Zclf4r7   rp   r^   r,   r,   r-   test_sample_weight-  s6    

rv   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 )Nri   )r5   )rl   r(   r)   argsri   r,   r,   r-   r'   ]  s    z5test_sample_weight_kwargs.<locals>.MockClassifier.fitN)rm   rn   ro   __doc__r'   r,   r,   r,   r-   MockClassifierZ  s   ry   Zmockr9   )r   r    )ri   N)	r   r   r   r'   r(   r)   rV   rq   rr   )ry   r^   r6   r,   r,   r-   test_sample_weight_kwargsW  s    rz   c              C   s   t dd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 )Nr@   g      ?)rB   C)rB   	max_depthr   rE   r9   r   r!   )r    r"   nb)r}   r   )r   r	   r   r   r'   r(   r)   
set_paramsr   r:   r   r2   r   
get_paramsr5   )rK   rL   rM   rf   rg   r,   r,   r-   !test_voting_classifier_set_paramsg  s    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}td <}t	
 ( t	ddt |jddtt W d Q R X W d Q R X |rtt|t|t t|jd dkstt|jdksttdd |jD st| d dks4t|jddtt td <}t	
 ( t	ddt |jddtt W d Q R X W d Q R X |rtt|t|t t|t|t d}td 8}tjt|d |jddddtt W d Q R X W d Q R X |r t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}td <}t	
 ( t	ddt |jdd|| W d Q R X W d Q R X |rt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 )Nr@   )rB   rC   )rD   rB   r   rE   r}   r1   r   r   g      ?)r   r    r"   ignoretostringdrop)rE   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>r9   )r    z4All estimators are dropped. At least one is required)r#   )r   rE   r}   F)r   r    r"   flatten_transformgffffff?g333333?g      ?g        )r   r	   r   r   r'   r(   r)   r$   warnswarningscatch_warningsfilterwarningsDeprecationWarningr~   r5   r   r:   dictr   rr   Zestimators_allr   r   r2   r%   r&   rV   rY   r;   )	rK   rL   rM   rf   rg   recordr7   ZX1y1r,   r,   r-   test_set_estimator_drop{  s|    

(
(
,

(
($"r   c              C   s   t d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 )
Nr@   )rB   r   rE   r   r!   r9   )r   r"   r    )r   r!   )
r   r	   r   rV   rY   r'   r(   r)   r   r2   )rK   rL   rf   rg   r,   r,   r-   test_estimator_weights_format  s    

r   c              C   s8  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| 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.r@   )rB   gg      g333333gffffffg333333gg?g333333?r   r!   r   rE   rF   r9   )r   r    T)r   r    r   F)r[      )r   r[   r!   r   N)r   r	   r   rV   rY   r   r'   r   r;   shaper   ZswapaxesZreshape)rK   rL   rM   r(   r)   rf   rg   ru   r,   r,   r-   test_transform  s0    

"r   zX, y, voterrE      )rD   c          	   C   s   t |}|j| |t|jd |jdd td }|j| |t|jd W d Q R X |rbt|	| }|j|jks|td S )N)ri   r   )r   )
r   r'   rV   rq   r   r~   r$   r   r5   r:   )r(   r)   Zvoterr   Zy_predr,   r,   r-    test_none_estimator_with_weights  s    "
r   r   tree)rB   )r   r   r   )Z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   r[   r   r   r   n_features_in_)r4   r5   r'   r   )r   r(   r)   r,   r,   r-   test_n_features_in"  s
    
r   r`   r@   )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 )Ngg      g333333gffffffg333333gg?g333333?r   r!   za\[Voting\].*\(1 of 2\) Processing lr, total=.*\n\[Voting\].*\(2 of 2\) Processing rf, total=.*\n$r   )rV   rY   r'   rer#   Z
readouterrr5   )r`   Zcapsysr(   r)   patternr,   r,   r-   test_voting_verbose>  s
    "r   )Mrx   r   r$   r   numpyrV   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	load_irisra   rb   rc   r(   r)   Zload_diabetesr<   rU   markZparametrizer.   r8   r>   rO   rQ   rR   rX   rZ   r\   r_   re   rh   rv   rz   r   r   r   r   r   r   r   r,   r,   r,   r-   <module>   s   

$1*R 