U
    3dpj                  
   @   s8  d dl Z d dlZd dlm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 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" d dl#m$Z$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/m0Z0 d dlm1Z1 d dl2m3Z3 d dl4m5Z5m6Z6 d dl7m8Z8m9Z9 d d l:m;Z; d d!l<m=Z= d d"lm>Z> d#d$ Z?d%d& Z@d'd( ZAd)d* ZBd+d, ZCd-d. ZDd/d0 ZEeF ZGeGjHZIeGjJZKe3eKd1d2ZLe3eKd3d2ZMeNeKeLeMfZOeIjP\ZQZReOjPd1 ZSeTeUeKZVeWeXejUeKeLeMfZYd4d5 ZZd6d7 Z[d8d9 Z\d:d; Z]d<d= Z^d>d? Z_d@dA Z`dBdC ZadDdE ZbdFdG ZcdHdI Zde jefdJdKdLgdMdN ZgdOdP ZhdQdR ZidSdT ZjdUdV ZkdWdX ZldYdZ Zmd[d\ Znd]d^ Zod_d` Zpe jefdaed3dbe+ed3dbe)ed3dbgdcdd ZqG dedf dfe8ZrG dgdh dhe9Zse jetdie jefdje+esdkdle fe,er ejdmd dnfgdodp Zudqdr Zve jefdse+efe,efgdtdu Zwe jefdveWejxeygdwdx Zzdydz Z{d{d| Z|d}d~ Z}dd Z~dS )    N)	cpu_count)assert_almost_equal)assert_array_equal)assert_array_almost_equal)datasets)clone)make_classification)load_linnerud)make_multilabel_classification)make_regression)GradientBoostingRegressorRandomForestClassifier)NotFittedError)Lasso)LogisticRegression)OrthogonalMatchingPursuit)Ridge)SGDClassifier)SGDRegressor)LinearRegression)jaccard_scoremean_squared_error)OneVsRestClassifier)ClassifierChainRegressorChain)MultiOutputClassifier)MultiOutputRegressor)	LinearSVC)DecisionTreeClassifier)ClassifierMixin)shuffle)GridSearchCVtrain_test_split)DummyRegressorDummyClassifier)make_pipeline)SimpleImputer)StackingRegressorc            
      C   s   t jddd\} }| d d |d d  }}| dd  |dd   }}t|}tdD ]<}tdd}|||d d |f  |||d d |f< qXttdd}||| ||}	t	||	 d S N   r   	n_targetsrandom_state2   r,   )
r   r   np
zeros_likeranger   fitpredictr   r   )
XyX_trainy_trainX_testy_test
referencesnrgry_pred r>   B/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/tests/test_multioutput.pytest_multi_target_regression)   s    


r@   c                  C   s8  t jddd\} }| d d |d d  }}| dd  |dd   }}t|}d}tdD ]f}tddd}	|	|d | |d ||f  |	||d  ||d |f  |	||d d |f< q\ttddd}	|	|d | |d |  |	||d  ||d   |	|}
t	||
 t
ttdr4td S )	Nr)   r   r*   r-         r,   max_iterpartial_fit)r   r   r/   r0   r1   r   rE   r3   r   r   hasattrr   AssertionError)r4   r5   r6   r7   r8   r9   r:   
half_indexr;   Zsgrr=   r>   r>   r?   (test_multi_target_regression_partial_fit;   s     
  

rI   c               	   C   sN   t jddd\} }ttdd}d}tjt|d || | W 5 Q R X d S )N   r   r*   r.   zat least two dimensionsmatch)r   r   r   r   pytestraises
ValueErrorr2   )r4   r5   r<   msgr>   r>   r?   'test_multi_target_regression_one_targetR   s
    rQ   c                  C   s   t jddd\} }| d d |d d  }}| dd  }tjtjtjtjtjfD ]V}tt	dd}tt	dd}|
|| |
||| t||||| qPd S r(   )r   r   sp
csr_matrixZ
csc_matrixZ
coo_matrixZ
dok_matrixZ
lil_matrixr   r   r2   r   r3   )r4   r5   r6   r7   r8   sparser<   Z
rgr_sparser>   r>   r?   #test_multi_target_sparse_regression[   s    rU   c               	   C   s   dddgdddgg} ddgddgg}d	d
g}t t }d}tjt|d || || W 5 Q R X t tdd}|| || d S )NrJ      r)      rB      T㥛 	@X9v@g?g333333?zdoes not support sample weightsrK   r   r.   )r   r   rM   rN   rO   r2   r   )r4   r5   wr<   rP   r>   r>   r?   $test_multi_target_sample_weights_apip   s    
r\   c                  C   s   dddgdddgg} ddgddgg}d	d
g}t tddd}|| || d	d	g}t tddd}|| || || d d || d d kstd S )NrJ   rV   r)   rW   rB   rX   rY   rZ          @      ?r   rC   )r   r   rE   r3   rG   )r4   r5   r[   rgr_wr<   r>   r>   r?   +test_multi_target_sample_weight_partial_fit   s    r`   c                  C   s   dddgdddgg} ddgddgg}d	d
g}t tdd}|| || dddgdddgdddgg}ddgddgddgg}t tdd}||| dddgdddgg}t|||| d S )NrJ   rV   r)   rW   rB   rX   rY   rZ   r]   r^   r   r.         ?      @      @      @      @)r   r   r2   r   r3   )Xwywr[   r_   r4   r5   r<   r8   r>   r>   r?    test_multi_target_sample_weights   s    rh   rJ   r.   rV   c                  C   sb   t dddd} t| dd}|ttt |jd }|tt |jd }t dkr^||k	s^td S )Nlog_lossrJ   rB   lossr,   rD   rW   )Zn_jobsr   )	r   r   rE   r4   r5   classesestimators_r   rG   )sgd_linear_clfZmorest1est2r>   r>   r?   8test_multi_output_classification_partial_fit_parallelism   s    


rq   c                  C   sb   t ddd} t| }|tt t|dr.tt dddd} t| }|tt t|ds^td S )NrJ   rB   rC   predict_probari   rj   )r   r   r2   r4   r5   rF   rG   )rn   multi_target_linearr>   r>   r?   'test_hasattr_multi_output_predict_proba   s    rt   c               	   C   s   t dddd} ddi}dd }t| ||d	d
}t|}|tt |t t ddd} t| }|tt d}tjt	|d |t W 5 Q R X d S )NrJ   rB   ri   )r,   rD   rk   rk   )ZhingelogZmodified_huberc                 S   s   t | drdS dS d S )Nrr   r^   g        )rF   )	estimatorr4   r5   r>   r>   r?   custom_scorer   s    
z6test_multi_output_predict_proba.<locals>.custom_scorerr)   )Z
param_gridZscoringcvrC   z8probability estimates are not available for loss='hinge'rK   )
r   r!   r   r2   r4   r5   rr   rM   rN   AttributeError)rn   paramrw   Zgrid_clfrs   err_msgr>   r>   r?   test_multi_output_predict_proba   s$       
r|   c                  C   s2  t dddd} t| }tjd d }|jtd | td | td |t}tt	f|jks`t
|t|d  t|d   |t}tt	f|jkst
tdD ]}t| } | jtd | td ||f t| d t| t|d d |f  | t|d  t|d |f  t| t|d d |f  qd S )	Nri   rJ   rB   rj   r   rV   )rl   r)   )r   r   r4   shaperE   r5   rl   r3   	n_samples	n_outputsrG   r1   r   r   )rn   rs   rH   Zfirst_predictionsZsecond_predictionsir>   r>   r?   ,test_multi_output_classification_partial_fit   s&     


   r   c               	   C   sD   t dddd} t| }d}tjt|d |tt W 5 Q R X d S )Nri   rJ   rB   rj   z8classes must be passed on the first call to partial_fit.rK   )r   r   rM   rN   rO   rE   r4   r5   )rn   rs   rP   r>   r>   r?   Gtest_multi_output_classification_partial_fit_no_first_classes_exception  s
    r   c                  C   s   t ddd} t| }|tt |t}ttf|jks<t	|
t}t|tksVt	|D ]}ttf|jksZt	qZttjt|dd| tdD ]f}t| }|ttd d |f  t|tt|d d |f kst	tt|
tt||  qd S )N
   rJ   n_estimatorsr,   Zaxisr)   )r   r   r2   r4   r5   r3   r~   r   r}   rG   rr   len	n_classesr   r/   ZargmaxZdstackr1   r   list)forestZmulti_target_forestpredictionsrr   Zclass_probabilitiesr   Zforest_r>   r>   r?    test_multi_output_classification  s    

&r   c                  C   s   t dd} t| }t|}|tt |t}ttf|j	ksBt
tdD ]J}t|}|ttd d |f  t|tt|d d |f ksJt
qJd S )Nr   r.   r)   )r   r   r   r2   r4   r5   r3   r~   r   r}   rG   r1   r   r   )ZsvcZmulti_class_svcZmulti_target_svcr   r   Zmulti_class_svc_r>   r>   r?   %test_multiclass_multioutput_estimator-  s    

r   c            
   
   C   s  d} t j| }|jdd}t dddddgdd}t dd	d
d	dgdd}t j||gdd}ttd| d}|	|| |
|}t ddgddgddgddg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g}tt|D ]}	t||	 ||	  qd S )'Ni  )rB   rB   )sizebarB   rJ   defr   Z	liblinear)Zsolverr,   gu)"?gu_|?gtĳ?gv?g/?g ?gK[aS?g[rO?ga]q?g?kDQ?g 8칌?g?go|̋<?gOW?gڔ#K?gz~?gP1s&q?gf^?g]=!?g{Y;?ghJ?gL$$S?gXA	?g 7%?g?)r/   randomRandomStatenormalarrayZreshapeZconcatenater   r   r2   rr   r1   r   r   )
seedrngr4   y1y2YclfZy_resultZy_actualr   r>   r>   r?   3test_multiclass_multioutput_estimator_predict_proba?  s<    

	r   c            	      C   s   dddgdddgg} ddgddgg}t ddg}td	dd
}t|}|| || dddgdddgdddgg}ddgddgddgg}td	dd
}t|}||| dddgdddgg}t|||| d S )NrJ   rV   r)   rW   rB   rX   r]   r^   r   r   ra   rb   rc   rd   re   )r/   asarrayr   r   r2   r   r3   )	rf   rg   r[   r   clf_wr4   r5   r   r8   r>   r>   r?   /test_multi_output_classification_sample_weightsn  s    r   c            	      C   s   dddgdddgddd	gg} ddgddgddgg}t d
ddg}tddd}t|}|| || dddgdddgdddgddd	gg}ddgddgddgddgg}tddd}t|}||| ddd	gg}t|||| d S )NrJ   rV   r)   rW   rB   rX   ra   rb   rc   r]   r^      rC   )r/   r   r   r   r2   r   r3   )	rf   rg   r[   rn   r   r4   r5   r   r8   r>   r>   r?   ;test_multi_output_classification_partial_fit_sample_weights  s    $r   c               	   C   s   t tdd} tt | tt W 5 Q R X t	t
tf}| tt tt | t| W 5 Q R X d}tjt|d | ttd d df  W 5 Q R X d S )Nr   r.   zUnknown label typerK   rJ   )r   r   rM   rN   r   scorer4   r5   r/   column_stackr   r   r2   rO   )mocZy_newrP   r>   r>   r?   test_multi_output_exceptions  s    r   response_methodrr   r3   c              	   C   s2   t t }tt t|| t W 5 Q R X dS )zECheck that we raise the proper error when the estimator is not fittedN)r   r   rM   rN   r   getattrr4   )r   r   r>   r>   r?   "test_multi_output_not_fitted_error  s    
r   c               	   C   s   t t } t| dst| tt t| ds2tt t } t| drJtd}tj	t
|d | t W 5 Q R X | tt t| drttj	t
|d | t W 5 Q R X dS )zVCheck the behavior for the delegation of predict_proba to the underlying
    estimatorrr   z3'LinearSVC' object has no attribute 'predict_proba'rK   N)r   r   rF   rG   r2   r4   r5   r   rM   rN   ry   rr   )r   rP   r>   r>   r?   (test_multi_output_delegate_predict_proba  s    

r   c                  C   s2   t dddddd\} }tdd |D }| |fS )	Ni  d      r   r   )r~   
n_featuresr   Zn_informativer,   c                 S   s(   g | ] }d d t |ddd D qS )c                 S   s   g | ]}t |qS r>   )int).0Zyyyr>   r>   r?   
<listcomp>  s     zLgenerate_multilabel_dataset_with_correlations.<locals>.<listcomp>.<listcomp>z#06brV   N)format)r   yyr>   r>   r?   r     s     zAgenerate_multilabel_dataset_with_correlations.<locals>.<listcomp>)r   r/   r   )r4   r5   ZY_multir>   r>   r?   -generate_multilabel_dataset_with_correlations  s        
r   c                  C   sh   t  \} }tt }|| | || }|j|jks:t|| }|dk}t|| t	|drdtd S )Nr   rr   )
r   r   r   r2   r3   r}   rG   Zdecision_functionr   rF   )r4   r   classifier_chainY_predZ
Y_decisionY_binaryr>   r>   r?   5test_classifier_chain_fit_and_predict_with_linear_svc  s    




r   c                  C   sb   t  \} }t| }tt }||| ||}tt }|| | || }t|| d S N)r   rR   rS   r   r   r2   r3   r   )r4   r   X_sparser   ZY_pred_sparseZY_pred_denser>   r>   r?   6test_classifier_chain_fit_and_predict_with_sparse_data  s    





r   c            
      C   s   t  \} }| d dd d f }| dd d d f }|d dd d f }|dd d d f }tt }||| ||}tt }||| ||}	t||	ddt||ddkstd S )NiX  samplesZaverage)r   r   r   r2   r3   r   r   rG   )
r4   r   r6   r8   ZY_trainZY_testZovrZ
Y_pred_ovrchainZY_pred_chainr>   r>   r?   +test_classifier_chain_vs_independent_models  s     




  r   c                  C   s   t  \} }tt tt g}|D ]b}|| | || }|j|jksLtdd |j	D t
t| jd | jd |jd  ks"tq"|d | }|dk}t|| t|d tstd S )Nc                 S   s   g | ]}|j jqS r>   )coef_r   )r   cr>   r>   r?   r     s     z3test_base_chain_fit_and_predict.<locals>.<listcomp>rJ         ?)r   r   r   r   r   r2   r3   r}   rG   rm   r   r1   rr   r   
isinstancer   )r4   r   Zchainsr   r   ZY_probr   r>   r>   r?   test_base_chain_fit_and_predict
  s    


r   c                  C   sd   t  \} }t| }tt ddtt ddg}|D ]*}||| ||}|j	|j	ks4t
q4d S )Nr)   rx   )r   rR   rS   r   r   r   r   r2   r3   r}   rG   )r4   r   r   Zbase_chainsr   r   r>   r>   r?   7test_base_chain_fit_and_predict_with_sparse_data_and_cv  s    


r   c                  C   s   t  \} }tt tt fD ]}t|jddd}|| | t|j|jd}|| | t	|j|j t
|jt
tdkstt|jdksttt|jdkstt|j|jD ]\}}t|j|j qqd S )Nr   *   )orderr,   r   rW   )r   r   r   r   r   r   
set_paramsr2   Zorder_r   r   r   r1   rG   r   setziprm   r   r   )r4   r   r   Zchain_randomZchain_fixedro   rp   r>   r>   r?   test_base_chain_random_order+  s    
r   c                  C   s   t  \} }tt tt fD ]}|| | t|jdd}|| | || }|| }|j	|j	ksnt
t||krt
t|trt||dddkst
qt||dk st
qd S )Nr)   r   r   r   g?g      ?)r   r   r   r   r   r2   r   r   r3   r}   rG   r/   allr   r   r   )r4   r   r   Zchain_cvZ	Y_pred_cvr   r>   r>   r?   (test_base_chain_crossval_fit_and_predict=  s    



r   rv   )r   c                 C   sR   |  tt t| jtstt| jtks.tt	t
| jD ]\}}t|| q:d S r   )r2   r4   r5   r   Zclasses_r   rG   r   r   r   rl   r   )rv   Zestimator_classesZexpected_classesr>   r>   r?   test_multi_output_classes_Q  s
    r   c                       s   e Zd Zd fdd	Z  ZS )DummyRegressorWithFitParamsNc                    s   || _ t |||S r   _fit_paramssuperr2   selfr4   r5   sample_weight
fit_params	__class__r>   r?   r2   d  s    zDummyRegressorWithFitParams.fit)N__name__
__module____qualname__r2   __classcell__r>   r>   r   r?   r   c  s   r   c                       s   e Zd Zd fdd	Z  ZS )DummyClassifierWithFitParamsNc                    s   || _ t |||S r   r   r   r   r>   r?   r2   j  s    z DummyClassifierWithFitParams.fit)Nr   r>   r>   r   r?   r   i  s   r   z%ignore:`n_features_in_` is deprecatedzestimator, datasetZprior)Zstrategyr)   r*   c                 C   s@   |\}}t |}| j|||d | jD ]}d|jks(tq(d S )N)
some_paramr   )r/   r0   r2   rm   r   rG   )rv   Zdatasetr4   r5   r   Zdummy_estimatorr>   r>   r?   *test_multioutput_estimator_with_fit_paramso  s
    

r   c                  C   s~   t jd} tjddd\}}| |jd }G dd dt}t| }d|i}|j	||f| |j
D ]}|j|ksftqfd S )Nr   r)   r*   c                       s   e Zd Z fddZ  ZS )z0test_regressor_chain_w_fit_params.<locals>.MySGDc                    s    |d | _ t j||f| d S )Nr   )sample_weight_r   r2   )r   r4   r5   r   r   r>   r?   r2     s    
z4test_regressor_chain_w_fit_params.<locals>.MySGD.fitr   r>   r>   r   r?   MySGD  s   r   r   )r/   r   r   r   r   Zrandr}   r   r   r2   rm   r   rG   )r   r4   r5   Zweightr   modelZ	fit_paramZestr>   r>   r?   !test_regressor_chain_w_fit_params  s    

r   zMultiOutputEstimator, Estimatorc                 C   s|   t jd}|dd|ddd }}|jddg|jdd	gd
t}t j	||< t
t | }| ||||| d S )Nr   r-   rV   rJ   r   )r-   r)   r   g{Gz?gGz?)p)r/   r   r   ZrandnZbinomialchoicer}   Zastypeboolnanr%   r&   r2   r   )ZMultiOutputEstimatorZ	Estimatorr   r4   r5   maskpiper>   r>   r?   test_support_missing_values  s    
 
r   
order_typec                 C   s   dddgdddgddd	gg}ddgddgddgg}| dd
g}t t |d}||| ddd	gg}ddgg}t||| d S )NrJ   rV   r)   rW   rB   rX   ra   rb   rc   r   r   )r   r   r2   r   r3   )r   r4   r5   r   r   r8   r9   r>   r>   r?   !test_classifier_chain_tuple_order  s    
r   c               	   C   sv   dddgdddgddd	gg} ddgddgddgg}t ddg}tt |d
}tjtdd || | W 5 Q R X d S )NrJ   rV   r)   rW   rB   rX   ra   rb   rc   r   zinvalid orderrK   )tupler   r   rM   rN   rO   r2   )r4   r5   r   r   r>   r>   r?   )test_classifier_chain_tuple_invalid_order  s    r   c           	      C   sp   t dddddd\}}t||dd\}}}}d}tt ddd	gdd
d}||| t||  d sltd S )Nr   rB   r)   r   )r~   r   r   Zn_labelsr,   r.   z\[Chain\].*\(1 of 3\) Processing order 0, total=.*\n\[Chain\].*\(2 of 3\) Processing order 1, total=.*\n\[Chain\].*\(3 of 3\) Processing order 2, total=.*\n$rJ   rV   Tr   r,   verbose)	r
   r"   r   r   r2   rerL   
readouterrrG   )	capsysr4   r5   r6   r8   r7   r9   pattern
classifierr>   r>   r?   test_classifier_chain_verbose  s$        
r   c           	      C   sl   t dddd\}}t||dd\}}}}d}tt dddgdd	d
}||| t||  d shtd S )N}   r)   r   )r~   r+   r,   r.   z\[Chain\].*\(1 of 3\) Processing order 1, total=.*\n\[Chain\].*\(2 of 3\) Processing order 0, total=.*\n\[Chain\].*\(3 of 3\) Processing order 2, total=.*\n$rJ   rV   Tr   )	r   r"   r   r   r2   r   rL   r   rG   )	r   r4   r5   r6   r8   r7   r9   r   Z	regressorr>   r>   r?   test_regressor_chain_verbose  s    r   c                  C   sJ   t dd\} }tdtddfgt dd}t|d| |}||  d	S )
zkTest that MultiOutputRegressor checks the fitted estimator for
    predict. Non-regression test for #16549.T)Z
return_X_yZsgdrJ   r.   rV   )Z
estimatorsZfinal_estimatorrx   )rv   N)r	   r'   r   r   r   r2   r3   )r4   r5   Zstackerregr>   r>   r?   4test_multioutputregressor_ducktypes_fitted_estimator  s    r   )rM   Znumpyr/   Zscipy.sparserT   rR   Zjoblibr   r   Zsklearn.utils._testingr   r   r   Zsklearnr   Zsklearn.baser   Zsklearn.datasetsr   r	   r
   r   Zsklearn.ensembler   r   Zsklearn.exceptionsr   Zsklearn.linear_modelr   r   r   r   r   r   r   Zsklearn.metricsr   r   Zsklearn.multiclassr   Zsklearn.multioutputr   r   r   r   Zsklearn.svmr   Zsklearn.treer   r   Zsklearn.utilsr    Zsklearn.model_selectionr!   r"   Zsklearn.dummyr#   r$   Zsklearn.pipeliner%   Zsklearn.imputer&   r'   r@   rI   rQ   rU   r\   r`   rh   Z	load_irisZirisdatar4   targetr   r   Zy3r   r5   r}   r~   r   r   r   uniquer   r   maprl   rq   rt   r|   r   r   r   r   r   r   r   r   markZparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   filterwarningsr   r   r   r   r   r   r   r   r   r   r>   r>   r>   r?   <module>   s   	

/





