U
    3de                     @   s  d dl 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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 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$ d dl%m&Z& dBddZ'dd Z(d d! Z)d"d# Z*d$d% Z+d&d' Z,d(d) Z-d*d+ Z.ej/0d,eee gd-d. Z1d/d0 Z2d1d2 Z3ej/0d3d4d5d6d7gej/0d8d9d:d;gd<d= Z4d>d? Z5d@dA Z6dS )C    N)optimize)assert_allclose)	factorialxlogy)product)assert_almost_equal)assert_array_equal)assert_array_almost_equal)DummyRegressor)GridSearchCV)explained_variance_score)mean_absolute_error)mean_squared_error)mean_squared_log_error)median_absolute_error)mean_absolute_percentage_error)	max_error)mean_pinball_loss)r2_score)mean_tweedie_deviance)d2_tweedie_score)d2_pinball_score)d2_absolute_error_score)make_scorer)_check_reg_targets)UndefinedMetricWarning2   c                 C   s  t | }|d }|d }tt||d tt||tt d| t d|  tt||d tt||d tt||d tt||ddd tt||ddd tt||d t	||}t 
|st|dksttt||d tt||dd	 tt||d
ddd	 tt||d tt||d
dd tt||ddt|| tt||ddt|| t |t |  }tt||dt ||  |   d}dd }t j||d d}tt|||dd|||| ||||    tt||t||dd t dd|  }d	| }| }	tt||ddd|	 |	d	 d	|	  d   tt||dd|	d dt d	   tt||d	dd	t d	 d  tt||dddt d	 d |	 t |   tt||ddt d| d|	   d	t t|d	| |	d   }
tt||ddd|	d dt d	  |
   d	t |	d d	  d	|	 t t|	  }
tt||d	ddd	t d	 d |
   d S )N         ?      ?皙?alpha333333?    .Agףp=
?   Fforce_finiter   power皙?c                 S   s,   |t | | d d| t ||  d  S )Nr   r   )npmaximum)y_truey_predr"    r/   I/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/metrics/tests/test_regression.py<lambda>I   s
    z)test_regression_metrics.<locals>.<lambda>d   )qg?      ?            )r+   Zaranger   r   r   logr   r   r   r   isfiniteAssertionErrorr   r   r   r   r   absmediansumr	   r   Z
percentiler   sqrtmeanr   r   )	n_samplesr-   r.   Zy_pred_2mapeZ
dev_medianr"   Zpinball_lossZ
y_quantilenZdev_meanr/   r/   r0   test_regression_metrics"   s    

    "  , rE   c                  C   sL   t dggdggddd} t dggdggddd}t| t|ksHtd S )Nr   
   
raw_valuesTmultioutputsquaredF)r   r+   r@   pytestapproxr<   )Zmse1Zmse2r/   r/   r0   5test_mean_squared_error_multioutput_raw_value_squared|   s    rM   c                     s  t ddddgddddgddddggt ddddgddddgddddgg t } t| d t dd} t| ddd t } t| d	dd t } t| d t } t| d
 t jt dd} t 	| st
| dkst
t } t| d t dd} t| d t dd} t| d t ddd} fddtjd D }t t |d|}t|| t ddd}t||  ddg}t|ddgdd} t| d t|ddgdd} t| d t ddd} t| t j t ddd} t| t j d d d df  d d d df  t dd} t ddd}t| | t dd} t ddd}t| | t|ddgddd} t| t j t|ddgddd} t| t j  d S )Nr   r   g?FrJ   guV?r%   decimalr*   g?)Zdecimalsr$   r   variance_weightedrI   g      uniform_averageg      rG   r"   rI   c                    sj   g | ]b}d t dd|f  dd|f   t dd|f t dd|f     qS )r   N)r+   r=   r?   r>   ).0ir.   r-   r/   r0   
<listcomp>   s   (.z/test_multioutput_regression.<locals>.<listcomp>g      @r   gffffff@        rI   r'   r4   g      @)r+   arrayr   r   r   r   r   Zaroundr   r;   r<   r   r   r   rangeshapewhereisnanr	   rA   naninf)errorscoreZraw_expected_scoreZycZerror2r/   rW   r0   test_multioutput_regression   s    ((













      

      rd   c               	   C   s  t tdgdgd t tdgdgddd t tdgdgd t tdgdgd t tdgdgd t tdgdgd t tdgdgd t tdgdgd t tdgdgd t t	ddgddgd t t
ddgddgd t	tfD ]r} t | ddgddgd t | ddgddgddtj  t | ddgddgd t | ddgddgddtj qd	}tjt|d
 tdgdg W 5 Q R X d	}tjt|d
 tdddgdddg W 5 Q R X d	}tjt|d
 tdddgdddg W 5 Q R X d}ttdgdg|ddd|  dd d}tjt|d
 tdgdg|d W 5 Q R X tjt|d
  tdgd dgd |d W 5 Q R X t tdgdgdddd d}d}tjt|d
 tdgdg|d W 5 Q R X tjt|d
  tdgd dgd |d W 5 Q R X d}ttdgdg|ddd|   d}tjt|d
 tdgdg|d W 5 Q R X tjt|d
  tdgd dgd |d W 5 Q R X d}ttdgdg|dddd d}tjt|d
 tdgdg|d W 5 Q R X tjt|d
  tdgd dgd |d W 5 Q R X d}ttdgdg|dddd d}tjt|d
 tdgdg|d W 5 Q R X tjt|d
  tdgd dgd |d W 5 Q R X d}tjtdd
 tdgdg|d W 5 Q R X tjtdd
  tdgd dgd |d W 5 Q R X d S )NrY   FrN   r   r   r   r4   r&   zSMean Squared Logarithmic Error cannot be used when targets contain negative values.match      g       @g      @g       g333333r(   r%   gMbP?)Zrtolz-can only be used on strictly positive y_pred.z<only be used on non-negative y and strictly positive y_pred.r5   g:0yE>Zatolz3can only be used on strictly positive y and y_pred.r   z)is only defined for power<=0 and power>=1)r   r   r   r   r   r   r   r   r   r   r   r+   ra   r`   rK   raises
ValueErrorr   r   r   )smsgr)   r/   r/   r0   !test_regression_metrics_at_limits   s         
 $$ $$$rm   c               
   C   s:  ddddgdfddgdgdggdfdddgddgddggdfdddgddgddggdfddddgdddgdddggdfg} t | ddD ]\\}}}\}}}||kr||krt||d \}}}	}
||kst|dkrt|t|d	 t|	t|d	 nt|| t|	| qtt t||d  W 5 Q R X qd S )
NZ
continuousr   r%   r8   zcontinuous-multioutput   r9   )repeat)r4   r   )	r   r   r<   r   r+   ZreshaperK   ri   rj   )ZEXAMPLESZtype1y1Zn_out1Ztype2y2Zn_out2Zy_typeZy_check1Zy_check2rI   r/   r/   r0   test__check_reg_targets6  s"      
rr   c               	   C   sJ   d} d | }tjt|d$ tdddgdgdgdgg|  W 5 Q R X d S )NZthis_value_is_not_validzFAllowed 'multioutput' string values are.+You provided multioutput={!r}re   r   r%   r8   )formatrK   ri   rj   r   )Zinvalid_multioutputZexpected_messager/   r/   r0   !test__check_reg_targets_exceptionP  s    rt   c               	   C   s  ddgddgddgddgg} ddgddgdd	gdd
gg}t | |dd}t| |dd}d}tjt|d t| |dd W 5 Q R X tjt|d t| |dd W 5 Q R X t| |dd}t| |dd}t| |dd}t	| |dd}t| |ddd}	t	| |ddd}
t
|ddgdd t
|ddgdd t
|ddgdd t
|ddgdd t
|ddgdd t
|ddgdd t
|	ddgdd t
|
ddgdd d d ggd	 } ddggd	 }t | |dd}t| |dd}t| |dd}t| |dd}t| |dd}	t
|d!d!gdd t
|d!d!gdd t
|ddgdd t
|d"d"gdd t
|	d"d"gdd td dgd dggddgddggdd}t
|d d#gdd t|td dgd dggddgddggd$dkstt	d dgd dggddgddggdd}t
|d d%gdd t	d dgd dggddgddggddd}
t
|
tj d%gdd ddgddgg} dd	gddgg}t| |dd}t
|d!d&gdd t|t| |d$dkstt| |ddd}t
|tjd&gdd tt|t| |d$dd t	| |dd}t
|d!d&gdd t|t	| |kstt| |ddd}	t
|	d!d'gdd t	| |ddd}
t
|
tjd&gdd tt|
t	| |dd( tddgddgdd)gg} tddgddgd*d*gg}t| |dd}t td|  td| dd}t
||dd d S )+Nr   r%         @r4         @r8   rn      r9         @rG   rR   zgmultioutput is expected to be 'raw_values' or 'uniform_average' but we got 'variance_weighted' instead.re   rQ   r   rT   FrZ   g      ?g      ?rO         ?g      ?g      ?g	g?g2w-!?ffffff?g(\?g-?gv?r   r   rY   g      rS   g      g      rg   r&   r6   r7   )r   r   rK   ri   rj   r   r   r   r   r   r	   r+   rA   r<   ra   r`   r   r[   r   r:   )r-   r.   ZmseZmaeerr_msgpblrC   rZevsZd2psZevs2Zr2Zr22mslemsle2r/   r/   r0   !test_regression_multioutput_array[  s       &
          r   c                  C   s  ddgddgddgddgg} ddgddgdd	gdd
gg}t | |ddgd}t | |ddgdd}t| |ddgd}t| |ddgd}t| |ddgd}t| |ddgd}t| |dddgd}t| |ddgdd}	t|ddd t|ddd t|ddd t|ddd t|ddd t|ddd t|ddd t|	ddd tddgddgddgg} tddgddgddgg}t	| |ddgd}
t t
d|  t
d| ddgd}t|
|dd d S )Nr   r%   ru   r4   rv   r8   rn   rw   r9   rx   r    r#   rR   FrH   r   rT   rZ   g(\?rO   gzG?gffffff?g|гY?gGz?gPn?r6   r7   g333333?gffffff?)r   r   r   r   r   r   r   r+   r[   r   r:   )r-   r.   ZmsewZrmsewZmaewZmapewrwZevswZd2pswZevsw2r~   r   r/   r/   r0   test_regression_custom_weights  s@         r   metricc              	   C   sF   dg}dg}d}t jt|d | ||}t|s8tW 5 Q R X d S )Nr   r   z,not well-defined with less than two samples.re   )rK   Zwarnsr   r+   r_   r<   )r   r-   r.   Zwarning_msgrc   r/   r/   r0   test_regression_single_sample  s    
r   c                  C   s   d} t jd| d }t jd| d }tt||ddt||dd tt||ddt||dddd	 tt||d
dt||dddd	 tt||ddt||dddd	 d S )Nr2   r   皙?r   g|۽r(   g8   ?gư>rh   g ?r%   go    @)r+   randomRandomStateZrandr   r   )rB   r-   r.   r/   r/   r0    test_tweedie_deviance_continuity  s,    	r   c                  C   s<   t jd} | jdd}d| }t||tdks8td S )N*   r2   sizeg333333?r*   )r+   r   r   exponentialr   rK   rL   r<   )Zrandom_number_generatorr-   r.   r/   r/   r0   #test_mean_absolute_percentage_error  s    r   distributionnormalZ	lognormalr   uniformtarget_quantile皙?r         ?c                    s\  t tdstd dtjd}t|| d t }tj|d}t	 |d}t t
dd	d
}|D ]}tj|d}t	 |d}	|	|t|jj kst|  |k    d	    |k |    }
|
 }
t|
|	 qv fdd}tj|  dd}|js(t|jtj|ddksBt|jt|ksXtd S )NquantilezOThis test requires a more recent version of numpy with support for np.quantile.i  r   r   Z
fill_valuer!   r   r   r2   c                    s   t j| d}t |dS )Nr   r!   )r+   fullr   )xconstant_preddatarB   r   r/   r0   objective_funcD  s    zFtest_mean_pinball_loss_on_constant_predictions.<locals>.objective_funczNelder-Mead)methodg{Gz?)rel)hasattrr+   rK   skipr   r   getattrr   r   r   ZlinspaceZfinfoZdtypeZepsr<   r?   r   r   ZminimizerA   successr   rL   Zfun)r   r   rngZ	best_predZbest_constant_predZbest_pblZcandidate_predictionspredr   r|   Zexpected_pblr   resultr/   r   r0   .test_mean_pinball_loss_on_constant_predictions  s6    
r   c            	      C   s   d} t jd}|j| dfd}|j| d}ddddd	d
dg}|D ]R}tt|dd}tddd}t|t	|d|d
||}|jd t|ksBtqBd S )Ni  r   rn   r   r   r   ry   r   r   g?rz   F)r"   Zgreater_is_betterr   )Zstrategyr   )r   )Z
param_gridZscoring)r+   r   r   r   r   r   r   r
   r   dictZfitZbest_params_rK   rL   r<   )	rB   r   XyZall_quantilesr"   Zneg_mean_pinball_lossZ	regressorZgrid_searchr/   r/   r0   $test_dummy_quantile_parameter_tuningO  s*     r   c                  C   sR   t jd} d}| j|d}| | | }t||t||ddd ksNtd S )Ni  r2   r   r   r!   r%   )	r+   r   r   r   copyr   r   r   r<   )r   rD   r-   r.   r/   r/   r0   #test_pinball_loss_relation_with_maej  s    r   )r   )7Znumpyr+   Zscipyr   Znumpy.testingr   Zscipy.specialr   r   	itertoolsr   rK   Zsklearn.utils._testingr   r   r	   Zsklearn.dummyr
   Zsklearn.model_selectionr   Zsklearn.metricsr   r   r   r   r   r   r   r   r   r   r   r   r   r   Zsklearn.metrics._regressionr   Zsklearn.exceptionsr   rE   rM   rd   rm   rr   rt   r   r   markZparametrizer   r   r   r   r   r   r/   r/   r/   r0   <module>   s\   
ZT^g"
" 
2