U
    3do(                     @   s  d Z ddlZddlmZ 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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'm(Z( ddl)m*Z*m+Z+ G dd dZ,e,ddd e,ddd dgde,ddd dgde,d ed!d"gde,d#ed!d"gde,d$e!d!d"dd%d&d'gde,d(d)d d!d"d%gdgZ-d*d+ Z.d,d- Z/d.d/d$d0d1d2d3d4d d#d5d(d6gZ0d7d8 e/ D Z1d9d: Z2ej3j4d;e1e2d<d=d> Z5dS )?zCommon tests for metaestimators    N)	signature)BaseEstimator)is_regressor)make_classification)all_estimators)_enforce_estimator_tags_X)_enforce_estimator_tags_ycheck_is_fitted)set_random_state)Pipelinemake_pipeline)GridSearchCVRandomizedSearchCV)TfidfVectorizer)RFERFECV)BaggingClassifier)NotFittedErrorSelfTrainingClassifier)RidgeLogisticRegression)StandardScalerMaxAbsScalerc                   @   s    e Zd ZdeddfddZdS )DelegatorData r   )Zrandom_statec                 C   s   || _ || _|| _|| _d S N)name	constructfit_argsskip_methods)selfr   r   r!   r    r   r   E/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/tests/test_metaestimators.py__init__   s    zDelegatorData.__init__N)__name__
__module____qualname__r   r$   r   r   r   r#   r      s   r   r   c                 C   s   t d| fgS )Nest)r   r(   r   r   r#   <lambda>*       r*   r   c                 C   s   t | ddgiddS )Nparam      )
param_gridcv)r   r)   r   r   r#   r*   -   r+   score)r!   r   c                 C   s   t | ddgidddS )Nr,   r-   r.      )param_distributionsr0   n_iter)r   r)   r   r   r#   r*   2   s
      r   	transforminverse_transformr   r   predict_probapredict_log_probapredictr   c                 C   s   t | S r   r   r)   r   r   r#   r*   G   r+   c                     s  dd  G  fdddt } dd | j D }|  tD ]|}|  }||}|D ]}||jkrfqVt||sttt||std|j	|f |dkrt
t" t|||jd	 |jd
  W 5 Q R X qVt
t t|||jd	  W 5 Q R X qV|j|j  |D ]R}||jkrq|dkrDt|||jd	 |jd
  nt|||jd	  q|D ]X}||jkrtq`| |d}||}t||rtt||r`td|j	|f q`q<d S )Nc                    s   t  fdd}|S )Nc                    s&   | j  jkrtd| j  t | S )Nz%r is hidden)hidden_methodr%   AttributeError	functoolspartial)objmethodr   r#   wrapperP   s    z=test_metaestimator_delegation.<locals>.hides.<locals>.wrapper)property)r@   rA   r   r?   r#   hidesO   s    z,test_metaestimator_delegation.<locals>.hidesc                       s|   e Zd ZdddZdddZdd Z d	d
 Z dd Z dd Z dd Z	 dd Z
 dd Z dd ZdS )z3test_metaestimator_delegation.<locals>.SubEstimatorr2   Nc                 S   s   || _ || _d S r   )r,   r:   )r"   r,   r:   r   r   r#   r$   Y   s    z<test_metaestimator_delegation.<locals>.SubEstimator.__init__c                 _   s   t |jd | _g | _dS )Nr2   T)npZarangeshapeZcoef_Zclasses_r"   Xyargskwargsr   r   r#   fit]   s    z7test_metaestimator_delegation.<locals>.SubEstimator.fitc                 S   s   t |  d S r   r	   )r"   r   r   r#   
_check_fitb   s    z>test_metaestimator_delegation.<locals>.SubEstimator._check_fitc                 _   s   |    |S r   rL   r"   rG   rI   rJ   r   r   r#   r6   e   s    zEtest_metaestimator_delegation.<locals>.SubEstimator.inverse_transformc                 _   s   |    |S r   rM   rN   r   r   r#   r5   j   s    z=test_metaestimator_delegation.<locals>.SubEstimator.transformc                 _   s   |    t|jd S Nr   rL   rD   ZonesrE   rN   r   r   r#   r9   o   s    z;test_metaestimator_delegation.<locals>.SubEstimator.predictc                 _   s   |    t|jd S rO   rP   rN   r   r   r#   r7   t   s    zAtest_metaestimator_delegation.<locals>.SubEstimator.predict_probac                 _   s   |    t|jd S rO   rP   rN   r   r   r#   r8   y   s    zEtest_metaestimator_delegation.<locals>.SubEstimator.predict_log_probac                 _   s   |    t|jd S rO   rP   rN   r   r   r#   decision_function~   s    zEtest_metaestimator_delegation.<locals>.SubEstimator.decision_functionc                 _   s   |    dS )N      ?rM   rF   r   r   r#   r1      s    z9test_metaestimator_delegation.<locals>.SubEstimator.score)r2   N)N)r%   r&   r'   r$   rK   rL   r6   r5   r9   r7   r8   rQ   r1   r   rC   r   r#   SubEstimatorX   s"   







rT   c                 S   s$   g | ]}| d s| ds|qS )_rK   )
startswith).0kr   r   r#   
<listcomp>   s   
 
z1test_metaestimator_delegation.<locals>.<listcomp>z1%s does not have method %r when its delegate doesr1   r   r2   )r:   z+%s has method %r when its delegate does not)r   __dict__keyssortDELEGATING_METAESTIMATORSr   r!   hasattrAssertionErrorr   pytestZraisesr   getattrr    rK   )rT   methodsZdelegator_dataZdelegateZ	delegatorr@   r   rS   r#   test_metaestimator_delegationM   sn    	0


   
 

 rc   c                  c   sv  t t D ]d\} }tt|j}d|ks:d|ks:d|krt|r^tt t }dddgi}ntt t	 }dddgi}d|ksd	|krd
|krd
dini }|||f|V  n
||V  q
d|krdtt t
 fdtt tddfg}||V  q
d|kr
t|r6dtt tddfdtt tddfg}n,dtt t	ddfdtt t	ddfg}||V  q
q
q
dS )zGenerate instances of meta-estimators fed with a pipeline

    Are considered meta-estimators all estimators accepting one of "estimator",
    "base_estimator" or "estimators".
    	estimatorZbase_estimatorZ	regressorZridge__alphag?rR   Zlogisticregression__Cr/   r3   r4   r.   transformer_listZtrans1Ztrans2F)Z	with_meanZ
estimatorsZest1)alphaZest2r2   )CN)sortedr   setr   
parametersr   r   r   r   r   r   r   )rU   Z	Estimatorsigrd   r/   Zextra_paramsre   r   r   r#   0_generate_meta_estimator_instances_with_pipeline   s>    
rl   ZAdaBoostClassifierZAdaBoostRegressorZBaggingRegressorZClassifierChainZIterativeImputerZOneVsOneClassifierZRANSACRegressorZRegressorChainZSequentialFeatureSelectorc                 C   s   g | ]}|j jtkr|qS r   )	__class__r%   )DATA_VALIDATION_META_ESTIMATORS_TO_IGNORE)rW   r(   r   r   r#   rY     s   rY   c                 C   s   | j jS r   )rm   r%   )rd   r   r   r#   _get_meta_estimator_id  s    ro   rd   )idsc                 C   s   t jd}t|  d}|jt jdddgtd|d}t| rL|j|d}n|j	d|d}t
| | }t| | }| || t| d	rtd S )
Nr      ZaaZbbcc)Zdtype)size   Zn_features_in_)rD   randomZRandomStater   choicearrayobjectr   normalrandintr   tolistr   rK   r^   r_   )rd   rngZ	n_samplesrG   rH   r   r   r#   -test_meta_estimators_delegate_data_validation  s    r}   )6__doc__r<   inspectr   ZnumpyrD   r`   Zsklearn.baser   r   Zsklearn.datasetsr   Zsklearn.utilsr   Zsklearn.utils.estimator_checksr   r   Zsklearn.utils.validationr
   Zsklearn.utils._testingr   Zsklearn.pipeliner   r   Zsklearn.model_selectionr   r   Zsklearn.feature_extraction.textr   Zsklearn.feature_selectionr   r   Zsklearn.ensembler   Zsklearn.exceptionsr   Zsklearn.semi_supervisedr   Zsklearn.linear_modelr   r   Zsklearn.preprocessingr   r   r   r]   rc   rl   rn   ZDATA_VALIDATION_META_ESTIMATORSro   markZparametrizer}   r   r   r   r#   <module>   s   $s<  