U
    3d/~                     @   sb  d dl Zd dlm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 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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"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0 d dl1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl6m:Z: d dl;m<Z< dZ=ej>?de= dZ@e:A ZBejCDd ZEeEFeBjGjHZIeBjJeI eB_JeBjGeI eB_GdZKdd ZLd d! ZMd"d# ZNd$d% ZOd&d' ZPd(d) ZQd*d+ ZRd,d- ZSd.d/ ZTd0d1 ZUd2d3 ZVd4d5 ZWd6d7 ZXd8d9 ZYd:d; ZZd<d= Z[d>d? Z\d@dA Z]dBdC Z^dDdE Z_dFdG Z`dHdI ZadJdK ZbdLdM ZcdNdO ZddPdQ ZedRdS ZfdTdU ZgdVdW ZhdXdY ZidZd[ Zjd\d] Zkd^d_ Zld`da Zmdbdc Znddde Zodfdg Zpej>qdheegdidj Zrej>qdheegdkdl Zsej>qdheegdmdn Ztej>qdoejuejvgdpdq Zwdrds ZxdS )t    N)assert_allclose)escape)assert_array_equal)assert_almost_equal)CheckingClassifier)OneVsRestClassifier)OneVsOneClassifier)OutputCodeClassifier)check_classification_targetstype_of_target)check_arrayshuffle)precision_score)recall_score)	LinearSVCSVC)MultinomialNB)LinearRegressionLasso
ElasticNetRidge
PerceptronLogisticRegressionSGDClassifier)DecisionTreeClassifierDecisionTreeRegressor)KNeighborsClassifier)GridSearchCVcross_val_score)Pipelinemake_pipeline)SimpleImputer)svm)NotFittedError)datasets)load_breast_cancerz/The default value for `force_alpha` will changezignore:z:FutureWarning   c               	   C   s   t tdd} tt | g  W 5 Q R X d}tjt|dD tddgddgg}tddgddgg}t t	 
|| W 5 Q R X tjt|dD tddgddgg}tdd	gd
dgg}t t	 
|| W 5 Q R X d S )Nr   random_statez@Multioutput target data is not supported with label binarizationmatch      r&   g      ?g333333@g@皙?)r   r   pytestraisesr#   predict
ValueErrornparrayr   fit)ovrmsgXy r9   A/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/tests/test_multiclass.pytest_ovr_exceptions7   s    r;   c               	   C   s@   t ddddg} t| }tjt|d t|  W 5 Q R X d S )N        g?       @g      @r)   )r2   r3   r   r.   r/   r1   r
   )r8   r6   r9   r9   r:   !test_check_classification_targetsK   s    r>   c                  C   s   t tdd} | tjtjtj}t| jt	ks8t
tdd}|tjtjtj}ttj|kttj|kks~t
t t } | tjtjtj}ttj|kdkst
d S )Nr   r'   ?)r   r   r4   irisdatatargetr0   lenestimators_	n_classesAssertionErrorr2   meanr   )r5   predclfpred2r9   r9   r:   test_ovr_fit_predictS   s    
$
rK   c                  C   s  t tjtjdd\} }tt }|| d d |d d t| || dd  |dd   |	| }tt }|
| |	| }t|| t|jtt|kstt||kdkstttjdd} ddddddddddddddg}ttdd d	dd
}|| d d |d d t| || dd  |dd   |	| }ttdd d	dd
}|
| |	| }t||kt||kksttt }t|drtd S )Nr   r'   d   r?      r,   r+   r&   F)max_itertolr   r(      partial_fit)r   r@   rA   rB   r   r   rQ   r2   uniquer0   r4   r   rC   rD   rF   rG   absrandomrandnr   r   hasattr)r7   r8   r5   rH   Zovr2rJ   Zovr1pred1r9   r9   r:   test_ovr_partial_fitc   s2    
$


 $
"
rX   c                  C   s   t t } ttjdd}ddddddddddddddg}| |d d |d d t| dg|dd  }d	}tj	t
|d
 | j|dd  |d W 5 Q R X d S )NrM   r,   r+   r&   r   rP      zAMini-batch contains \[.+\] while classes must be subset of \[.+\]r)   )r7   r8   )r   r   r2   rS   rT   rU   rQ   rR   r.   r/   r1   )r5   r7   r8   y1r6   r9   r9   r:   test_ovr_partial_fit_exceptions   s    
 $r\   c                  C   s   t t } | tjtjtj}t| jt	ks4t
tt|dddg t|tjkdksbt
tt } | tjtjtj}t| jt	t	d  d kst
tt|dddg t|tjkdkst
d S )Nr   r+   r,   ?)r   r   r4   r@   rA   rB   r0   rC   rD   rE   rF   r   r2   rR   rG   r   )r5   rH   r9   r9   r:   test_ovr_ovo_regressor   s    

r^   c               
   C   s2  t jt jt jt jt jfD ]} tdd}tjddddddd	d
\}}|d d |d d  }}|dd  }t	|
||}||}t	|
|| |}	|	|}
|jstt |
stt|
 | |	|}|dk}t||
  t }t	|
|| |}	|	|d	kt}t||	|  qd S )Nr+   alpharL      rY   r&   2   Tr   	n_samples
n_featuresrE   Zn_labelslengthZallow_unlabeledr(   P         ?)spZ
csr_matrix
csc_matrixZ
coo_matrixZ
dok_matrixZ
lil_matrixr   r$   make_multilabel_classificationr   r4   r0   multilabel_rF   issparser   Ztoarraypredict_probar"   r   decision_functionastypeint)sparsebase_clfr7   YX_trainY_trainX_testrI   Y_predZclf_sprsZY_pred_sprsY_probarH   Zdec_predr9   r9   r:   test_ovr_fit_predict_sparse   s@    







rz   c               	   C   s  t d} d| d dd d f< t d}d|dd df< d|d d df< d|d d df< tt }d}tjt|d || | W 5 Q R X |	| }t
t |t | || }t |d d d	d f dkst|| }t
|d d d
f t | jd  t d}d|dd df< tt }d}tjt|d || | W 5 Q R X || }t
|d d d
f t | jd  d S )N
   r,   r   rY   )r|   r&   r+   r,   z,Label .+ is present in all training examplesr)   rZ   z/Label not 1 is present in all training examples)r2   oneszerosr   r   r.   ZwarnsUserWarningr4   r0   r   r3   ro   rR   rF   rn   shape)r7   r8   r5   r6   y_predr9   r9   r:   test_ovr_always_present   s0    




"
"


r   c               	   C   s$  t dddgdddgdddgdddgdddgg} dddddg}t dddgdddgdddgdddgdddgg}td	 }t tdd
t t t fD ]}t	|
| |}t|j|kst|t dddggd }t|dg t	|
| |}|dddggd }t|dddg qd S )Nr   rY   r&      eggsspamZhamr+   zham eggs spamr'      )r2   r3   setsplitr   r   r   r   r   r   r4   classes_rF   r0   r   )r7   r8   rt   classesrs   rI   r   r9   r9   r:   test_ovr_multiclass   s"    22r   c               	      s   t dddgdddgdddgdddgdddgg dddddgt dddddggjtd d fd
d	} tddt t t fD ]}| | qt	 t
ddt fD ]}| |dd qd S )Nr   rY   r&   r   r   r   r+   z	eggs spamFc                    s   t |  }t|jks"t|tdddggd }t|dg t	| drl|
 }|jdkslt|rtdddgg}||}dt|d kst|jtj|dd ||kstt |  }|d	ddggd }|dkstd S )
Nr   r   r   ro   )rY   r,   r+   Zaxisr&   )r   r4   r   r   rF   r0   r2   r3   r   rV   ro   r   rn   rC   argmax)rs   test_predict_probarI   r   decrw   Zprobabilitiesr7   rt   r   r8   r9   r:   conduct_test  s    


"z%test_ovr_binary.<locals>.conduct_testr'   Tprobability)r   )F)r2   r3   Tr   r   r   r   r   r   r   r   r   )r   rs   r9   r   r:   test_ovr_binary  s    2
r   c               	   C   s   t dddgdddgdddgdddgdddgg} t dddgdddgdddgdddgdddgg}t tddt t t tdd	fD ]D}t|	| |}|
dddggd }t|dddg |jstqd S )
Nr   r   rY   r&   r   r+   r'   rh   r_   )r2   r3   r   r   r   r   r   r   r   r4   r0   r   rl   rF   )r7   r8   rs   rI   r   r9   r9   r:   test_ovr_multilabel<  s    22r   c                  C   sJ   t t } | tjtj t| jdks.t	| 
tjtjdksFt	d S )Nr&   r]   )r   r"   r   r4   r@   rA   rB   rC   rD   rF   score)r5   r9   r9   r:   test_ovr_fit_predict_svcO  s    r   c               
   C   s   t dd} tdddD ]\}}}tjdddd	d
|dd\}}|d d |d d  }}|dd  |dd   }}	t| ||}
|
|}|
jstt	t
|	|dd|d	d t	t|	|dd|d	d qd S )Nr+   r_   )TF)RQ?gQ?)r   r-   rL   ra   rY   r,   rb   r   rc   rg   micro)Zaverage)decimal)r   zipr$   rk   r   r4   r0   rl   rF   r   r   r   )rs   auprecZrecallr7   rt   ru   rv   rw   ZY_testrI   rx   r9   r9   r:   test_ovr_multilabel_datasetV  s4    

	

    r   c               
   C   sH  t dd} dD ]2}tjddddd|d	d
\}}|d d |d d  }}|dd  }t| ||}tt ||}t|drtttj	dd}t|drt||| t|drtt|dstt
tj	ddddgid}	t|	}
t|
dr t|
|| t|
dst||}||}|dk}t|| qd S )Nr+   r_   )FTrL   ra   rY   r&   rb   r   rc   rg   rn   Fr   ro   r   T)Z
param_gridrh   )r   r$   rk   r   r4   r"   SVRrV   rF   r   r   r0   rn   r   )rs   r   r7   rt   ru   rv   rw   rI   decision_onlyZgsZproba_after_fitrx   ry   rH   r9   r9   r:   !test_ovr_multilabel_predict_probap  sB    


	
 

r   c                  C   s   t dd} tjtj }}|d d |d d  }}|dd  }t| ||}tt ||}t|drpt	|
|}||}	t|	jddd |	jdd}
|
|  rt	d S )Nr+   r_   rg   rn   r         ?)r   r@   rA   rB   r   r4   r"   r   rV   rF   r0   rn   r   sumr   any)rs   r7   rt   ru   rv   rw   rI   r   rx   ry   rH   r9   r9   r:   #test_ovr_single_label_predict_proba  s    


r   c               	   C   sz   t jdddddddd\} }| d d	 |d d	  }}| d	d  }tt ||}t||dkt	|
| d S )
NrL   ra   rY   r&   rb   Tr   rc   rg   )r$   rk   r   r"   r   r4   r   ro   rp   rq   r0   r7   rt   ru   rv   rw   rI   r9   r9   r:   %test_ovr_multilabel_decision_function  s     
	 r   c                  C   sp   t jdddd\} }| d d |d d  }}| dd  }tt ||}t|| dk|	| d S )NrL   ra   r   )rd   re   r(   rg   )
r$   Zmake_classificationr   r"   r   r4   r   ro   Zravelr0   r   r9   r9   r:   'test_ovr_single_label_decision_function  s
    r   c                  C   sT   t tdd} dddg}t| d|i}|tjtj |jjd j	}||ksPt
d S Nr   r'   皙?rh   r-   Zestimator__C)r   r   r   r4   r@   rA   rB   best_estimator_rD   CrF   )r5   Cscvbest_Cr9   r9   r:   test_ovr_gridsearch  s    
r   c                  C   s`   t dt fg} t| }|tjtj tt }|tjtj t|tj|tj d S )Ntree)	r   r   r   r4   r@   rA   rB   r   r0   )rI   Zovr_piper5   r9   r9   r:   test_ovr_pipeline  s    
r   c               	   C   s2   t tdd} tt | g  W 5 Q R X d S Nr   r'   )r   r   r.   r/   r#   r0   ovor9   r9   r:   test_ovo_exceptions  s    r   c                  C   s\   t tdd} | tjtjtj}dd tjD }| |ttj|}t|| d S )Nr   r'   c                 S   s   g | ]}t |qS r9   )list).0ar9   r9   r:   
<listcomp>  s     z(test_ovo_fit_on_list.<locals>.<listcomp>)	r   r   r4   r@   rA   rB   r0   r   r   )r   Zprediction_from_arrayZiris_data_listZprediction_from_listr9   r9   r:   test_ovo_fit_on_list  s    r   c                  C   s   t tdd} | tjtjtj t| jt	t	d  d ksDt
t t } | tjtjtj t| jt	t	d  d kst
d S )Nr   r'   r+   r,   )r   r   r4   r@   rA   rB   r0   rC   rD   rE   rF   r   r   r9   r9   r:   test_ovo_fit_predict  s    
r   c                  C   s  t  } | j| j }}tt }||d d |d d t| ||dd  |dd   |	|}tt }|
|| |	|}t|jttd  d kstt||kdkstt|| tt }||d d |d d t| ||dd  |dd   |	|}tt }|
||	|}t|| t|jtt|ks`tt||kdksxttt }tjdd}dddddddd	d	d	d	d	ddg}||d d
 |d d
 ddddd	g ||d
d  |d
d   |	|}tt }|
||	|}t|| tt }ddddd	ddg}	tdt|	t|}
tjt|
d" ||d d
 |	t| W 5 Q R X tt }t|drtd S )NrL   r+   r,   r?   <   rM   r&   r   r   rP   rY   z6Mini-batch contains {0} while it must be subset of {1}r)   rQ   )r$   	load_irisrA   rB   r   r   rQ   r2   rR   r0   r4   rC   rD   rE   rF   rG   r   rT   Zrandr   formatr.   r/   r1   r   rV   )tempr7   r8   Zovo1rW   Zovo2rJ   r   rH   Zerror_yZ
message_rer5   r9   r9   r:   test_ovo_partial_fit_predict  sT    
$




$



 (



 &
r   c            	      C   s  t jjd } ttdd}|t jt jdk |t j}|j| fksJt|t jt j |t j}|j| t	fksxtt
|jdd|t j t| t	f}d}tt	D ]b}t|d t	D ]N}|j| t j}||dk|f  d7  < ||dk|f  d7  < |d7 }qqt
|t| tt	D ]T}t|d d |f tdddgsVttt|d d |f dks(tq(d S )	Nr   r'   r+   r   r<   r   r=      )r@   rA   r   r   r   r4   rB   ro   rF   rE   r   r   r0   r2   r   rangerD   roundr   issubsetrC   rR   )	rd   Zovo_clfZ	decisionsvoteskijrH   Z	class_idxr9   r9   r:   test_ovo_decision_function4  s*    *r   c                  C   sT   t tdd} dddg}t| d|i}|tjtj |jjd j	}||ksPt
d S r   )r   r   r   r4   r@   rA   rB   r   rD   r   rF   )r   r   r   r   r9   r9   r:   test_ovo_gridsearchc  s    
r   c                  C   s   t ddgddgddgddgg} t ddddg}ttddd d}|| || }|| }t |}|| }t|dd d f d tt j	|dd  dd	|dd   |d |d 	 kst
d S )
Nr+   r,   r}   rZ   r   Fr   r   rN   rO   r   )r2   r3   r   r   r4   r0   ro   r   r   r   rF   )r7   r8   	multi_clfovo_predictionZovo_decisionr   Znormalized_confidencesr9   r9   r:   test_ovo_tiesl  s    "

$r   c                  C   s   t ddgddgddgddgg} t ddddg}tdD ]H}|| d }ttddd d	}|| || }|d |d ks<tq<d S )
Nr+   r,   r}   rZ   r   r&   Fr   r   )r2   r3   r   r   r   r4   r0   rF   )r7   Zy_refr   r8   r   r   r9   r9   r:   test_ovo_ties2  s    "r   c                  C   sF   t d} t ddddg}tt }|| | t|||  d S )Nr   r   bcd)r2   eyer3   r   r   r4   r   r0   )r7   r8   r   r9   r9   r:   test_ovo_string_y  s
    

r   c               	   C   sR   t d} t dgd }tt }d}tjt|d || | W 5 Q R X d S )Nr   r   zwhen only one classr)   )	r2   r   r3   r   r   r.   r/   r1   r4   r7   r8   r   r6   r9   r9   r:   test_ovo_one_class  s    

r   c               	   C   sP   t j} t jd d df }tt }d}tjt|d || | W 5 Q R X d S Nr   zUnknown label typer)   )r@   rA   r   r   r.   r/   r1   r4   r   r9   r9   r:   test_ovo_float_y  s    
r   c               	   C   s2   t tdd} tt | g  W 5 Q R X d S r   )r	   r   r.   r/   r#   r0   ecocr9   r9   r:   test_ecoc_exceptions  s    r   c                  C   s   t tddddd} | tjtjtj t| jt	d ksBt
t t ddd} | tjtjtj t| jt	d kst
d S )Nr   r'   r,   )Z	code_sizer(   )r	   r   r4   r@   rA   rB   r0   rC   rD   rE   rF   r   r   r9   r9   r:   test_ecoc_fit_predict  s    r   c                  C   sX   t tdddd} dddg}t| d|i}|tjtj |jjd j	}||ksTt
d S r   )r	   r   r   r4   r@   rA   rB   r   rD   r   rF   )r   r   r   r   r9   r9   r:   test_ecoc_gridsearch  s    
r   c               	   C   sP   t j} t jd d df }tt }d}tjt|d || | W 5 Q R X d S r   )r@   rA   r	   r   r.   r/   r1   r4   r   r9   r9   r:   test_ecoc_float_y  s    
r   c               	   C   s   t jt j } }t| }ttdddd}t|dd}tj	t
dd ||| W 5 Q R X || | tj	t
dd || W 5 Q R X ttdd}|||| t|jd	kstd S )
NTF)Z	ensure_2dZaccept_sparse)Zcheck_XZcheck_X_paramsr   r'   zA sparse matrix was passedr)   r   )r@   rA   rB   ri   rj   r   r   r	   r.   r/   	TypeErrorr4   r0   r   rC   rD   rF   )r7   r8   ZX_spZbase_estimatorr   r9   r9   r:   (test_ecoc_delegate_sparse_base_estimator  s    
r   c                  C   s~   t jdd} tjtj }}t| }t||j}|	|| t
|j}|j}|D ](}|jd | |d  |jd ksPtqPd S )Nprecomputedkernelr   r+   )r"   r   r@   rA   rB   r   r2   dotr   r4   rC   rD   Zpairwise_indices_r   rF   )clf_precomputedr7   r8   	ovr_falselinear_kernelZn_estimatorsZprecomputed_indicesidxr9   r9   r:   test_pairwise_indices  s    
r   c            
      C   s   t jt j } }|d dkst| dd } |dd }| jdksDttjdd| |}|jdksftt	|| |}|jdkst|j
D ]}|jdkstqt|| |}|jdkst|jdkstt|j
dkst|j
D ]}|jdkstq| | j }|jd	ksttjd
d||}|jdks4tt	|||}|jdksTt|jdksdtt|j
dksxt|j
D ]}|jdks~tq~t|||}	|	jdkst|jdkstt|j
dkst|	j
d jdkst|	j
d jdkst|	j
d jdkstdS )a  Check the n_features_in_ attributes of the meta and base estimators

    When the training data is a regular design matrix, everything is intuitive.
    However, when the training data is a precomputed kernel matrix, the
    multiclass strategy can resample the kernel matrix of the underlying base
    estimator both row-wise and column-wise and this has a non-trivial impact
    on the expected value for the n_features_in_ of both the meta and the base
    estimators.
    rZ   r   N)   r   linearr   r   r&   )r   r   r   r   c   r+   r,   rL   )r@   rA   rB   rF   r   r"   r   r4   Zn_features_in_r   rD   r   Z
n_classes_rC   r   )
r7   r8   clf_notprecomputedZovr_notprecomputedZestZovo_notprecomputedKr   Zovr_precomputedZovo_precomputedr9   r9   r:   test_pairwise_n_features_in  sD    




r   MultiClassClassifierc                 C   sH   t jdd}t  }| |}| d r,t| |}| d sDtd S )Nr   r   Zpairwise)r"   r   Z	_get_tagsrF   )r   r   r   r   Zovr_truer9   r9   r:   test_pairwise_tagG  s    r   c           
      C   sr   t jdd}t jdd}tjtj }}| |}| |}t||j}t|||dd}t|||dd}	t	|	| d S )Nr   r   r   raise)Zerror_score)
r"   r   r@   rA   rB   r2   r   r   r   r   )
r   r   r   r7   r8   Zmulticlass_clf_notprecomputedZmulticlass_clf_precomputedr   Zscore_not_precomputedZscore_precomputedr9   r9   r:   test_pairwise_cross_val_scoreU  s&          r   c                 C   s|   t jd}tjtj }}t |}|jddg|jddgd	t
}t j||< tt t|d}| ||||| d S )N*   r+   r   r   r]   )pr'   )r2   rT   RandomStater@   rA   rB   copychoicer   rp   boolnanr    r!   r   r4   r   )r   rngr7   r8   masklrr9   r9   r:   test_support_missing_valuesk  s    	
 
r  make_yc                 C   sj   t d}| dt jd}tt }||| ||}t |jd df}d|dddf< t	|| dS )zUCheck that constant y target does not raise.

    Non-regression test for #21869
    r{   )r|   r+   )Zdtyper   r,   r+   N)
r2   r~   Zint32r   r   r4   rn   r   r   r   )r  r7   r8   r5   r   expectedr9   r9   r:   test_constant_int_target~  s    


r  c                  C   sT   t dd\} }tddd}t|}|| | || | t|| ||  dS )z^Check that ovo is consistent with binary classifier.

    Non-regression test for #13617.
    T)Z
return_X_y   Zdistance)Zn_neighborsweightsN)r%   r   r   r4   r   r0   )r7   r8   rI   r   r9   r9   r:   )test_ovo_consistent_binary_classification  s    r  )yZnumpyr2   Zscipy.sparserr   ri   r.   Znumpy.testingr   rer   Zsklearn.utils._testingr   r   Zsklearn.utils._mockingr   Zsklearn.multiclassr   r   r	   Zsklearn.utils.multiclassr
   r   Zsklearn.utilsr   r   Zsklearn.metricsr   r   Zsklearn.svmr   r   Zsklearn.naive_bayesr   Zsklearn.linear_modelr   r   r   r   r   r   r   Zsklearn.treer   r   Zsklearn.neighborsr   Zsklearn.model_selectionr   r   Zsklearn.pipeliner   r    Zsklearn.imputer!   Zsklearnr"   Zsklearn.exceptionsr#   r$   Zsklearn.datasetsr%   r6   markfilterwarningsZ
pytestmarkr   r@   rT   r   r   ZpermutationrB   sizepermrA   rE   r;   r>   rK   rX   r\   r^   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zparametrizer   r   r  r~   r   r  r  r9   r9   r9   r:   <module>   s   $	$0$(-	5/	
	E 
 
 

