U
    ^»{j?D  ã                   @   sŒ  d 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
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mZ ddgddgddgddgddgddggZddddddgZddgddgddgddgddgddggZddddddgZddddddgZdd„ Ze
j  de!e	j"g¡dd„ ƒZ#dd„ Z$dd„ Z%dd„ Z&dd„ Z'dd„ Z(e
j  de!e	j"g¡d d!„ ƒZ)d"d#„ Z*d$d%„ Z+d&d'„ Z,dS )(zG
Testing for export functions of decision trees (sklearn.tree.export).
é    )ÚStringIO)ÚfinditerÚsearch)ÚdedentN)ÚRandomState)Úis_classifier)ÚGradientBoostingClassifier)ÚNotFittedError)ÚDecisionTreeClassifierÚDecisionTreeRegressorÚexport_graphvizÚexport_textÚ	plot_treeéþÿÿÿéÿÿÿÿé   é   é   g      à?c               
   C   sR  t ddddd�} |  tt¡ t| d d�}d}||ks8t‚t| dddddd d	d
�}d}||ks`t‚t| ddd d�}d}||ks€t‚t| ddd dd�}d}||ks¢t‚t ddddd�} | jtttd�} t| ddd d�}d}||ksât‚tddddd�} |  tt¡ t| ddd ddd	d�}d}||k�s&t‚t dd�} |  tt	¡ t| dd d�}d}d S )Nr   r   Úgini©Ú	max_depthÚmin_samples_splitÚ	criterionÚrandom_state©Úout_filea„  digraph Tree {
node [shape=box, fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="x[0] <= 0.0\ngini = 0.5\nsamples = 6\nvalue = [3, 3]"] ;
1 [label="gini = 0.0\nsamples = 3\nvalue = [3, 0]"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="gini = 0.0\nsamples = 3\nvalue = [0, 3]"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
}TFÚsans)ÚfilledÚimpurityÚ
proportionZspecial_charactersÚroundedr   Úfontnameaí  digraph Tree {
node [shape=box, style="filled, rounded", color="black", fontname="sans"] ;
edge [fontname="sans"] ;
0 [label=<x<SUB>0</SUB> &le; 0.0<br/>samples = 100.0%<br/>value = [0.5, 0.5]>, fillcolor="#ffffff"] ;
1 [label=<samples = 50.0%<br/>value = [1.0, 0.0]>, fillcolor="#e58139"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label=<samples = 50.0%<br/>value = [0.0, 1.0]>, fillcolor="#399de5"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
}r   )r   Úclass_namesr   zâdigraph Tree {
node [shape=box, fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="x[0] <= 0.0\ngini = 0.5\nsamples = 6\nvalue = [3, 3]\nclass = y[0]"] ;
1 [label="(...)"] ;
0 -> 1 ;
2 [label="(...)"] ;
0 -> 2 ;
})r   r   r   Znode_idsa;  digraph Tree {
node [shape=box, style="filled", color="black", fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="node #0\nx[0] <= 0.0\ngini = 0.5\nsamples = 6\nvalue = [3, 3]", fillcolor="#ffffff"] ;
1 [label="(...)", fillcolor="#C0C0C0"] ;
0 -> 1 ;
2 [label="(...)", fillcolor="#C0C0C0"] ;
0 -> 2 ;
})Zsample_weight)r   r   r   aÏ  digraph Tree {
node [shape=box, style="filled", color="black", fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="x[0] <= 0.0\nsamples = 6\nvalue = [[3.0, 1.5, 0.0]\n[3.0, 1.0, 0.5]]", fillcolor="#ffffff"] ;
1 [label="samples = 3\nvalue = [[3, 0, 0]\n[3, 0, 0]]", fillcolor="#e58139"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="x[0] <= 1.5\nsamples = 3\nvalue = [[0.0, 1.5, 0.0]\n[0.0, 1.0, 0.5]]", fillcolor="#f1bd97"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
3 [label="samples = 2\nvalue = [[0, 1, 0]\n[0, 1, 0]]", fillcolor="#e58139"] ;
2 -> 3 ;
4 [label="samples = 1\nvalue = [[0.0, 0.5, 0.0]\n[0.0, 0.0, 0.5]]", fillcolor="#e58139"] ;
2 -> 4 ;
}Zsquared_error)r   Zleaves_parallelr   Úrotater    r!   aT  digraph Tree {
node [shape=box, style="filled, rounded", color="black", fontname="sans"] ;
graph [ranksep=equally, splines=polyline] ;
edge [fontname="sans"] ;
rankdir=LR ;
0 [label="x[0] <= 0.0\nsquared_error = 1.0\nsamples = 6\nvalue = 0.0", fillcolor="#f2c09c"] ;
1 [label="squared_error = 0.0\nsamples = 3\nvalue = -1.0", fillcolor="#ffffff"] ;
0 -> 1 [labeldistance=2.5, labelangle=-45, headlabel="True"] ;
2 [label="squared_error = 0.0\nsamples = 3\nvalue = 1.0", fillcolor="#e58139"] ;
0 -> 2 [labeldistance=2.5, labelangle=45, headlabel="False"] ;
{rank=same ; 0} ;
{rank=same ; 1; 2} ;
}©r   )r   r   z¾digraph Tree {
node [shape=box, style="filled", color="black", fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="gini = 0.0\nsamples = 6\nvalue = 6.0", fillcolor="#ffffff"] ;
})
r
   ÚfitÚXÚyr   ÚAssertionErrorÚy2Úwr   Ú
y_degraded)ÚclfÚ	contents1Ú	contents2© r/   ú]/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sklearn/tree/tests/test_export.pyÚtest_graphviz_toy   s’       ÿÿøÿÿ    ÿÿ   ÿÿ   ÿù
ÿ
ÿr1   Úconstructorc                 C   sl   t ddddd�}| tt¡ t|| ddgƒd d�}d}||ksBt‚t|| d	d
gƒd d�}d}||ksht‚d S )Nr   r   r   r   Zfeature0Zfeature1)Úfeature_namesr   aˆ  digraph Tree {
node [shape=box, fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="feature0 <= 0.0\ngini = 0.5\nsamples = 6\nvalue = [3, 3]"] ;
1 [label="gini = 0.0\nsamples = 3\nvalue = [3, 0]"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="gini = 0.0\nsamples = 3\nvalue = [0, 3]"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
}ÚyesÚno)r"   r   aª  digraph Tree {
node [shape=box, fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="x[0] <= 0.0\ngini = 0.5\nsamples = 6\nvalue = [3, 3]\nclass = yes"] ;
1 [label="gini = 0.0\nsamples = 3\nvalue = [3, 0]\nclass = yes"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="gini = 0.0\nsamples = 3\nvalue = [0, 3]\nclass = no"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
})r
   r%   r&   r'   r   r(   )r2   r,   r-   r.   r/   r/   r0   Ú/test_graphviz_feature_class_names_array_supportØ   s.       ÿ 
 ÿÿ 
 ÿÿr6   c               	   C   sü   t ddd�} tƒ }t t¡� t| |ƒ W 5 Q R X |  tt¡ d}tjt	|d�� t| d dgd� W 5 Q R X d}tjt	|d�� t| d dd	d
gd� W 5 Q R X d}tjt
|d�� t|  tt¡jƒ W 5 Q R X tƒ }t t¡� t| |g d� W 5 Q R X d S )Nr   r   )r   r   z?Length of feature_names, 1 does not match number of features, 2©ÚmatchÚa©r3   z?Length of feature_names, 3 does not match number of features, 2ÚbÚczis not an estimator instance©r"   )r
   r   ÚpytestÚraisesr	   r   r%   r&   r'   Ú
ValueErrorÚ	TypeErrorZtree_Ú
IndexError)r,   ÚoutÚmessager/   r/   r0   Útest_graphviz_errors  s"    rE   c                  C   s†   t ddd�} |  tt¡ tƒ }t| |d� tddd�} |  tt¡ | jD ]}t|d |d� qHtd| 	¡ ƒD ]}d| 
¡ kslt‚qld S )NÚfriedman_mser   )r   r   r   r   )Zn_estimatorsr   z\[.*?samples.*?\])r   r%   r&   r'   r   r   r   Zestimators_r   ÚgetvalueÚgroupr(   )r,   Údot_dataZ	estimatorÚfindingr/   r/   r0   Útest_friedman_mse_in_graphviz.  s    
rK   c            	      C   s8  t dƒ} t dƒ}t|  d¡| d¡f|  d¡|jddd�ftdd	d
d�td
d	d�fƒD ]Ü\}}}| ||¡ dD ]À}t|d |dd�}td|ƒD ]&}t	t
d| ¡ ƒ ¡ ƒ|d
 ksŽt‚qŽt|ƒrÄd}nd}t||ƒD ]&}t	t
d| ¡ ƒ ¡ ƒ|d
 ksÒt‚qÒtd|ƒD ]*}t	t
d| ¡ ƒ ¡ ƒ|d
 k�st‚�qqpqVd S )Nr   é   )é   r   )éè  é   )rM   )rN   )ÚsizerF   r   r   )r   r   r   ©r   r   )rO   r   T)r   Ú	precisionr   zvalue = \d+\.\d+z\.\d+zgini = \d+\.\d+zfriedman_mse = \d+\.\d+z<= \d+\.\d+)r   ÚzipZrandom_sampleÚrandintr   r
   r%   r   r   Úlenr   rH   r(   r   )	Zrng_regZrng_clfr&   r'   r,   rR   rI   rJ   Úpatternr/   r/   r0   Útest_precision=  s<      ÿ
üý
   ÿ$$rW   c               	   C   st   t ddd�} |  tt¡ d}tjt|d�� t| dgd� W 5 Q R X d}tjt|d�� t| dgd	� W 5 Q R X d S )
Nr   r   rQ   z,feature_names must contain 2 elements, got 1r7   r9   r:   zŒWhen `class_names` is an array, it should contain as many items as `decision_tree.classes_`. Got 1 while the tree was fitted with 2 classes.r=   )r
   r%   r&   r'   r>   r?   r@   r   )r,   Úerr_msgr/   r/   r0   Útest_export_text_errorsg  s    ÿrY   c                  C   s2  t ddd�} |  tt¡ tdƒ ¡ }t| ƒ|ks4t‚t| dd�|ksHt‚t| dd�|ks\t‚tdƒ ¡ }t| dd	�|ks|t‚td
ƒ ¡ }t| dd�|ksœt‚ddgddgddgddgddgddgddgg}dddddddg}t ddd�} |  ||¡ tdƒ ¡ }t| dd�|k�st‚ddgddg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ddgddgg}tddd�}| ||¡ tdƒ ¡ }t|dd�|k�s t‚t|ddd�|k�s¸t‚dgdgdgdgdgdgg}tddd�}| ||¡ tdƒ ¡ }t|ddgd�|k�st‚t|dddgd�|k�s.t‚d S )Nr   r   rQ   zh
    |--- feature_1 <= 0.00
    |   |--- class: -1
    |--- feature_1 >  0.00
    |   |--- class: 1
    r$   é
   z”
    |--- feature_1 <= 0.00
    |   |--- weights: [3.00, 0.00] class: -1
    |--- feature_1 >  0.00
    |   |--- weights: [0.00, 3.00] class: 1
    T)Úshow_weightsz\
    |- feature_1 <= 0.00
    | |- class: -1
    |- feature_1 >  0.00
    | |- class: 1
    r   )Úspacingr   r   rO   z{
    |--- feature_1 <= 0.00
    |   |--- class: -1
    |--- feature_1 >  0.00
    |   |--- truncated branch of depth 2
    zy
    |--- feature_1 <= 0.0
    |   |--- value: [-1.0, -1.0]
    |--- feature_1 >  0.0
    |   |--- value: [1.0, 1.0]
    )Údecimals)r]   r[   zq
    |--- first <= 0.0
    |   |--- value: [-1.0, -1.0]
    |--- first >  0.0
    |   |--- value: [1.0, 1.0]
    Úfirst)r]   r3   )r]   r[   r3   )	r
   r%   r&   r'   r   Úlstripr   r(   r   )r,   Úexpected_reportZX_lZy_lZX_moZy_moÚregZX_singler/   r/   r0   Útest_export_textv  s@    .((ÿÿrb   c                 C   sl   t ddd�}| tt¡ tdƒ ¡ }t|| ddgƒd�|ks@t‚tdƒ ¡ }t|| d	d
gƒd�|ksht‚d S )Nr   r   rQ   zX
    |--- b <= 0.00
    |   |--- class: -1
    |--- b >  0.00
    |   |--- class: 1
    r9   r;   r:   zk
    |--- feature_1 <= 0.00
    |   |--- class: cat
    |--- feature_1 >  0.00
    |   |--- class: dog
    ÚcatÚdogr=   )r
   r%   r&   r'   r   r_   r   r(   )r2   r,   r`   r/   r/   r0   Ú2test_export_text_feature_class_names_array_supportÃ  s    re   c                 C   s€   t ddddd�}| tt¡ ddg}t||d�}t|ƒdks@t‚|d  ¡ d	ksTt‚|d
  ¡ dksht‚|d  ¡ dks|t‚d S )Nr   r   Zentropyr   ú
first featÚsepal_widthr:   r   z:first feat <= 0.0
entropy = 1.0
samples = 6
value = [3, 3]r   z(entropy = 0.0
samples = 3
value = [3, 0]z(entropy = 0.0
samples = 3
value = [0, 3]©r
   r%   r&   r'   r   rU   r(   Zget_text©Úpyplotr,   r3   Znodesr/   r/   r0   Útest_plot_tree_entropyÛ  s        ÿ
ÿÿrk   c                 C   s€   t ddddd�}| tt¡ ddg}t||d�}t|ƒdks@t‚|d  ¡ d	ksTt‚|d
  ¡ dksht‚|d  ¡ dks|t‚d S )Nr   r   r   r   rf   rg   r:   r   z7first feat <= 0.0
gini = 0.5
samples = 6
value = [3, 3]r   z%gini = 0.0
samples = 3
value = [3, 0]z%gini = 0.0
samples = 3
value = [0, 3]rh   ri   r/   r/   r0   Útest_plot_tree_giniï  s        ÿ
ÿÿrl   c              	   C   s(   t ƒ }t t¡� t|ƒ W 5 Q R X d S )N)r   r>   r?   r	   r   )rj   r,   r/   r/   r0   Útest_not_fitted_tree  s    rm   )-Ú__doc__Úior   Úrer   r   Útextwrapr   ÚnumpyÚnpr>   Znumpy.randomr   Zsklearn.baser   Zsklearn.ensembler   Zsklearn.exceptionsr	   Zsklearn.treer
   r   r   r   r   r&   r'   r)   r*   r+   r1   ÚmarkZparametrizeÚlistÚarrayr6   rE   rK   rW   rY   rb   re   rk   rl   rm   r/   r/   r/   r0   Ú<module>   s:   	(( :
5 *M
