a
    ;Za8d                  
   @   s  d dl 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 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l0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6 d dlm7Z7 dd  Z8d!d" Z9d#d$ Z:d%d& Z;d'd( Z<d)d* Z=d+d, Z>e? Z@e@jAZBe@jCZDe-eDd-d.ZEe-eDd/d.ZFeGeDeEeFfZHeBjI\ZJZKeHjId- ZLeMeNeDZOePeQejNeDeEeFfZRd0d1 ZSd2d3 ZTd4d5 ZUd6d7 ZVd8d9 ZWd:d; ZXd<d= ZYd>d? ZZd@dA Z[dBdC Z\dDdE Z]e j^_dFdGdHgdIdJ Z`dKdL ZadMdN ZbdOdP ZcdQdR ZddSdT ZedUdV ZfdWdX ZgdYdZ Zhd[d\ Zie j^_d]ed/d^e'ed/d^e%ed/d^gd_d` ZjG dadb dbe1ZkG dcdd dde2Zle j^mdee j^_dfe'eldgdhen fe(ek ejodid djfgdkdl Zpdmdn Zqe j^_doe'efe(efgdpdq Zre j^_drePejsetgdsdt Zududv Zvdwdx ZwdS )y    N)	cpu_count)assert_almost_equal)assert_array_equal)assert_array_almost_equal)datasets)clone)make_classification)load_linnerud)GradientBoostingRegressorRandomForestClassifier)NotFittedError)Lasso)LogisticRegression)OrthogonalMatchingPursuit)Ridge)SGDClassifier)SGDRegressor)jaccard_scoremean_squared_error)OneVsRestClassifier)ClassifierChainRegressorChain)MultiOutputClassifier)MultiOutputRegressor)	LinearSVC)ClassifierMixin)shuffle)GridSearchCV)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   Z	n_targetsrandom_state2   r&   )
r   make_regressionnp
zeros_likeranger
   fitpredictr   r   )
XyX_trainy_trainX_testy_test
referencesnrgry_pred r9   =lib/python3.9/site-packages/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r4J d S )	Nr$   r   r%   r'         r&   max_iterpartial_fit)r   r)   r*   r+   r,   r   r@   r.   r   r   hasattrr   )r/   r0   r1   r2   r3   r4   r5   
half_indexr6   Zsgrr8   r9   r9   r:   (test_multi_target_regression_partial_fit6   s     
  

rC   c                  C   sb   t jddd\} }ttdd}d}tjt|d || | W d    n1 sT0    Y  d S )N   r   r%   r(   zat least two dimensionsmatch)r   r)   r   r
   pytestraises
ValueErrorr-   )r/   r0   r7   msgr9   r9   r:   'test_multi_target_regression_one_targetM   s
    rK   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   r-   r   r.   )r/   r0   r1   r2   r3   sparser7   Z
rgr_sparser9   r9   r:   #test_multi_target_sparse_regressionV   s    rO   c                  C   s   g dg dg} ddgddgg}ddg}t t }d}tjt|d || || W d    n1 sh0    Y  t td	d
}|| || d S )NrD      r$      r=      T㥛 	@X9v@g?g333333?zdoes not support sample weightsrE   r   r(   )r   r   rG   rH   rI   r-   r
   )r/   r0   wr7   rJ   r9   r9   r:   $test_multi_target_sample_weights_apik   s    
,rX   c                  C   s   g dg d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sJ d S )
NrP   rR   rU   rV          @      ?r   r=   r>   )r   r   r@   r.   )r/   r0   rW   rgr_wr7   r9   r9   r:   +test_multi_target_sample_weight_partial_fitz   s    r\   c                  C   s   g dg dg} ddgddgg}ddg}t tdd}|| || g dg dg dg}ddgddgddgg}t tdd}||| g d	g d
g}t|||| d S )NrP   rR   rU   rV   rY   rZ   r   r(   g      ?g      @      @r^   g      @g      @)r   r
   r-   r   r.   )XwywrW   r[   r/   r0   r7   r3   r9   r9   r:    test_multi_target_sample_weights   s    rb   rD   r(   rQ   c                  C   sb   t dddd} t| dd}|ttt |jd }|tt |jd }t dkr^||us^J d S )NlogrD   r=   lossr&   r?   rS   )Zn_jobsr   )r   r   r@   r/   r0   classesestimators_r   )sgd_linear_clfZmorest1est2r9   r9   r:   8test_multi_output_classification_partial_fit_parallelism   s    


rk   c                  C   sb   t ddd} t| }|tt t|dr.J t dddd} t| }|tt t|ds^J d S )NrD   r=   r>   predict_probarc   rd   )r   r   r-   r/   r0   rA   )rh   multi_target_linearr9   r9   r:   'test_hasattr_multi_output_predict_proba   s    rn   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 d    n1 s0    Y  d S )NrD   r=   rc   )r&   r?   re   re   )Zhingerc   Zmodified_huberc                 S   s   t | drdS dS d S )Nrl   rZ   g        )rA   )	estimatorr/   r0   r9   r9   r:   custom_scorer   s    
z6test_multi_output_predict_proba.<locals>.custom_scorerr$   )Z
param_gridZscoringcvr>   z8probability estimates are not available for loss='hinge'rE   )
r   r   r   r-   r/   r0   rl   rG   rH   AttributeError)rh   Zparamrp   Zgrid_clfrm   err_msgr9   r9   r:   test_multi_output_predict_proba   s    
rt   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`J |t|d  t|d   |t}tt	f|jksJ 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 )	Nrc   rD   r=   rd   r   rQ   )rf   r$   )r   r   r/   shaper@   r0   rf   r.   	n_samples	n_outputsr,   r   r   )rh   rm   rB   Zfirst_predictionsZsecond_predictionsir9   r9   r:   ,test_multi_output_classification_partial_fit   s"     

 ry   c                  C   sX   t dddd} t| }d}tjt|d |tt W d    n1 sJ0    Y  d S )Nrc   rD   r=   rd   z8classes must be passed on the first call to partial_fit.rE   )r   r   rG   rH   rI   r@   r/   r0   )rh   rm   rJ   r9   r9   r:   Gtest_multi_output_classification_partial_fit_no_first_classes_exception  s
    rz   c                  C   s   t ddd} t| }|tt |t}ttf|jks<J |	t}t
|tksVJ |D ]}ttf|jksZJ qZttjt|dd| tdD ]f}t| }|ttd d |f  t|tt|d d |f ksJ tt|	tt||  qd S )N
   rD   n_estimatorsr&   Zaxisr$   )r   r   r-   r/   r0   r.   rv   rw   ru   rl   len	n_classesr   r*   ZargmaxZdstackr,   r   list)forestZmulti_target_forestpredictionsrl   Zclass_probabilitiesrx   Zforest_r9   r9   r:    test_multi_output_classification  s    

&r   c                  C   s   t dd} t| }t|}|tt |t}ttf|j	ksBJ t
dD ]J}t|}|ttd d |f  t|tt|d d |f ksJJ qJd S )Nr   r(   r$   )r   r   r   r-   r/   r0   r.   rv   rw   ru   r,   r   r   )ZsvcZmulti_class_svcZmulti_target_svcr   rx   Zmulti_class_svc_r9   r9   r:   %test_multiclass_multioutput_estimator(  s    

r   c            
   	   C   s   d} t j| }|jdd}t g ddd}t g d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 g dg dg dg dg dgg}tt|D ]}	t||	 ||	  qd S )Ni  )r=   r=   )size)bar   r   r   r=   rD   )defr   r   r~   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RandomStateZnormalarrayZreshapeZconcatenater   r   r-   rl   r,   r   r   )
Zseedrngr/   y1y2YclfZy_resultZy_actualrx   r9   r9   r:   3test_multiclass_multioutput_estimator_predict_proba:  s<    

	r   c            	      C   s   g dg dg} ddgddgg}t ddg}tddd	}t|}|| || g dg dg dg}ddgddgddgg}tddd	}t|}||| g d
g dg}t|||| d S )NrP   rR   r$   rQ   rY   rZ   r{   rD   r|   r]   r_   )r*   asarrayr   r   r-   r   r.   )	r`   ra   rW   r   clf_wr/   r0   r   r3   r9   r9   r:   /test_multi_output_classification_sample_weightsi  s    r   c            	      C   s   g dg dg dg} ddgddgddgg}t g d}tddd	}t|}|| || g dg dg dg dg}ddgddgddgddgg}tddd	}t|}||| g dg}t|||| d S )
NrP   rR   r]   r$   rQ   )rY   rZ   rZ   rD      r>   )r*   r   r   r   r-   r   r.   )	r`   ra   rW   rh   r   r/   r0   r   r3   r9   r9   r:   ;test_multi_output_classification_partial_fit_sample_weights}  s    
r   c                  C   s   t tdd} tt | tt W d    n1 s:0    Y  t	t
tf}| tt tt | t| W d    n1 s0    Y  d}tjt|d( | ttd d df  W d    n1 s0    Y  d S )Nr   r(   zUnknown label typerE   rD   )r   r   rG   rH   r   scorer/   r0   r*   column_stackr   r   r-   rI   )mocZy_newrJ   r9   r9   r:   test_multi_output_exceptions  s    **r   response_methodrl   r.   c                 C   sF   t t }tt t|| t W d   n1 s80    Y  dS )zECheck that we raise the proper error when the estimator is not fittedN)r   r   rG   rH   r   getattrr/   )r   r   r9   r9   r:   "test_multi_output_not_fitted_error  s    
r   c                  C   s   t t } t| dsJ | tt t| ds2J t t } t| drJJ d}tjt	|d | 
t W d   n1 s|0    Y  | tt t| drJ tjt	|d | 
t W d   n1 s0    Y  dS )zVCheck the behavior for the delegation of predict_proba to the underlying
    estimatorrl   z3'LinearSVC' object has no attribute 'predict_proba'rE   N)r   r   rA   r-   r/   r0   r   rG   rH   rr   rl   )r   rJ   r9   r9   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   )rv   
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 r9   )int).0Zyyyr9   r9   r:   
<listcomp>      zLgenerate_multilabel_dataset_with_correlations.<locals>.<listcomp>.<listcomp>z#06brQ   N)format)r   Zyyr9   r9   r:   r     r   zAgenerate_multilabel_dataset_with_correlations.<locals>.<listcomp>)r   r*   r   )r/   r0   ZY_multir9   r9   r:   -generate_multilabel_dataset_with_correlations  s
    

r   c                  C   sh   t  \} }tt }|| | || }|j|jks:J || }|dk}t|| t|drdJ d S )Nr   rl   )	r   r   r   r-   r.   ru   Zdecision_functionr   rA   )r/   r   classifier_chainY_predZ
Y_decisionY_binaryr9   r9   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   rL   rM   r   r   r-   r.   r   )r/   r   X_sparser   ZY_pred_sparseZY_pred_denser9   r9   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sJ d S )NiX  samplesZaverage)r   r   r   r-   r.   r   r   )
r/   r   r1   r3   ZY_trainZY_testZovrZ
Y_pred_ovrchainZY_pred_chainr9   r9   r:   +test_classifier_chain_vs_independent_models  s    




r   c                  C   s   t  \} }tt tt g}|D ]b}|| | || }|j|jksLJ dd |jD t	t
| jd | jd |jd  ks"J q"|d | }|dk}t|| t|d tsJ d S )Nc                 S   s   g | ]}|j jqS r9   )coef_r   )r   cr9   r9   r:   r     r   z3test_base_chain_fit_and_predict.<locals>.<listcomp>rD         ?)r   r   r   r   r   r-   r.   ru   rg   r   r,   rl   r   
isinstancer   )r/   r   Zchainsr   r   ZY_probr   r9   r9   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s4J q4d S )Nr$   rq   )
r   rL   rM   r   r   r   r   r-   r.   ru   )r/   r   r   Zbase_chainsr   r   r9   r9   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sJ t|jdksJ tt|jdksJ t|j|jD ]\}}t|j|j qqd S )Nr   *   )orderr&   r   rS   )r   r   r   r   r   r   
set_paramsr-   Zorder_r   r   r   r,   r   setziprg   r   r   )r/   r   r   Zchain_randomZchain_fixedri   rj   r9   r9   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snJ t
||krJ t|trt||dddksJ qt||dk sJ qd S )Nr$   r   r   r   g?g      ?)r   r   r   r   r   r-   r   r   r.   ru   r*   allr   r   r   )r/   r   r   Zchain_cvZ	Y_pred_cvr   r9   r9   r:   (test_base_chain_crossval_fit_and_predict8  s    



r   ro   )r}   c                 C   sR   |  tt t| jtsJ t| jtks.J tt	| jD ]\}}t
|| q:d S r   )r-   r/   r0   r   Zclasses_r   r   rw   r   rf   r   )ro   Zestimator_classesZexpected_classesr9   r9   r:   test_multi_output_classes_L  s
    r   c                       s   e Zd Zd fdd	Z  ZS )DummyRegressorWithFitParamsNc                    s   || _ t |||S r   _fit_paramssuperr-   selfr/   r0   sample_weight
fit_params	__class__r9   r:   r-   _  s    zDummyRegressorWithFitParams.fit)N__name__
__module____qualname__r-   __classcell__r9   r9   r   r:   r   ^  s   r   c                       s   e Zd Zd fdd	Z  ZS )DummyClassifierWithFitParamsNc                    s   || _ t |||S r   r   r   r   r9   r:   r-   e  s    z DummyClassifierWithFitParams.fit)Nr   r9   r9   r   r:   r   d  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v s(J q(d S )N)
some_paramr   )r*   r+   r-   rg   r   )ro   Zdatasetr/   r0   r   Zdummy_estimatorr9   r9   r:   *test_multioutput_estimator_with_fit_paramsj  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i | |j
D ]}|j|u sjJ qjd 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i | d S )Nr   )sample_weight_r   r-   )r   r/   r0   r   r   r9   r:   r-     s    
z4test_regressor_chain_w_fit_params.<locals>.MySGD.fitr   r9   r9   r   r:   MySGD  s   r   r   )r*   r   r   r   r)   Zrandru   r   r   r-   rg   r   )r   r/   r0   Zweightr   ZmodelZ	fit_paramZestr9   r9   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'   rQ   rD   r   )r'   r$   r   g{Gz?gGz?)p)r*   r   r   ZrandnZbinomialZchoiceru   Zastypeboolnanr    r!   r-   r   )ZMultiOutputEstimatorZ	Estimatorr   r/   r0   maskpiper9   r9   r:   test_support_missing_values  s    
 
r   
order_typec                 C   sz   g dg dg dg}ddgddgddgg}| ddg}t t |d}||| g dg}ddgg}t||| d S )	NrP   rR   r]   r$   rQ   rD   r   r   )r   r   r-   r   r.   )r   r/   r0   r   r   r3   r4   r9   r9   r:   !test_classifier_chain_tuple_order  s    

r   c                  C   s   g dg dg dg} ddgddgddgg}t ddg}tt |d}tjtdd	 || | W d    n1 sv0    Y  d S )
NrP   rR   r]   r$   rQ   rD   r   zinvalid orderrE   )tupler   r   rG   rH   rI   r-   )r/   r0   r   r   r9   r9   r:   )test_classifier_chain_tuple_invalid_order  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sgdrD   r(   rQ   )Z
estimatorsZfinal_estimatorrq   )ro   N)r	   r"   r   r   r   r-   r.   )r/   r0   ZstackerZregr9   r9   r:   4test_multioutputregressor_ducktypes_fitted_estimator  s    r   )xrG   Znumpyr*   Zscipy.sparserN   rL   Zjoblibr   Zsklearn.utils._testingr   r   r   Zsklearnr   Zsklearn.baser   Zsklearn.datasetsr   r	   Zsklearn.ensembler
   r   Zsklearn.exceptionsr   Zsklearn.linear_modelr   r   r   r   r   r   Zsklearn.metricsr   r   Zsklearn.multiclassr   Zsklearn.multioutputr   r   r   r   Zsklearn.svmr   r   Zsklearn.utilsr   Zsklearn.model_selectionr   Zsklearn.dummyr   r   Zsklearn.pipeliner    Zsklearn.imputer!   r"   r;   rC   rK   rO   rX   r\   rb   Z	load_irisZirisdatar/   targetr   r   Zy3r   r0   ru   rv   r   rw   r   uniquer   r   maprf   rk   rn   rt   ry   rz   r   r   r   r   r   r   ZmarkZparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   filterwarningsZmake_multilabel_classificationr)   r   r   r   r   r   r   r   r   r9   r9   r9   r:   <module>   s   	

/


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