
    \hT                         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mZmZmZmZ d
 Z G d d      Zy)    N   )is_regressor)LabelEncoder)_safe_indexing)check_matplotlib_support)_get_response_values)_get_adapter_from_container)_is_arraylike_not_scalar_is_pandas_df_is_polars_df_num_featurescheck_is_fittedc                     t        | d      }|r%t        | j                  d         rd}t        |      |dk(  rt	        |       rd}|S g d}|S |}|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         d/var/www/html/engine/venv/lib/python3.12/site-packages/sklearn/inspection/_plot/decision_boundary.py_check_boundary_response_methodr      sr    0 )Z0K/	0B0B10EFVo& 	" ) 	 !R  ,    c                   N    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y)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                X    || _         || _        || _        || _        || _        || _        y Nxx0xx1responser"   r#   r$   )selfr(   r)   r*   r"   r#   r$   s          r   __init__z DecisionBoundaryDisplay.__init__   s/      !2r   contourfc                 L   t        d       ddl}ddlm} |dvrt	        d| d      ||j                         \  }}t        ||      }	| j                  j                  dk(  r0 |	| j                  | j                  | j                  fi || _        n| j                  j                  d   }
t        | j                  t              s| j                  t        | j                  t              r| j                  }n
|
d	k  rd
}nd}|d
k(  r%|
d	k  r |j!                  d
d	      j"                  d|
 }n|dk(  r%|
dk  r |j!                  dd      j"                  d|
 }n|j!                  ||
      j"                  }nut        | j                  t              r)|j!                  | j                  |
      j"                  x}}n2| j                  D cg c]  }|j"                  j%                  |       }}|| _        t)        |      D cg c]9  \  }\  }}}}|j"                  j*                  j-                  d| d|||dfg      ; }}}}}}g | _        t)        |      D ]  \  }}t.        j0                  j3                  | j                  dddd|f   | j                  j5                  d      |k(         }|j7                         }d|v r|d= t9        j:                  d       | j                  j=                   |	| j                  | j                  |fd|i|        ||j?                         s!|| j@                  n|}|jC                  |       ||jE                         s!|| jF                  n|}|jI                  |       || _%        |jL                  | _'        | S c c}w c c}}}}}w )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.   
   tab10gist_rainbowtab20   	colormap_)      ?r;   r;   r;   r;   axis)maskcmapzPlotting max class of multiclass 'decision_function' or 'predict_proba', thus 'multiclass_colors' used and 'cmap' kwarg ignored.)(r   
matplotlibmatplotlib.pyplotpyplotr   subplotsgetattrr*   ndimr(   r)   surface_shape
isinstancer"   strget_cmapcolorsto_rgbamulticlass_colors_	enumerateLinearSegmentedColormap	from_listnpmaarrayargmaxcopywarningswarnappend
get_xlabelr#   
set_xlabel
get_ylabelr$   
set_ylabelax_figurefigure_)r+   plot_methodaxr#   r$   kwargsmplplt_	plot_funcn_responsesr?   rK   color	class_idxrgbmulticlass_cmapsr*   safe_kwargss                        r   plotzDecisionBoundaryDisplay.plot   si   < 	!!?@ 'CC"m9. 
 :LLNEArB,	=="%dhh$--R6RDM----b1K41137))1d44c:11D"b(&-
 7?{b'8 \\'26==l{KFW_): \\'26==l{KF \\$<CCFD22C8"%,,**K#& BFAWAWX#**,,U3XX&,D#
 09/@	    ,I|1a 

22<<	{+.BQ1cN-S    DM#,-=#> 	455;;MM!Q	/2==//Q/79DE ' 
 %kkm[(#F+MM0
 $$dhh(UUU$ R]]_$*NT[[FMM&!R]]_$*NT[[FMM&!yyM Y s   "N>Nd   r;   r   )	grid_resolutionepsr`   r   r   r"   r#   r$   ra   c       	         D  # t        | j                   d       t        |       ddl#|dkD  st	        d| d      |dk\  st	        d| d      d}||vr#d	j                  |      }t	        d
| d| d      t        |      }|dk7  rt	        d| d      |dv r|t        |d      rt        |j                        x}dkD  rt        |t              rKt        |      |k7  rt	        d| dt        |       d      t        #fd|D              rt	        d|       t        |t              r*|#j                  j                         vrt	        d|       t!        |dd      t!        |dd      }}|j#                         |z
  |j%                         |z   }}|j#                         |z
  |j%                         |z   }}t'        j(                  t'        j*                  |||      t'        j*                  |||            \  }}t&        j,                  |j/                         |j/                         f   }t1        |      st3        |      r)t5        |      }|j7                  |||j8                        }t;        |||      }	 t=        ||||d      \  }}}|dk(  r8t        |d      r,t?               } |j                  | _	        | jA                  |      }|jB                  dk(  r |jD                  |jF                   }ntI        |      rt	        d      |Ft'        jJ                  |j                  |k(        d   }! |dd|!f   jD                  |jF                   }n+ |jD                  g |jF                  |jF                  d    }|	t        |d       r|j8                  d   nd!}	|
t        |d       r|j8                  d   nd!}
 | |||||	|
"      }" |"jL                  d$||d#|S # t        $ r/}dt        |      v rt	        d| d|j                         | d}~ww xY w)%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   N   z,grid_resolution must be greater than 1. Got r2   z,eps must be greater than or equal to 0. Got r/   z, zplot_method must be one of z. Got r3   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   V   K   | ]   }j                   j                  |        " y wr&   )rK   is_color_like).0colrc   s     r   	<genexpr>z9DecisionBoundaryDisplay.from_estimator.<locals>.<genexpr>  s(      :=

0055s   &)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: r<   )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 supportedr4   r{    r'   )ra   r`    )'r   __name__r   r@   r   joinr   r   lenr   rH   listanyrI   rB   	colormapsr   minmaxrQ   meshgridlinspacec_ravelr   r   r	   create_containerr{   r   r   r   	transformrE   reshaperG   r   flatnonzeroro   )$clsr   Xrq   rr   r`   r   r   r"   r#   r$   ra   rb   possible_plot_methodsavailable_methodsnum_features	n_classesx0x1x0_minx0_maxx1_minx1_maxr(   r)   X_gridadapterr   r*   re   response_method_usedexcencodercol_idxdisplayrc   s$                                      @r   from_estimatorz&DecisionBoundaryDisplay.from_estimator"  s   P 	!CLL>!AB	" "#$I/ 
 ax>se9M  !F33 $		*? @-.?-@ A"m9. 
 %Q'15l^9M 
 MM!-	:.!)"4"455:+T2()Y6$;;D+X012!5 
  AR  %99J8KM  +S1$CJJ,@,@,BB$55F4GI 
  11-~a/KBCCCC;;KK8KK8
S
 syy{CIIK/0}Q/1!4G--		 . F <(9
	0D 1+,01-Ha-&  9,J1O"nG(11G((2H==A'x''3HI& !LMM , ..););?P)PQRST78AwJ/77C+8++KSYYKr8JK>%,Q	%:QYYq\F>%,Q	%:QYYq\F/
 w||Er{EfEE]  		%S1 !():(; <((1(:(:';=  		s   O' '	P0*PP)r-   NNN)r   
__module____qualname____doc__r,   ro   classmethodr   r   r   r   r!   r!   ?   sT    dN 8<DQUpd  KF KFr   r!   )rV   numpyrQ   baser   preprocessingr   utilsr   utils._optional_dependenciesr   utils._responser   utils._set_outputr	   utils.validationr
   r   r   r   r   r   r!   r   r   r   <module>r      s=        ) # D 3 < %PoF oFr   