
    PisV                         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
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 d
 Z G d d          ZdS )    N)is_regressor)LabelEncoder)_safe_indexing)is_pandas_dfis_polars_df)check_matplotlib_support)_get_response_values)_get_adapter_from_container)_is_arraylike_not_scalar_num_featurescheck_is_fittedc                     t          | d          }|r+t          | j        d                   rd}t          |          |dk    rt	          |           rd}ng d}n|}|S )aF  Validate the response methods to be used with the fitted estimator.

    Parameters
    ----------
    estimator : object
        Fitted estimator to check.

    response_method : {'auto', 'decision_function', 'predict_proba', 'predict'}
        Specifies whether to use :term:`decision_function`, :term:`predict_proba`,
        :term:`predict` as the target response. If set to 'auto', the response method is
        tried in the before mentioned order.

    class_of_interest : int, float, bool, str or None
        The class considered when plotting the decision. Cannot be None if
        multiclass and `response_method` is 'predict_proba' or 'decision_function'.

        .. versionadded:: 1.4

    Returns
    -------
    prediction_method : list of str or str
        The name or list of names of the response methods to use.
    classes_r   zFMulti-label and multi-output multi-class classifiers are not supportedautopredict)decision_functionpredict_probar   )hasattrr   r   
ValueErrorr   )	estimatorresponse_methodclass_of_interesthas_classesmsgprediction_methods         ~/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/sklearn/inspection/_plot/decision_boundary.py_check_boundary_response_methodr      s    0 )Z00K /	0B10EFF Voo&  	"" 	R ) Q Q Q+    c                   V    e Zd ZdZdddddZddZedddd	dddddd
	d            ZdS )DecisionBoundaryDisplaya  Decisions boundary visualization.

    It is recommended to use
    :func:`~sklearn.inspection.DecisionBoundaryDisplay.from_estimator`
    to create a :class:`DecisionBoundaryDisplay`. All parameters are stored as
    attributes.

    Read more in the :ref:`User Guide <visualizations>`.

    For a detailed example comparing the decision boundaries of multinomial and
    one-vs-rest logistic regression, please see
    :ref:`sphx_glr_auto_examples_linear_model_plot_logistic_multinomial.py`.

    .. versionadded:: 1.1

    Parameters
    ----------
    xx0 : ndarray of shape (grid_resolution, grid_resolution)
        First output of :func:`meshgrid <numpy.meshgrid>`.

    xx1 : ndarray of shape (grid_resolution, grid_resolution)
        Second output of :func:`meshgrid <numpy.meshgrid>`.

    response : ndarray of shape (grid_resolution, grid_resolution) or             (grid_resolution, grid_resolution, n_classes)
        Values of the response function.

    multiclass_colors : list of str or str, default=None
        Specifies how to color each class when plotting all classes of multiclass
        problem. Ignored for binary problems and multiclass problems when plotting a
        single prediction value per point.
        Possible inputs are:

        * list: list of Matplotlib
          `color <https://matplotlib.org/stable/users/explain/colors/colors.html#colors-def>`_
          strings, of length `n_classes`
        * str: name of :class:`matplotlib.colors.Colormap`
        * None: 'viridis' colormap is used to sample colors

        Single color colormaps will be generated from the colors in the list or
        colors taken from the colormap and passed to the `cmap` parameter of
        the `plot_method`.

        .. versionadded:: 1.7

    xlabel : str, default=None
        Default label to place on x axis.

    ylabel : str, default=None
        Default label to place on y axis.

    Attributes
    ----------
    surface_ : matplotlib `QuadContourSet` or `QuadMesh` or list of such objects
        If `plot_method` is 'contour' or 'contourf', `surface_` is
        :class:`QuadContourSet <matplotlib.contour.QuadContourSet>`. If
        `plot_method` is 'pcolormesh', `surface_` is
        :class:`QuadMesh <matplotlib.collections.QuadMesh>`.

    multiclass_colors_ : array of shape (n_classes, 4)
        Colors used to plot each class in multiclass problems.
        Only defined when `color_of_interest` is None.

        .. versionadded:: 1.7

    ax_ : matplotlib Axes
        Axes with decision boundary.

    figure_ : matplotlib Figure
        Figure containing the decision boundary.

    See Also
    --------
    DecisionBoundaryDisplay.from_estimator : Plot decision boundary given an estimator.

    Examples
    --------
    >>> import matplotlib.pyplot as plt
    >>> import numpy as np
    >>> from sklearn.datasets import load_iris
    >>> from sklearn.inspection import DecisionBoundaryDisplay
    >>> from sklearn.tree import DecisionTreeClassifier
    >>> iris = load_iris()
    >>> feature_1, feature_2 = np.meshgrid(
    ...     np.linspace(iris.data[:, 0].min(), iris.data[:, 0].max()),
    ...     np.linspace(iris.data[:, 1].min(), iris.data[:, 1].max())
    ... )
    >>> grid = np.vstack([feature_1.ravel(), feature_2.ravel()]).T
    >>> tree = DecisionTreeClassifier().fit(iris.data[:, :2], iris.target)
    >>> y_pred = np.reshape(tree.predict(grid), feature_1.shape)
    >>> display = DecisionBoundaryDisplay(
    ...     xx0=feature_1, xx1=feature_2, response=y_pred
    ... )
    >>> display.plot()
    <...>
    >>> display.ax_.scatter(
    ...     iris.data[:, 0], iris.data[:, 1], c=iris.target, edgecolor="black"
    ... )
    <...>
    >>> plt.show()
    N)multiclass_colorsxlabelylabelc                Z    || _         || _        || _        || _        || _        || _        d S Nxx0xx1responser!   r"   r#   )selfr'   r(   r)   r!   r"   r#   s          r   __init__z DecisionBoundaryDisplay.__init__   s3      !2r   contourfc                    t          d           ddlddlm} |dvrt	          d| d          ||                                \  }}t          ||          }| j        j        dk    r! || j	        | j
        | j        fi || _        nW| j        j        d         }	d	D ]!}
|
|v rt          j        d
|
 d           ||
= "| j        t!          | j        t"                    r| j        |	dk    rdnd}n| j        }|dk    r*|	dk    r$|                    dd          j        d|	         }n|dk    r*|	dk    r$|                    dd          j        d|	         }n|                    ||	          }t)          |d          s  |t+          j        dd|	                    }nE|j        }n=t!          | j        t.                    rfd| j        D             }nt	          d          || _        |dk    r8| j                            d          } || j	        | j
        |fd|i|| _        nfdt5          |          D             }g | _        t5          |          D ]\  }}t*          j                            | j        dddd|f         | j                            d          |k               }| j                             || j	        | j
        |fd|i|           ||                                s || j        n|}|                     |           ||!                                s || j"        n|}|#                    |           || _$        |j%        | _&        | S )a  Plot visualization.

        Parameters
        ----------
        plot_method : {'contourf', 'contour', 'pcolormesh'}, default='contourf'
            Plotting method to call when plotting the response. Please refer
            to the following matplotlib documentation for details:
            :func:`contourf <matplotlib.pyplot.contourf>`,
            :func:`contour <matplotlib.pyplot.contour>`,
            :func:`pcolormesh <matplotlib.pyplot.pcolormesh>`.

        ax : Matplotlib axes, default=None
            Axes object to plot on. If `None`, a new figure and axes is
            created.

        xlabel : str, default=None
            Overwrite the x-axis label.

        ylabel : str, default=None
            Overwrite the y-axis label.

        **kwargs : dict
            Additional keyword arguments to be passed to the `plot_method`.

        Returns
        -------
        display: :class:`~sklearn.inspection.DecisionBoundaryDisplay`
            Object that stores computed values.
        zDecisionBoundaryDisplay.plotr   Nr,   contour
pcolormeshz@plot_method must be 'contourf', 'contour', or 'pcolormesh'. Got 	 instead.   )cmapcolors'z' is ignored in favor of 'multiclass_colors' in the multiclass case when the response method is 'decision_function' or 'predict_proba'.
   tab10gist_rainbowtab20   r5      c                 D    g | ]}j                             |          S  )r5   to_rgba).0colormpls     r   
<listcomp>z0DecisionBoundaryDisplay.plot.<locals>.<listcomp>   s)    XXX#*,,U33XXXr   z,'multiclass_colors' must be a list or a str.r/   axisc           
      r    g | ]3\  }\  }}}}j         j                            d | d|||dfg          4S )	colormap_)      ?rH   rH   rH   rH   )r5   LinearSegmentedColormap	from_list)r@   	class_idxrgb_rB   s         r   rC   z0DecisionBoundaryDisplay.plot.<locals>.<listcomp>  sh     $ $ $ 0	<Aq!Q J6@@/I//2FAqRU1W $ $ $r   )maskr4   )'r   
matplotlibmatplotlib.pyplotpyplotr   subplotsgetattrr)   ndimr'   r(   surface_shapewarningswarnr!   
isinstancestrget_cmapr5   r   nplinspacelistmulticlass_colors_argmax	enumeratemaarrayappend
get_xlabelr"   
set_xlabel
get_ylabelr#   
set_ylabelax_figurefigure_)r*   plot_methodaxr"   r#   kwargspltrO   	plot_funcn_responseskwargr4   r5   	class_mapmulticlass_cmapsrK   r)   rB   s                    @r   plotzDecisionBoundaryDisplay.plot   s.   < 	!!?@@@    ''''''CCC.". . .  
 :LLNNEArB,,	=""%Idh$-RR6RRDMM--b1K+ & &F??MBE B B B  
 u%-&2 2- )1&1R&7&777^DD1D
 7??{b'8'8 \\'266=l{lKFFW__):): \\'266=l{lKFF<<k::D"422 -!%bk!Q&D&D!E!E!%D2D99 QXXXXAWXXX !OPPP&,D#i'' M00a088	 )	Hdh	! !:@!DJ! !$ $ $ $ 4=V3D3D	$ $ $  !#'01A'B'B  OIt!u{{aaaIo6#}333;;yHI  +    H M((!	$(DHhTTTTVTT    R]]__$*NT[[FMM&!!!R]]__$*NT[[FMM&!!!yr   d   rH   r   )	grid_resolutionepsrn   r   r   r!   r"   r#   ro   c       	         	  # t          | j         d           t          |           ddl#|dk    st	          d| d          |dk    st	          d| d          d}||vr+d	                    |          }t	          d
| d| d          t          |          }|dk    rt	          d| d          |dv r|t          |d          rt          |j	                  x}dk    rt          |t                    rct          |          |k    r#t	          d| dt          |           d          t          #fd|D                       rt	          d|           t          |t                    r-|#j                                        vrt	          d|           t!          |dd          t!          |dd          }}|                                |z
  |                                |z   }}|                                |z
  |                                |z   }}t'          j        t'          j        |||          t'          j        |||                    \  }}t&          j        |                                |                                f         }t1          |          st3          |          r,t5          |          }|                    |||j                  }t;          |||          }	 t=          ||||d          \  }}}n?# t          $ r2}dt          |          v rt	          d| d|j	                   | d}~ww xY w|dk    r?t          |d          r/t?                      } |j	        | _	        |                      |          }|j!        dk    r |j"        |j#         }n|tI          |          rt	          d          |=t'          j%        |j	        |k              d         }! |dd|!f         j"        |j#         }n |j"        g |j#        |j#        d         R  }|	t          |d           r|j        d         nd!}	|
t          |d           r|j        d         nd!}
 | |||||	|
"          }" |"j&        d$||d#|S )%a  Plot decision boundary given an estimator.

        Read more in the :ref:`User Guide <visualizations>`.

        Parameters
        ----------
        estimator : object
            Trained estimator used to plot the decision boundary.

        X : {array-like, sparse matrix, dataframe} of shape (n_samples, 2)
            Input data that should be only 2-dimensional.

        grid_resolution : int, default=100
            Number of grid points to use for plotting decision boundary.
            Higher values will make the plot look nicer but be slower to
            render.

        eps : float, default=1.0
            Extends the minimum and maximum values of X for evaluating the
            response function.

        plot_method : {'contourf', 'contour', 'pcolormesh'}, default='contourf'
            Plotting method to call when plotting the response. Please refer
            to the following matplotlib documentation for details:
            :func:`contourf <matplotlib.pyplot.contourf>`,
            :func:`contour <matplotlib.pyplot.contour>`,
            :func:`pcolormesh <matplotlib.pyplot.pcolormesh>`.

        response_method : {'auto', 'decision_function', 'predict_proba',                 'predict'}, default='auto'
            Specifies whether to use :term:`decision_function`,
            :term:`predict_proba` or :term:`predict` as the target response.
            If set to 'auto', the response method is tried in the order as
            listed above.

            .. versionchanged:: 1.6
                For multiclass problems, 'auto' no longer defaults to 'predict'.

        class_of_interest : int, float, bool or str, default=None
            The class to be plotted when `response_method` is 'predict_proba'
            or 'decision_function'. If None, `estimator.classes_[1]` is considered
            the positive class for binary classifiers. For multiclass
            classifiers, if None, all classes will be represented in the
            decision boundary plot; the class with the highest response value
            at each point is plotted. The color of each class can be set via
            `multiclass_colors`.

            .. versionadded:: 1.4

        multiclass_colors : list of str, or str, default=None
            Specifies how to color each class when plotting multiclass
            'predict_proba' or 'decision_function' and `class_of_interest` is
            None. Ignored in all other cases.

            Possible inputs are:

            * list: list of Matplotlib
              `color <https://matplotlib.org/stable/users/explain/colors/colors.html#colors-def>`_
              strings, of length `n_classes`
            * str: name of :class:`matplotlib.colors.Colormap`
            * None: 'tab10' colormap is used to sample colors if the number of
                classes is less than or equal to 10, otherwise 'gist_rainbow'
                colormap.

            Single color colormaps will be generated from the colors in the list or
            colors taken from the colormap, and passed to the `cmap` parameter of
            the `plot_method`.

            .. versionadded:: 1.7

        xlabel : str, default=None
            The label used for the x-axis. If `None`, an attempt is made to
            extract a label from `X` if it is a dataframe, otherwise an empty
            string is used.

        ylabel : str, default=None
            The label used for the y-axis. If `None`, an attempt is made to
            extract a label from `X` if it is a dataframe, otherwise an empty
            string is used.

        ax : Matplotlib axes, default=None
            Axes object to plot on. If `None`, a new figure and axes is
            created.

        **kwargs : dict
            Additional keyword arguments to be passed to the
            `plot_method`.

        Returns
        -------
        display : :class:`~sklearn.inspection.DecisionBoundaryDisplay`
            Object that stores the result.

        See Also
        --------
        DecisionBoundaryDisplay : Decision boundary visualization.
        sklearn.metrics.ConfusionMatrixDisplay.from_estimator : Plot the
            confusion matrix given an estimator, the data, and the label.
        sklearn.metrics.ConfusionMatrixDisplay.from_predictions : Plot the
            confusion matrix given the true and predicted labels.

        Examples
        --------
        >>> import matplotlib.pyplot as plt
        >>> from sklearn.datasets import load_iris
        >>> from sklearn.linear_model import LogisticRegression
        >>> from sklearn.inspection import DecisionBoundaryDisplay
        >>> iris = load_iris()
        >>> X = iris.data[:, :2]
        >>> classifier = LogisticRegression().fit(X, iris.target)
        >>> disp = DecisionBoundaryDisplay.from_estimator(
        ...     classifier, X, response_method="predict",
        ...     xlabel=iris.feature_names[0], ylabel=iris.feature_names[1],
        ...     alpha=0.5,
        ... )
        >>> disp.ax_.scatter(X[:, 0], X[:, 1], c=iris.target, edgecolor="k")
        <...>
        >>> plt.show()
        z.from_estimatorr   Nr<   z,grid_resolution must be greater than 1. Got r1   z,eps must be greater than or equal to 0. Got r.   z, zplot_method must be one of z. Got r2   z#n_features must be equal to 2. Got )r   r   r   r   z[When 'multiclass_colors' is a list, it must be of the same length as 'estimator.classes_' (z), got: .c              3   N   K   | ]}j                             |           V   d S r%   )r5   is_color_like)r@   colrB   s     r   	<genexpr>z9DecisionBoundaryDisplay.from_estimator.<locals>.<genexpr>  sG        :=
00555     r   z[When 'multiclass_colors' is a list, it can only contain valid Matplotlib color names. Got: zSWhen 'multiclass_colors' is a string, it must be a valid Matplotlib colormap. Got: rD   )columnsT)r   	pos_labelreturn_response_method_usedzis not a valid labelzclass_of_interest=z+ is not a valid label: It should be one of r   z)Multi-output regressors are not supportedr3   r    r&   )ro   rn   r>   )'r   __name__r   rQ   r   joinr   r   lenr   r[   r`   anyr\   rS   	colormapsr   minmaxr^   meshgridr_   c_ravelr   r   r
   create_containerr   r   r	   r   	transformrV   reshaperX   r   flatnonzerorw   )$clsr   Xry   rz   rn   r   r   r!   r"   r#   ro   rp   possible_plot_methodsavailable_methodsnum_features	n_classesx0x1x0_minx0_maxx1_minx1_maxr'   r(   X_gridadapterr   r)   rO   response_method_usedexcencodercol_idxdisplayrB   s$                                      @r   from_estimatorz&DecisionBoundaryDisplay.from_estimator'  s   P 	!CL!A!A!ABBB	"""    ""/#/ / /  
 axxMsMMM   !F333 $		*? @ @..? . .". . .  
 %Q''1MlMMM  
 MMM!-	:.. .!)"4555::+T22 ())Y66$5;D5 50115 5 5  
     AR      %M9JM M   +S11 $CJ,@,@,B,BBB$I5FI I  
  11---~a/K/K/KBCCCC;K88K88
 
S
 syy{{CIIKK/0?? 	l1oo 	1!44G--	 .  F <(9
 
	0D 1+,01 1 1-Ha--  		 		 		%S11 !=): = =(1(:= =   		  9,,J1O1O,"nnG(1G((22H=A'x'3HHI&& N !LMMM , .);?P)PQQRST78AAAwJ/7C+8+KSYKr8JKKK>%,Q	%:%:BQYq\\F>%,Q	%:%:BQYq\\F#/
 
 
 w|Er{EEfEEEs   5L 
M
-MM
)r,   NNN)r   
__module____qualname____doc__r+   rw   classmethodr   r>   r   r   r    r    >   s        d dN 8<DQU    v v v vp  KF KF KF KF [KF KF KFr   r    )rY   numpyr^   sklearn.baser   sklearn.preprocessingr   sklearn.utilsr   sklearn.utils._dataframer   r   $sklearn.utils._optional_dependenciesr   sklearn.utils._responser	   sklearn.utils._set_outputr
   sklearn.utils.validationr   r   r   r   r    r>   r   r   <module>r      s(        % % % % % % . . . . . . ( ( ( ( ( ( ? ? ? ? ? ? ? ? I I I I I I 8 8 8 8 8 8 A A A A A A         % % %PuF uF uF uF uF uF uF uF uF uFr   