U
    2d                    @   s0  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m	Z	 d dl
mZ d dl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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*m+Z+m,Z,m-Z- ej./dZ0dZ1dd gd dgddggZ2e3e2Z4d ddgZ5ddd gZ6e Z7dd Z8dd Z9dd  Z:e&d!d" Z;d#d$ Z<ej.=d%e,e>e7j?d&d'd(e,e>e7j?d)d*d(e,e>e7j?d+d*d(e,e>e7j?d,d-d'd.d/e,e>e7j?d0d-d'd.d/e,e>e7j?d1d'd(gd2d3 Z@ej.=d4e,e-gd5d6 ZAej.=d7d)d+d,d0gd8d9 ZBd:d; ZCd<d= ZDd>d? ZEd@dA ZFdBdC ZGdDdE ZHdFdG ZIdHdI ZJdJdK ZKej.=dLdMdNgfdOdPdQgfdRdPdQgfdSdNgfdTdPdQgfgdUdV ZLdWdX ZMdYdZ ZNd[d\ ZOd]d^ ZPd_d` ZQej.=dadbdcdddbdcdedfgej.=dgdadhgdidj ZRdkdl ZSdmdn ZTdodp ZUdqdr ZVdsdt ZWdudv ZXdwdx ZYdydz ZZd{d| Z[d}d~ Z\ej.=dd.gej.=dddgdd Z]dd Z^ej.=de_ddej.=dd'd*gej.=dddddddgdd Z`ej.=d7e1dd Zaej.=d7ebece1ecd&g ej.=ddej.=ddej.=dd'd*gdd Zddd Zeej.=dd'd*gej.=d7d&d+d1d0gej.=dddgdd Zfdd Zgdd Zhej.=dddbdddddgej.=dddgdd Ziej.=dddddgdd Zjej.=dekdddej.=ddbdedgdd Zlej.=dddd Zmdd Znej.=ddej.=dddd Zodd ZpddÄ Zqej.=dekdddej.=ddbdedgddń ZrddǄ Zsej.j=de,d ddʍe-d ddddd̍gdd΄ dύej.=d7e1ddф Ztej.=d7ebece1ecd&g ddӄ Zuej.=dddddd֜ddddd֜ddddd֜gddل Zvddۄ Zwej.=dddgdd݄ Zxej.=dd'd*dgej.=dgddddfdhgdd Zyej.=d7e1dd Zzdd Z{dd Z|dS )    N)assert_allcloseassert_almost_equal)assert_array_almost_equalassert_array_equal)sparse)clone)	load_irismake_classification)log_loss)
get_scorer)StratifiedKFold)GridSearchCV)train_test_split)cross_val_score)LabelEncoderStandardScaler)compute_class_weight	_IS_32BIT)ignore_warnings)shuffle)SGDClassifier)scale)skip_if_no_parallel)ConvergenceWarning)_log_reg_scoring_path_logistic_regression_pathLogisticRegressionLogisticRegressionCVz6error::sklearn.exceptions.ConvergenceWarning:sklearn.*)lbfgs	liblinear	newton-cgnewton-choleskysagsaga      c                 C   s   t |}t|}|jd }| |||}t| j| |j|fksJtt|| | 	|}|j||fksptt
|jddt| t|jdd| dS )z;Check that the model is able to fit the classification datar   r%   ZaxisN)lennpuniqueshapefitpredictr   classes_AssertionErrorpredict_probar   sumonesargmax)clfXy	n_samplesclasses	n_classesZ	predictedprobabilities r;   L/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/linear_model/tests/test_logistic.pycheck_predictions0   s    



r=   c                   C   sx   t tddtt t tddtt t tdddtt t tdddtt t tdddtt t tdddtt d S )Nr   random_stated   )Cr?   F)fit_interceptr?   )r=   r   r5   Y1X_spr;   r;   r;   r<   test_predict_2_classesB   s    rE   c                  C   s   G dd d} |  }ddddg}d}t |||d}tdd	\}}||| |jd |d ksbt|j|t| ksxtd|_||||}||j	d kst|jdkstd S )
Nc                   @   s   e Zd Zdd ZdddZdS )z0test_logistic_cv_mock_scorer.<locals>.MockScorerc                 S   s   d| _ ddddg| _d S )Nr   皙?g?皙?      ?)callsscores)selfr;   r;   r<   __init__Q   s    z9test_logistic_cv_mock_scorer.<locals>.MockScorer.__init__Nc                 S   s(   | j | jt| j   }|  jd7  _|S )Nr%   )rJ   rI   r(   )rK   modelr5   r6   sample_weightscorer;   r;   r<   __call__U   s    z9test_logistic_cv_mock_scorer.<locals>.MockScorer.__call__)N)__name__
__module____qualname__rL   rP   r;   r;   r;   r<   
MockScorerP   s   rT   r%   r&         )Csscoringcvr   r>   )
r   r	   r,   C_r/   rI   r(   rO   r-   rJ   )rT   Zmock_scorerrW   rY   lrr5   r6   Zcustom_scorer;   r;   r<   test_logistic_cv_mock_scorerO   s    
r\   c               	   C   sT   t jj\} }t jt j }tddd}d}tjt|d |	t j| W 5 Q R X d S )Nr   r&   )solvern_jobsz\'n_jobs' > 1 does not have any effect when 'solver' is set to 'liblinear'. Got 'n_jobs' = 2.match)
irisdatar+   target_namestargetr   pytestwarnsUserWarningr,   )r7   
n_featuresrd   r[   warning_messager;   r;   r<   test_lr_liblinear_warningp   s    rj   c                   C   s(   t tddtt t tddtt d S )N
   )rA   )r=   r   r5   Y2rD   r;   r;   r;   r<   test_predict_3_classes   s    rm   r4   r   ovr)rA   r]   multi_classr   multinomialr    r"   {Gz?*   )rA   r]   tolro   r?   r#   r!   c              	   C   s   t jj\}}t jt j }| jdkrRt   tdt	 | 
t j| W 5 Q R X n| 
t j| tt|| j | t j}t||kdkst| t j}t|jddt| t j|jdd }t||kdkstdS )zTest logistic regression with the iris dataset.

    Test that both multinomial and OvR solvers handle multiclass data correctly and
    give good accuracy score (>0.95) for the training data.
    r   ignoreffffff?r%   r'   N)ra   rb   r+   rc   rd   r]   warningscatch_warningssimplefilterr   r,   r   r)   r*   r.   r-   meanr/   r0   r   r1   r2   r3   )r4   r7   rh   rd   predr:   r;   r;   r<   test_predict_iris   s    

r{   LRc              
   C   sl  t jt j }}dD ]B}d| d}| |dd}tjt|d ||| W 5 Q R X qdD ]@}d| }| |d	d
d}tjt|d ||| W 5 Q R X qZdD ]@}d| }| |dd
d}tjt|d ||| W 5 Q R X qdD ]@}d|}| |dd}tjt|d ||| W 5 Q R X q| tkrhd}| ddd}tjt|d ||| W 5 Q R X d S )Nr   r!   zSolver z( does not support a multinomial backend.rp   r]   ro   r_   )r   r    r!   r"   z1Solver %s supports only 'l2' or 'none' penalties,l1rn   )r]   penaltyro   )r   r    r!   r"   r#   z1Solver %s supports only dual=False, got dual=TrueT)r]   dualro   )r   z>Only 'saga' solver supports elasticnet penalty, got solver={}.
elasticnet)r]   r   z8penalty='none' is not supported for the liblinear solvernoner   )r   r]   )	ra   rb   rd   re   raises
ValueErrorr,   formatr   )r|   r5   r6   r]   msgr[   r;   r;   r<   test_check_solver_option   s8    
r   r]   c                 C   s   t jdktj}tddg| }t| dddd}|t j| |j	j
dt jj
d fks^t|jj
d	ksntt|t j| t| ddd
d}|t j| |jtj|t jdd }t||kdkstd S )Nr   Zsetosaz
not-setosarp   rr     )r]   ro   r?   max_iterr%   r%   F)r]   ro   r?   rB   r'   ?)ra   rd   astyper)   Zintparrayr   r,   rb   coef_r+   r/   
intercept_r   r-   r.   r3   Zpredict_log_probary   )r]   rd   r4   Zmlrrz   r;   r;   r<   test_multinomial_binary   s*          r   c                 C   s~   t | d\}}tddd| d}||| ||}||}t|t|t|   }tjd| |f }t|| d S )Nr>   rp   r#   MbP?)ro   r]   rs   r?   r%   )	r	   r   r,   decision_functionr0   r)   expZc_r   )Zglobal_random_seedr5   r6   r4   ZdecisionZprobaZexpected_proba_class_1Zexpected_probar;   r;   r<   %test_multinomial_binary_probabilities   s    

 r   c            
      C   s   t jj\} }t jt j }tt j}tdd||}||}|	  t
|jsVt||}t
|}||}|  ||}	t|| t|| t||	 d S Nr   r>   )ra   rb   r+   rc   rd   r   r   r,   r   Zsparsifyr   issparser   r/   Z
coo_matrixZdensifyr   )
r7   rh   rd   r5   r4   Zpred_d_dZpred_s_dZsp_dataZpred_s_sZpred_d_sr;   r;   r<   test_sparsify  s    







r   c               	   C   s   t jd} | d}t |jd }d|d< tdd}|d d }tt	 |
t| W 5 Q R X tt	 |
||| d W 5 Q R X d S )Nr   )   rk   r>   r$   )rU      )r)   randomRandomStateZrandom_sampler2   r+   r   re   r   r   r,   r5   r-   )rngZX_Zy_r4   Zy_wrongr;   r;   r<   test_inconsistent_input&  s    

r   c                  C   sF   t dd} | tt d| jd d < d| jd d < t| td d S r   )r   r,   r5   rC   r   r   r   r   r4   r;   r;   r<   test_write_parameters:  s
    
r   c               	   C   sJ   t jtt jd} t j| d< tdd}tt |	| t
 W 5 Q R X d S )Ndtyper   r%   r   r>   )r)   r   r5   float64nanr   re   r   r   r,   rC   )ZXnanZlogisticr;   r;   r<   test_nanC  s
    

r   c                  C   sd  t jd} t | ddddg | ddf}dgd dgd  }t ddd}t}dD ]~}|t|||d	d
|dddd	\}}}t|D ]L\}}	t	|	d	d
|dddd}
|

|| |
j }t||| dd| d qq\dD ]~}dg}|t|||d|dddd\}}}t	|d dddd|d}
|

|| t |
j |
jg}t||d dd| d qd S )Nr   r@   r&   r%   r$   rV   rk   r"   r#   Fh㈵>  rn   )rW   rB   rs   r]   r   ro   r?   )rA   rB   rs   r]   ro   r?   r   zwith solver = %s)decimalerr_msg)r   r    r!   r   r"   r#        @@ư>g     @)rW   rs   r]   intercept_scalingr?   ro   )rA   rs   r   r?   ro   r]   )r)   r   r   concatenaterandnlogspacer   r   	enumerater   r,   r   ravelr   r   )r   r5   r6   rW   fr]   coefs_irA   r[   Zlr_coefr;   r;   r<   test_consistency_pathN  s~    &	
   

   r   c               
   C   s   t jd} t | ddddg | ddf}dgd dgd  }dg}tt}t|||ddddd W 5 Q R X t	|dkst
|d jjd }d	|kst
d
|kst
d|kst
d|kst
d S )Nr   r@   r&   r%   r$   r           )rW   rs   r   r?   verboselbfgs failed to convergez!Increase the number of iterationszscale the dataz%linear_model.html#logistic-regression)r)   r   r   r   r   re   rf   r   r   r(   r/   messageargs)r   r5   r6   rW   recordZwarn_msgr;   r;   r<   .test_logistic_regression_path_convergence_fail  s(    &      r   c               	   C   s   t ddd\} }tdddddd}|| | tdddddd}|| | td	ddddd}|| | t|j|j d
}tjt|d t|j|j W 5 Q R X d S )N   r   r7   r?   Tr   r   rn   )r?   r   rs   r]   ro      z)Arrays are not almost equal to 6 decimalsr_   )r	   r   r,   r   r   re   r   r/   )r5   r6   Zlr1Zlr2Zlr3r   r;   r;   r<    test_liblinear_dual_random_state  s:    r   c            	      C   s*  d\} }t jd}|| |}t |d|| }|| 8 }||  }tdgddddd	}|	|| t
ddddd
}|	|| t|j|j t|jjd|f t|jddg t|jdkstt t|j }t|jddd|f t|jjd t t|j }t|jd d S )N)2   r   r   r         ?Fr   rn   rU   )rW   rB   r]   ro   rY   )rA   rB   r]   ro   r%   r$   r&   r   )r%   rU   r%   )r)   r   r   r   signdotry   Zstdr   r,   r   r   r   r   r+   r.   r(   r/   asarraylistcoefs_paths_valuesCs_scores_)	r7   rh   r   X_refr6   lr_cvr[   coefs_pathsrJ   r;   r;   r<   test_logistic_cv  s<           r   zscoring, multiclass_agg_listZaccuracy Z	precisionZ_macroZ	_weightedf1Zneg_log_lossZrecallc                 C   s   t ddddd\}}tdtdd }}tddd	}| }d
D ]
}||= qD||| ||  |D ]L}	t| |	 }
tt||||fdg|
d|d d |
||| ||  qhd S )Nr@   r   rU      )r7   r?   r9   n_informativeP   r   rp   )rA   ro   )rA   r^   
warm_start)rW   rX   r&   )	r	   r)   aranger   
get_paramsr,   r   r   r   )rX   Zmulticlass_agg_listr5   r6   traintestr[   paramskeyZ	averagingZscorerr;   r;   r<   "test_logistic_cv_multinomial_score  s@       
    r   c            
      C   s  d\} }}t | ||ddd\}}t dddg|}t|d }td	d
}td	dd}td	d
}td	dd}	||| ||| ||| |	|| t|j	|j	 t
|jdddgkstt|j	|	j	 t
|jdddgkstt
|	jdddgkstt
t||dddgks,tt
t|	|dddgksPttddddd	d||}	t
t|	|ddgkstd S )N)r   r   rU   rU   r   )r7   rh   r9   r   r?   barbazfoor%   rp   ro   )ro   rW   r&   )r   r   r   )class_weightro   )r	   r   r,   Zinverse_transformr)   r   r   r   r   r   sortedr.   r/   r*   r-   )
r7   rh   r9   r   r6   Zy_strr[   r   Zlr_strZ	lr_cv_strr;   r;   r<   2test_multinomial_logistic_regression_string_inputs  sB    



$$
  r   c                  C   s|   t dddd\} }d| | dk < t| }t }|| | t }||| t|j|j t|j|j |j|jksxt	d S )Nr   r   r   r7   rh   r?   r   r   )
r	   r   
csr_matrixr   r,   r   r   r   rZ   r/   )r5   r6   csrr4   Zclfsr;   r;   r<   test_logistic_cv_sparse8  s    
r   c               	   C   st  t jt j } }| j\}}d}t|}t|| |}t|dd}|| | t|dd}|	 }	d|	|	dk< || |	 t
|jd |jd  t
|jdd  |j t
|jd tjd d f |j |jjd|fkstt|jdddg tt|j }
|
jd|d|d fkst|jjdks,ttt|j }|jd|dfksVtd	D ]}|d
krndnd}t|d|d|d
krdnddd}|dkrt| } || | || |}|| |}||kst|jj|jjkstt|jdddg tt|j }
|
jd|d|d fks0t|jjdksBttt|j }|jd|dfksZtqZd S )Nr&   rn   )rY   ro   r%   r   rU   rk   )rk   r   r    r"   r#   r        rp   rr   r   rq   )r]   ro   r   r?   rs   rY   r   )ra   rb   rd   r+   r   r   splitr   r,   copyr   r   r   r   r)   Znewaxisr/   r   r.   r   r   r   r   r   rO   )r   rd   r7   rh   Zn_cvrY   Zprecomputed_foldsr4   clf1Ztarget_copyr   rJ   r]   r   	clf_multiZmulti_scoreZ	ovr_scorer;   r;   r<   test_ovr_multinomial_irisF  sX    
 

r   c                     sl   t dddd\ tdddd fd	d
tD } tj| ddD ]"\}}t| | j| | jdd qDdS )z)Test solvers converge to the same result.rk   r   r   )rh   r   r?   Frr   rn   )rB   r?   ro   c                    s(   i | ] }|t f d |i qS r]   )r   r,   .0r]   r5   r   r6   r;   r<   
<dictcomp>  s    z4test_logistic_regression_solvers.<locals>.<dictcomp>r&   rrU   r   Nr	   dictSOLVERS	itertoolscombinationsr   r   )
regressorssolver_1solver_2r;   r   r<    test_logistic_regression_solvers  s      r  c                     s   t dddddd\ d} td| dd	d
ddd fddtD }tj|ddD ]"\}}t|| j|| jdd qZdS )zATest solvers converge to the same result for multiclass problems.r   rk   rU   r   r7   rh   r   r9   r?   Hz>Frr   rn   )rB   rs   r?   ro   r   '  r   c              
      s2   i | ]*}|t f ||d d qS )r@   )r]   r   )r   getr,   r   r5   r   Zsolver_max_iterr6   r;   r<   r     s     
 z?test_logistic_regression_solvers_multiclass.<locals>.<dictcomp>r&   r   rV   r   Nr   )rs   r   r   r  r;   r  r<   +test_logistic_regression_solvers_multiclass  s&        

  r  weightrF   g?r   rH   )r   r%   r&   r   balancedc           	   	   C   s   t | }|dkr| }tddddd|dd\}}tddd|d	}tf d
di|}||| tttdg D ]L}tf d
|i|}|dkr|jdddd ||| t|j	|j	dd qndS )z+Test class_weight for LogisticRegressionCV.r	  r   rU   r   )r7   rh   
n_repeatedr   n_redundantr9   r?   r%   Frn   )rW   rB   ro   r   r]   r   r   r   r  )rs   r   r?   r   rtolN)
r(   r	   r   r   r,   setr   
set_paramsr   r   )	r	  r   r9   r5   r6   r   Z	clf_lbfgsr]   r4   r;   r;   r<   (test_logistic_regressioncv_class_weights  s4    
	r  c                  C   s`  t dddddd\} }|d }ttfD ]z}dd	d
d}|tkrP|ddd dD ]b}|f d|i|}|f d|i|}|| | |j| |t|jd d t|j	|j	dd qT|f |}|j| ||d t
tt
d D ]X}|f ||dkrdndd|}	t  |	j| ||d W 5 Q R X t|j	|	j	dd qdD ]`}|f |dddd|}
|
| | |f d|i|}|j| ||d t|
j	|j	dd q@q&tdd	ddddddd
d}|| | tdd	dddd
d}	|	| || t|j	|	j	dd tdd	ddddd dd
d!}|| | tdd	dd dd
d"}	|	| || t|j	|	j	dd d S )#Nr   r   rU   r&   r   r  r%   rr   Frn   )r?   rB   ro   )rW   rY   )r   r   r]   rN   -C6?r  )r   r#   r"   绽|=r   r]   rs   r   )r]   r   r   r   )r]   rB   r   r   rs   r?   ro   )r]   rB   r   rs   r?   ro   rV   r   l2T)r]   rB   r   r   r   r?   ro   )r]   rB   r   r   r?   ro   )r	   r   r   updater,   r)   r2   r+   r   r   r  r   r   r   )r5   r6   rN   r|   kwr]   Zclf_sw_noneZclf_sw_onesZclf_sw_lbfgsZclf_swZ	clf_cw_12Z	clf_sw_12Zclf_cwr;   r;   r<   'test_logistic_regression_sample_weights  s        

 		r  c                 C   s*   t | }td|| d}tt||}|S )Nr
  )r8   r6   )r)   r*   r   r   zip)r6   r8   r   class_weight_dictr;   r;   r<    _compute_class_weight_dictionary,  s    
r  c                  C   s  t tj} | dd d d f }tjdd  }d}t|}|D ]J}t|ddd}t|d|d}||| ||| t|j|jdd q<| ddd d f }tjdd }t|}t	t
t	d	 D ]J}t|d
dd}t|d
|d}||| ||| t|j|jdd qd S )N-   )r   r    rp   r
  )r]   ro   r   rV   r   r@   r   rn   r   )r   ra   rb   rd   r  r   r,   r   r   r  r   )ZX_irisr5   r6   Zsolversr  r]   r   Zclf2r;   r;   r<   &test_logistic_regression_class_weights4  sH    
        r  c               	   C   s  d\} }}t | |d|dd\}}tdd|}d}t|dd	}t|ddd
}||| ||| |jj||fkszt|jj||fkstdD ]}t|ddddd}t|dddddd}	||| |	|| |jj||fkst|	jj||fkstt|j|jdd t|j|	jdd t|j	|j	dd qdD ]J}t
|ddddgd}
|
|| t|
j|jdd t|
j	|j	dd q8d S )N)r   r   rU   rk   r   r  F)Z	with_meanr   rp   r~   )r]   ro   rB   )r"   r#   r    rr   r   r  )r]   ro   r?   r   rs   )r]   ro   r?   r   rs   rB   rq   r  r   r   r   )r]   r   rs   ro   rW   g{Gz?)r	   r   Zfit_transformr   r,   r   r+   r/   r   r   r   )r7   rh   r9   r5   r6   r]   Zref_iZref_wZclf_iZclf_wZclf_pathr;   r;   r<   $test_logistic_regression_multinomialY  sl    

      r  c                  C   sP   t dddd\} }tdddd}|| | td} t|| td d S )	Nr   r   r   Fr   rn   )rB   r]   ro   )r   r   )r	   r   r,   r)   zerosr   r-   r5   r6   r4   r;   r;   r<   %test_liblinear_decision_function_zero  s
    
r"  c                  C   s4   t dddd\} }tddd}|t| | d S )Nrk   r   r   r   r   rn   r~   r	   r   r,   r   r   r!  r;   r;   r<   test_liblinear_logregcv_sparse  s    r$  c                  C   s4   t dddd\} }tddd}|t| | d S )Nrk   r   r   r   r#   rq   r  r#  r!  r;   r;   r<   test_saga_sparse  s    r%  c                  C   s(   t dd} | tt | jdks$td S )NF)rB   r   )r   r,   r5   rC   r   r/   r   r;   r;   r<   "test_logreg_intercept_scaling_zero  s    
r&  c               	   C   s   t jd} d}t|ddd\}}| j|dfd}t j|dfd	}t j|||fd
d}tddddddd}||| tdddddddd}||| t	|j
|j
 t	|j
ddd f t d t	|j
ddd f t d d S )Nrr   r   r   r   r   rU   sizer&   r+   r%   r'   r   r   r   Frn   r  r   rA   r]   rB   ro   rs   r#   r   r   rA   r]   rB   ro   r   rs   r   )r)   r   r   r	   normalr2   r   r   r,   r   r   r   )r   r7   r5   r6   X_noise
X_constantlr_liblinearlr_sagar;   r;   r<   test_logreg_l1  s8    	r2  c            	   	   C   s2  t jd} d}t|ddd\}}| jd|dfd}t j|d	fd
}t j|||fdd}d||dk < t|}t	ddddddd}|
|| t	dddddddd}|
|| t|j|j t|jddd f t d t|jddd f t d t	dddddddd}|
| | t|j|j d S )Nrr   r   r   r   r   rF   rU   )r   r(  r&   r)  r%   r'   r   r   r   Frn   r  r*  r#   r   r+  r,  r   )r)   r   r   r	   r-  r   r   r   r   r   r,   r   r   Ztoarray)	r   r7   r5   r6   r.  r/  r0  r1  Zlr_saga_denser;   r;   r<   test_logreg_l1_sparse_data  sR    
		r3  random_seedr   r   r  c                 C   sv   t dd| d\}}td|| ddd}tf dgd	d
|}||| tf ddi|}||| t|j|j d S )Nr@   r   r   r#   r   -q=)r]   r   r?   r   rs   r   T)rW   refitrA   )r	   r   r   r,   r   r   r   )r4  r   r5   r6   Zcommon_paramsr   r[   r;   r;   r<   !test_logistic_regression_cv_refit  s    r7  c                  C   s   t dddddd\} }tddd}|| | t||| }td	dd}|| | t||| }||ksrtt||| }t||| }||kstd S )
Nrk   r   r   rU   )r7   rh   r?   r9   r   rp   r   ro   r]   rn   )r	   r   r,   r
   r0   r/   Z_predict_proba_lr)r5   r6   r   Zclf_multi_lossZclf_ovrZclf_ovr_lossZclf_wrong_lossr;   r;   r<   %test_logreg_predict_proba_multinomial4  s"        
r9  r   r   ro   zsolver, message)r    z@newton-cg failed to converge. Increase the number of iterations.)r   z@Liblinear failed to converge, increase the number of iterations.)r"   ?The max_iter was reached which means the coef_ did not converge)r#   r:  )r   r   )r!   z6Newton solver did not converge after [0-9]* iterationsc              	   C   s   t jt j  }}d||dk< |dkr8|dkr8td |dkrR| dkrRtd t| d	|d|d
}tjt|d |	|| W 5 Q R X |j
d | kstd S )Nr   r&   r}   rp   z?'multinomial' is not supported by liblinear and newton-choleskyr!   r%   z/solver newton-cholesky might converge very fastV瞯<)r   rs   ro   r?   r]   r_   )ra   rb   rd   r   re   skipr   rf   r   r,   n_iter_r/   )r   ro   r]   r   r5   y_binr[   r;   r;   r<   test_max_iterJ  s     

r?  c           	      C   sl  t jt j }}| dkrt|}t|jd }|dks:t| }d||dk< d}d}t	dd| dd	}|
|| |jjd
ksttd| ||dd}|
|| |jjd||fkst|jdd
|| |jj|fkst|jdd
|| |jj|||fkst| dkrd S |jdd
|| |jjd
ks<t|jdd
|| |jjd||fkshtd S )Nr   r   rU   r&   rV   rq   r   rr   )rs   rA   r]   r?   r   )rs   r]   rW   rY   r?   r%   rn   r   r}   rp   )ra   rb   rd   r   r)   r*   r+   r/   r   r   r,   r=  r   r  )	r]   r5   r6   r9   r>  Zn_CsZ	n_cv_foldr4   Zclf_cvr;   r;   r<   test_n_itert  s>        
r@  r   )TFrB   c           
   	   C   s   t jt j }}| dkr"|dkr"d S td||| d|d}ttd* ||| |j}d|_||| W 5 Q R X t	
t	||j }d| |t|t|f }	|rd	|kst|	n|d	kst|	d S )
Nr!   rp   r  rr   )rs   ro   r   r]   r?   rB   )categoryr%   zUWarm starting issue with %s solver in %s mode with fit_intercept=%s and warm_start=%s       @)ra   rb   rd   r   r   r   r,   r   r   r)   r1   absstrr/   )
r]   r   rB   ro   r5   r6   r4   Zcoef_1Zcum_diffr   r;   r;   r<   test_warm_start  s0    rE  c                  C   s  t  } | j| j }}t|gd }t|gd }||dk }||dk d d }tdddd\}}t|}||f||ffD ]\}}dD ]}|jd }t	d	ddD ]l}	t
d
||	  dddd|ddd}
t
d
||	  dddd|ddd}|
|| ||| t|
j|jd qqqd S )NrU   r%   r&   r   r   r   r   )r   r  r$   r   r#   rn      Fr   )rA   r]   ro   r   rB   r   r?   rs   r   )r   rb   rd   r)   r   r	   r   r   r+   r   r   r,   r   r   )ra   r5   r6   ZX_binr>  ZX_sparseZy_sparser   r7   alphar#   r   r;   r;   r<   test_saga_vs_liblinear  sN      




rH  FTc                 C   s  | dkr"|dkr"t d|  d | dkr0tjntj}tttj}tttj}tttj}tttj}t	j
ttjd}t	j
ttjd}	d}
t| |d|
|d	}t|}||| |jj|kstt|}||| |jj|kstt|}||| |jjtjks$tt|}||	| |jjtjksLtd
|
 }tjdkrjtrjd}t|j|jtj|d | dkr|rd}t|j|j|d t|j|j|d d S )Nr}   rp   zSolver=z' does not support multinomial logistic.r   r   gMb@?rr   )r]   ro   r?   rs   rB   gQ@ntrq   atolr#   rF   )re   r<  r)   r   Zfloat32r   r5   r   rC   r   r   r   r   r,   r   r   r/   osnamer   r   )r]   ro   rB   Z
out32_typeZX_32Zy_32ZX_64Zy_64ZX_sparse_32ZX_sparse_64Z
solver_tolZlr_templZlr_32Zlr_32_sparseZlr_64Zlr_64_sparserK  r;   r;   r<   test_dtype_match  sJ    		rN  c                  C   s   t jd} t | ddddg | ddf}t dgd dgd  }tddddd	}tddd
dd	}t||||	|}t
dD ]}||| qt||	|}t||dd d S )Nr   r@   r&   r%   r$   rp   r"   F)ro   r]   r   r?   Tr   r   r  )r)   r   r   r   r   r   r   r
   r,   r0   ranger   )r   r5   r6   Zlr_no_wsZlr_wsZlr_no_ws_lossr   Z
lr_ws_lossr;   r;   r<   test_warm_start_converge_LRJ  s(    &      rP  c            
   
   C   s   t dd\} }d}d}t }dD ]2}t||dd|ddd	}|| | ||j q |\}}}	tj||dd
drtttj||	dd
drttj|	|dd
drtd S )Nr   r>   rB  rH   )r   r   r  r#   r   rF  )r   rA   r]   r?   l1_ratiors   r   rF   )r  rK  )	r	   r   r   r,   appendr   r)   allcloser/   )
r5   r6   rA   rQ  Zcoeffsr   r[   Zelastic_net_coeffsZ	l1_coeffsZ	l2_coeffsr;   r;   r<   test_elastic_net_coeffs_  s(    	
rT  rA   r   rk   r@   r   g    .Azpenalty, l1_ratio)r   r%   )r  r   c                 C   s^   t dd\}}td| |dddd}t|| dddd}||| ||| t|j|j d S )Nr   r>   r   r#   rq   )r   rA   rQ  r]   r?   rs   r   rA   r]   r?   rs   )r	   r   r,   r   r   )rA   r   rQ  r5   r6   lr_enetZlr_expectedr;   r;   r<   "test_elastic_net_l1_l2_equivalence{  s&        rW  c                 C   s   t ddd\}}t||dd\}}}}dtdddi}td| ddd	d
}t||dd}	td| ddd	d
}
td| ddd	d
}|	|
|fD ]}||| q|	|||
||kst|	|||||kstd S )Nr   r   r>   rQ  r%   r   r   r#   rq   rU  T)r6  r   r  )	r	   r   r)   linspacer   r   r,   rO   r/   )rA   r5   r6   X_trainX_testy_trainy_test
param_gridZenet_clfgsZl1_clfZl2_clfr4   r;   r;   r<   test_elastic_net_vs_l1_l2  s:                r_  rV   rQ  r   c              	      s   t dddddddd\ttddd d	d
}tddd d	d}| |  fdd}||||k std S )Nr   r&   r   rk   r   r7   r9   rh   r   r  r  r?   r   r#   F)r   r]   r?   rA   rQ  rB   r  )r   r]   r?   rA   rB   c                    sV   | j  } t|  }|tt| 7 }|d d t|| 7 }|S )Nr   rH   )r   r   r
   r0   r)   r1   rC  r   )r[   ZcoefobjrA   r5   rQ  r6   r;   r<   enet_objective  s
    
zEtest_LogisticRegression_elastic_net_objective.<locals>.enet_objective)r	   r   r   r,   r/   )rA   rQ  rV  Zlr_l2rd  r;   rc  r<   -test_LogisticRegression_elastic_net_objective  s:    
	    re  )rn   rp   c           
   
   C   s   | dkrt dd\}}nt ddddd\}}td}tddd}td	d
d}td|d||d| dd}||| ||d}tddd| dd}t|||d}	|	|| |	j	d |j
d kst|	j	d |jd kstd S )Nrn   r   r>   r@   rU   r7   r9   r   r?   r   r%   rV   r   r#   rq   r   rW   r]   rY   	l1_ratiosr?   ro   rs   rA   rQ  r   r]   r?   ro   rs   rY   rQ  rA   )r	   r   r)   rX  r   r   r,   r   r   Zbest_params_	l1_ratio_r/   rZ   )
ro   r5   r6   rY   ri  rW   lrcvr]  r[   r^  r;   r;   r<   2test_LogisticRegressionCV_GridSearchCV_elastic_net  sD       


ro  c               
   C   s   t ddddd\} }t| |dd\}}}}td}tddd}tdd	d}td
|d||dddd}	|	|| ||d}
td
ddddd}t	||
|d}||| |	
||
|k dkst|	
||
|k dkstd S )Nr@   rU   r   rf  r>   r   r%   rg  rV   r   r#   rn   rq   rh  rj  rk  rl  rG   )r	   r   r   r)   rX  r   r   r,   r   r   r-   ry   r/   )r5   r6   rY  rZ  r[  r\  rY   ri  rW   rn  r]  r[   r^  r;   r;   r<   6test_LogisticRegressionCV_GridSearchCV_elastic_net_ovr	  sB       


 rp  )r  r   )rn   rp   autoc           	   
   C   s   d}d}t d|||dd\}}tddd}| dkrDtdd	d
}nd }t| |d|d|ddd}||| |jj|fks~t|j	j|fkst|j
j||fkstd S )NrU   r   rF  r   r7   r9   r   rh   r?   rg  rV   r   r%   r&   r#   rq   F)r   rW   r]   ri  r?   ro   rs   r6  )r	   r)   r   rX  r   r,   rZ   r+   r/   rm  r   )	r   ro   r9   rh   r5   r6   rW   ri  rn  r;   r;   r<   "test_LogisticRegressionCV_no_refit6  s6    

rs  c            
   
   C   s   d} d}t d| | |dd\}}tddd}tddd	}d	}td
|d||dddd}||| tt|j	 }|j
| ||j|j|d fksttt|j	 }	|	j
| ||j|jfkst|jj
| ||j|jfkstd S )NrU   r   rF  r   rr  rg  rV   r%   r&   r   r#   rn   rq   )r   rW   r]   rY   ri  ro   r?   rs   )r	   r)   r   rX  r   r,   r   r   r   r   r+   r(  r/   r   r=  )
r9   rh   r5   r6   rW   ri  Zn_foldsrn  r   rJ   r;   r;   r<   5test_LogisticRegressionCV_elasticnet_attribute_shapes[  sD    


rt  c               	   C   s8   d} t jt| d tddddtt W 5 Q R X d S )NzQl1_ratio parameter is only used when penalty is 'elasticnet'\. Got \(penalty=l1\)r_   r   r#   rH   )r   r]   rQ  )re   rf   rg   r   r,   r5   rC   )r   r;   r;   r<   test_l1_ratio_non_elasticnet  s    ru  c              
   C   s   d}t |ddddddd\}}t|}tdddd d	|d
|  | dd}tddddd|| dd}||| ||| t|j|jdd d S )Nr   r&   r   r   r%   ra  r   Fr   r   r
   )r   r?   rB   rs   r   rQ  rG  Zlossr   r   r#   )r   r?   rB   rs   r   rQ  rA   r]   r   )r	   r   r   r   r,   r   r   )rA   rQ  r7   r5   r6   Zsgdlogr;   r;   r<   test_elastic_net_versus_sgd  sD    
	

rw  c               	   C   s   t dddddddd\} }dddg}t| |d	|d
ddd\}}}tt t|d |d dd W 5 Q R X tt t|d |d dd W 5 Q R X tt t|d |d dd W 5 Q R X d S )NrF  rU   r&   r   r%   )r7   r9   r   r  Zn_clusters_per_classr?   rh   r   r  r   r#   rp   )r   rW   r]   r?   ro   r   )r	   r   re   r   r/   r   )r5   r6   rW   r   r   r;   r;   r<   /test_logistic_regression_path_coefs_multinomial  s2    
	

  rx  estr   )r?   r   rU   )r?   rY   rW   rs   r   c                 C   s   | j jS N)	__class__rQ   )xr;   r;   r<   <lambda>      r}  )idsc              	      sX   fdd}t tj}|d d d }|dd d }tjd d d }|dk}|||d|d}|||d|d}	t|j|	j t|||	| |||d|d}
|d	kr|||d|d}t|
j|j t|
||| nx|||d
|d}t|
j|j t|
||| t|j|||d
|djr2t	t|j|||d
|djrTt	d S )Nc                    s   t  jf || |S rz  )r   r  r,   )r5   r6   r  ry  r;   r<   r,     s    z6test_logistic_regression_multi_class_auto.<locals>.fitrk   r%   r   rq  r8  rn   r}   rp   )
r   ra   rb   rd   r   r   r0   r)   rS  r/   )ry  r]   r,   Zscaled_datar5   X2Zy_multir>  Zest_auto_binZest_ovr_binZest_auto_multiZest_ovr_multiZest_multi_multir;   r  r<   )test_logistic_regression_multi_class_auto  s@    
  
r  c           	   	   C   s   t ddd\}}d}td | dd}tjt|d ||| W 5 Q R X td | dd}td	tj| dd
}||||}||||}t	|| d S )Nr   r   r   z&Setting penalty=None will ignore the CrV   )r   r]   rA   r_   )r   r]   r?   r  )r   rA   r]   r?   )
r	   r   re   rf   rg   r,   r)   infr-   r   )	r]   r5   r6   r   r[   Zlr_noneZlr_l2_C_infZ	pred_noneZpred_l2_C_infr;   r;   r<   test_penalty_none  s       r  r   r   )r   r   rs   r   r5  c                 C   st  t jddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddggt dd}t jddddddddddddddddgt dd}t ||g}t |d| g}t jt|d d}d	|t|d < t|||d	d
\}}}tddd}|j	f |  t
|||}t
|j|||d}dD ],}	t||	|}
t||	|}t|
| qBd S )Nr%   rU   r&   rV   floatr   intr)  r   r>   r   rr   )r]   r?   r  )r-   r0   r   )r)   r   r   ZvstackZhstackr2   r(   r   r   r  r   r,   getattrr   )r   r5   r6   r  y2rN   Zbase_clfZclf_no_weightZclf_with_weightmethodZX_clf_no_weightZX_clf_with_weightr;   r;   r<   /test_logisticregression_liblinear_sample_weight"  sJ    " r  c                  C   s   t ddd\} }tdd}ddg}ddd	g}td
d|||dddd}|| | |jd jdd}t|D ]^\}}t|D ]L\}	}
td
d||
dddd}t|| ||d }|||	f t	
|ksztqzqjd S )Nr   r   r   r   )Zn_splitsrF   r   r%   rk   r   r#      r   )r   r]   ri  rW   rY   r?   r   rs   r'   )r   r]   rA   rQ  r?   r   rs   rl  )r	   r   r   r,   r   ry   r   r   r   re   approxr/   )r5   r6   rY   ri  rW   rn  Zavg_scores_lrcvr   rA   jrQ  r[   Zavg_score_lrr;   r;   r<   'test_scores_attribute_layout_elasticnetW  s:    



r  c                 C   s   t jj\}}t jt j }ttt jdd| d}tt j}||| t	|j
jddddd | r||jjddtjddd	k d
S )a|  Test that the multinomial classification is identifiable.

    A multinomial with c classes can be modeled with
    probability_k = exp(X@coef_k) / sum(exp(X@coef_l), l=1..c) for k=1..c.
    This is not identifiable, unless one chooses a further constraint.
    According to [1], the maximum of the L2 penalized likelihood automatically
    satisfies the symmetric constraint:
    sum(coef_k, k=1..c) = 0

    Further details can be found in [2].

    Reference
    ---------
    .. [1] :doi:`Zhu, Ji and Trevor J. Hastie. "Classification of gene microarrays by
           penalized logistic regression". Biostatistics 5 3 (2004): 427-43.
           <10.1093/biostatistics/kxg046>`

    .. [2] :arxiv:`Noah Simon and Jerome Friedman and Trevor Hastie. (2013)
           "A Blockwise Descent Algorithm for Group-penalized Multiresponse and
           Multinomial Regression". <1311.6529>`
    r   rp   )rA   r]   ro   rB   r   r'   r  rJ  r;  )rC  N)ra   rb   r+   rc   rd   r   r(   r   r,   r   r   r1   r   re   r  )rB   r7   rh   rd   r4   ZX_scaledr;   r;   r<   (test_multinomial_identifiability_on_iris  s    
r  rq  r   g      $@c                 C   sf   t dd\}}t|}t|}d|d |d < | }td|d| d}|j|||d t|| d S )NT)Z
return_X_yr&   r   rF  )r?   r   r   ro   r  )r   r(   r)   r2   r   r   r,   r   )ro   r   r5   r6   rh   Wexpectedr4   r;   r;   r<   test_sample_weight_not_modified  s    
   r  c              	   C   s   t jdddd}dD ]}t||t||d qtjjd|jd d	}| d
krd}t	j
t|d t| d|| W 5 Q R X nt| d|| d S )Nr   rk   r   )r   )indicesZindptrZint64r&   r   r'  )r   r"   r#   z0Only sparse matrices with 32-bit integer indicesr_   r   )r   Zrandsetattrr  r   r)   r   randintr+   re   r   r   r   r,   )r]   r5   attrr6   r   r;   r;   r<   test_large_sparse_matrix  s    r  c               
   C   sb   t ddddddddggj} t d	d	d
d
d	d	d
d	g}| jd	 d	ksJttddd| | d S )NrH   g?g?g      ?rG   gHzG?ru   gffffff?r%   r   r    T)r]   rB   )r)   r   Tr+   r/   r   r,   )r5   r6   r;   r;   r<   test_single_feature_newton_cg  s    r  c               	   C   sF   t jt j } tdd}d}tjt|d |t j|  W 5 Q R X d S )Nr   )r   zv`penalty='none'`has been deprecated in 1.2 and will be removed in 1.4. To keep the past behaviour, set `penalty=None`.r_   )	ra   rc   rd   r   re   rf   FutureWarningr,   rb   )rd   r[   ri   r;   r;   r<   #test_warning_on_penalty_string_none  s    
r  )}r   rL  rv   Znumpyr)   Znumpy.testingr   r   r   r   Zscipyr   re   Zsklearn.baser   Zsklearn.datasetsr   r	   Zsklearn.metricsr
   r   Zsklearn.model_selectionr   r   r   r   Zsklearn.preprocessingr   r   Zsklearn.utilsr   r   Zsklearn.utils._testingr   r   Zsklearn.linear_modelr   r   r   Zsklearn.exceptionsr   Zsklearn.linear_model._logisticr   r   r   r   markfilterwarningsZ
pytestmarkr   r5   r   rD   rC   rl   ra   r=   rE   r\   rj   rm   Zparametrizer(   rb   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&  r2  r3  r7  r9  r   r?  r@  r   r  rE  rH  rN  rP  rT  rW  r_  r   re  ro  rp  rs  rt  ru  rw  rx  r  r  r  r  r  r  r  r  r  r;   r;   r;   r<   <module>   s  


!
        

*
	B$



)C W%?&5
1$/ 
H
)
--#+	( 
*

-,
*
