
    Mpj                        S r SSKJr  SSKrSSKJr  SSKJr  SSK	J
r
Jr  SSKJr  SSKJr  SS	KJr  SS
KJrJr  SSKJr  SSKJrJrJr  SSKJrJrJr  SSKJ r   SSK!J"r"J#r#J$r$J%r%J&r&  SSK'J(r(  SSK)J*r*  SSK+J,r,J-r-  S/r.S r/S r0 S,S jr1\&" \"" SS/5      \"" SS/5      \"" SS/5      /SS/S\#\2/SS/SS/SS/\%" 1 Sk5      /\3/\$" \#SSSS 9/\%" 1 S!k5      /\%" 1 S"k5      /\4S/S#.S$S%9SSSS&S'S(SS&S)S*.	S+ j5       r5g)-zBPartial dependence plots for regression and classification models.    )IterableN)sparse)
mquantiles)is_classifieris_regressor)RandomForestRegressor)BaseGradientBoosting)BaseHistGradientBoosting)_check_feature_names_get_feature_index)DecisionTreeRegressor)Bunch_safe_indexingcheck_array)_determine_key_type_get_column_indices_safe_assign)check_matplotlib_support)
HasMethodsIntegralInterval
StrOptionsvalidate_params)_get_response_values)	cartesian)_check_sample_weightcheck_is_fittedpartial_dependencec           	         [        U[        5      (       a  [        U5      S:w  a  [        S5      e[	        S U 5       5      (       d  [        S5      eUS   US   :  a  [        S5      eUS::  a  [        S5      eS	 nUR                  5        VVs0 s H  u  pgXe" U5      _M     nnn[        S
 UR                  5        5       5      (       a4  SR                  S UR                  5        5       5      n[        SU 35      e/ n	[        U5       H  u  pX;   a  XJ   nO [        R                  " [        X
SS95      nU(       d  UR                  S   U:  a  UnO][        [        X
SS9USS9n[        R                   " US   US   5      (       a  [        S5      e[        R"                  " US   US   USS9nU	R%                  U5        M     ['        U	5      U	4$ s  snnf ! [         a  n[        SU
 S35      UeSnAff = f)a  Generate a grid of points based on the percentiles of X.

The grid is a cartesian product between the columns of ``values``. The
ith column of ``values`` consists in ``grid_resolution`` equally-spaced
points between the percentiles of the jth column of X.

If ``grid_resolution`` is bigger than the number of unique values in the
j-th column of X or if the feature is a categorical feature (by inspecting
`is_categorical`) , then those unique values will be used instead.

Parameters
----------
X : array-like of shape (n_samples, n_target_features)
    The data.

percentiles : tuple of float
    The percentiles which are used to construct the extreme values of
    the grid. Must be in [0, 1].

is_categorical : list of bool
    For each feature, tells whether it is categorical or not. If a feature
    is categorical, then the values used will be the unique ones
    (i.e. categories) instead of the percentiles.

grid_resolution : int
    The number of equally spaced points to be placed on the grid for each
    feature.

custom_values: dict
    Mapping from column index of X to an array-like of values where
    the partial dependence should be calculated for that feature

Returns
-------
grid : ndarray of shape (n_points, n_target_features)
    A value for each feature at each point in the grid. ``n_points`` is
    always ``<= grid_resolution ** X.shape[1]``.

values : list of 1d ndarrays
    The values with which the grid has been created. The size of each
    array ``values[j]`` is either ``grid_resolution``, the number of
    unique values in ``X[:, j]``, if j is not in ``custom_range``.
    If j is in ``custom_range``, then it is the length of ``custom_range[j]``.
   z/'percentiles' must be a sequence of 2 elements.c              3   L   #    U  H  nS Us=:*  =(       a    S:*  Os  v   M     g7f)r      N ).0xs     b/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/sklearn/inspection/_partial_dependence.py	<genexpr>_grid_from_X.<locals>.<genexpr>Z   s     0KqqA{{{{Ks   "$z''percentiles' values must be in [0, 1].r   r"   z9percentiles[0] must be strictly less than percentiles[1].z2'grid_resolution' must be strictly greater than 1.c                 h    [        S U  5       5      (       a  [        OS n[        R                  " XS9$ )Nc              3   B   #    U  H  n[        U[        5      v   M     g 7fN)
isinstancestrr$   vs     r&   r'   ?_grid_from_X.<locals>._convert_custom_values.<locals>.<genexpr>d   s     A&QjC00&s   )dtype)anyobjectnpasarray)valuesr1   s     r&   _convert_custom_values,_grid_from_X.<locals>._convert_custom_valuesb   s(    A&AAAtzz&..    c              3   >   #    U  H  oR                   S :g  v   M     g7f)r"   Nndimr.   s     r&   r'   r(   h   s     
7 6166Q; 6s   , c              3   p   #    U  H,  u  pUR                   S :w  d  M  SU SUR                    S3v   M.     g7f)r"   zFeature z: z dimensionsNr;   )r$   kr/   s      r&   r'   r(   i   s9      !
-vv{ 0hqcAFF8;/-s   66zBThe custom grid for some features is not a one-dimensional array. axiszThe column #z contains mixed data types. Finding unique categories fail due to sorting. It usually means that the column contains `np.nan` values together with `str` categories. Such use case is not yet supported in scikit-learn.N)probrA   ztpercentiles are too close to each other, unable to build the grid. Please choose percentiles that are further apart.T)numendpoint)r,   r   len
ValueErrorallitemsr2   r6   join	enumerater4   uniquer   	TypeErrorshaper   allcloselinspaceappendr   )Xpercentilesis_categoricalgrid_resolutioncustom_valuesr7   r?   r/   error_stringr6   featureis_catrA   uniquesexcemp_percentiless                   r&   _grid_from_Xr\   +   s4   Z k8,,K0@A0EJKK0K000BCC1~Q'TUU!MNN/
 ?L>Q>Q>ST>SdaQ.q11>SMT

7 4 4 6
777yy !
%++-!
 
 Pn
 	

 F %^4# )D
))N1A$FG q)O;  #-"1A6[q# ;;q1?13EFF$2 
 {{#A&#A&'!	 	dO 5R Vf$$s U.   !"7) ,A A
 s   GG
G<'G77G<c                 l    U R                  X5      nUR                  S:X  a  UR                  SS5      nU$ )a  Calculate partial dependence via the recursion method.

The recursion method is in particular enabled for tree-based estimators.

For each `grid` value, a weighted tree traversal is performed: if a split node
involves an input feature of interest, the corresponding left or right branch
is followed; otherwise both branches are followed, each branch being weighted
by the fraction of training samples that entered that branch. Finally, the
partial dependence is given by a weighted average of all the visited leaves
values.

This method is more efficient in terms of speed than the `'brute'` method
(:func:`~sklearn.inspection._partial_dependence._partial_dependence_brute`).
However, here, the partial dependence computation is done explicitly with the
`X` used during training of `est`.

Parameters
----------
est : BaseEstimator
    A fitted estimator object implementing :term:`predict` or
    :term:`decision_function`. Multioutput-multiclass classifiers are not
    supported. Note that `'recursion'` is only supported for some tree-based
    estimators (namely
    :class:`~sklearn.ensemble.GradientBoostingClassifier`,
    :class:`~sklearn.ensemble.GradientBoostingRegressor`,
    :class:`~sklearn.ensemble.HistGradientBoostingClassifier`,
    :class:`~sklearn.ensemble.HistGradientBoostingRegressor`,
    :class:`~sklearn.tree.DecisionTreeRegressor`,
    :class:`~sklearn.ensemble.RandomForestRegressor`,
    ).

grid : array-like of shape (n_points, n_target_features)
    The grid of feature values for which the partial dependence is calculated.
    Note that `n_points` is the number of points in the grid and `n_target_features`
    is the number of features you are doing partial dependence at.

features : array-like of {int, str}
    The feature (e.g. `[0]`) or pair of interacting features
    (e.g. `[(0, 1)]`) for which the partial dependency should be computed.

Returns
-------
averaged_predictions : array-like of shape (n_targets, n_points)
    The averaged predictions for the given `grid` of features values.
    Note that `n_targets` is the number of targets (e.g. 1 for binary
    classification, `n_tasks` for multi-output regression, and `n_classes` for
    multiclass classification) and `n_points` is the number of points in the `grid`.
r"   )%_compute_partial_dependence_recursionr<   reshape)estgridfeaturesaveraged_predictionss       r&   _partial_dependence_recursionre      s?    b DDTT  A%  4;;ArBr9   c           	         / n/ nUS:X  a  [        U 5      (       a  SOSS/nUR                  5       nU Hf  n	[        U5       H  u  p[        XU
   US9  M     [	        XUS9u  pUR                  U5        UR                  [        R                  " USUS95        Mh     UR                  S   n[        R                  " U5      R                  n[        U 5      (       a#  UR                  S	:X  a  UR                  US
5      nO:[        U 5      (       a*  UR                  S   S	:X  a  US   nUR                  US
5      n[        R                  " U5      R                  nUR                  S:X  a  UR                  SS
5      nXv4$ )aF  Calculate partial dependence via the brute force method.

The brute method explicitly averages the predictions of an estimator over a
grid of feature values.

For each `grid` value, all the samples from `X` have their variables of
interest replaced by that specific `grid` value. The predictions are then made
and averaged across the samples.

This method is slower than the `'recursion'`
(:func:`~sklearn.inspection._partial_dependence._partial_dependence_recursion`)
version for estimators with this second option. However, with the `'brute'`
force method, the average will be done with the given `X` and not the `X`
used during training, as it is done in the `'recursion'` version. Therefore
the average can always accept `sample_weight` (even when the estimator was
fitted without).

Parameters
----------
est : BaseEstimator
    A fitted estimator object implementing :term:`predict`,
    :term:`predict_proba`, or :term:`decision_function`.
    Multioutput-multiclass classifiers are not supported.

grid : array-like of shape (n_points, n_target_features)
    The grid of feature values for which the partial dependence is calculated.
    Note that `n_points` is the number of points in the grid and `n_target_features`
    is the number of features you are doing partial dependence at.

features : array-like of {int, str}
    The feature (e.g. `[0]`) or pair of interacting features
    (e.g. `[(0, 1)]`) for which the partial dependency should be computed.

X : array-like of shape (n_samples, n_features)
    `X` is used to generate values for the complement features. That is, for
    each value in `grid`, the method will average the prediction of each
    sample from `X` having that grid value for `features`.

response_method : {'auto', 'predict_proba', 'decision_function'},             default='auto'
    Specifies whether to use :term:`predict_proba` or
    :term:`decision_function` as the target response. For regressors
    this parameter is ignored and the response is always the output of
    :term:`predict`. By default, :term:`predict_proba` is tried first
    and we revert to :term:`decision_function` if it doesn't exist.

sample_weight : array-like of shape (n_samples,), default=None
    Sample weights are used to calculate weighted means when averaging the
    model output. If `None`, then samples are equally weighted. Note that
    `sample_weight` does not change the individual predictions.

Returns
-------
averaged_predictions : array-like of shape (n_targets, n_points)
    The averaged predictions for the given `grid` of features values.
    Note that `n_targets` is the number of targets (e.g. 1 for binary
    classification, `n_tasks` for multi-output regression, and `n_classes` for
    multiclass classification) and `n_points` is the number of points in the `grid`.

predictions : array-like
    The predictions for the given `grid` of features values over the samples
    from `X`. For non-multioutput regression and binary classification the
    shape is `(n_instances, n_points)` and for multi-output regression and
    multiclass classification the shape is `(n_targets, n_instances, n_points)`,
    where `n_targets` is the number of targets (`n_tasks` for multi-output
    regression, and `n_classes` for multiclass classification), `n_instances`
    is the number of instances in `X`, and `n_points` is the number of points
    in the `grid`.
autopredictpredict_probadecision_function)column_indexer)response_methodr   )rA   weightsr    r^   r"   )r   copyrJ   r   r   rP   r4   averagerM   arrayTr<   r`   r   )ra   rb   rc   rQ   rl   sample_weightpredictionsrd   X_eval
new_valuesivariablepred_	n_sampless                  r&   _partial_dependence_bruter{      sn   P K& %c**IBU0V 	 VVXF
$X.KAAxH / 'sOT4 ##BJJt!]$ST   
I ((;'))KC[--2!)))R8	s		 1 1! 4 9 "!n!)))R8 88$89;;  A%  4;;ArB,,r9   fitrh   ri   rj   z
array-likezsparse matrix>   rg   ri   rj   r"   left)closed>   rg   brute	recursion>   bothro   
individual)	estimatorrQ   rc   rr   categorical_featuresfeature_namesrl   rR   rT   methodkindrU   T)prefer_skip_nested_validationrg   )g?gffffff?d   ro   )	rr   r   r   rl   rR   rT   rU   r   r   c       	         
   [        U 5        [        U 5      (       d  [        U 5      (       d  [        S5      e[        U 5      (       a7  [	        U R
                  S   [        R                  5      (       a  [        S5      e[        US5      (       d*  [        R                  " U5      (       d  [        US[        S9n[        U 5      (       a  US:w  a  [        S5      eUS	:w  a  U
S
:X  a  [        S5      eSn
U
S
:X  a  Ub  [        S5      eU
S:X  aP  Ub  Sn
OJ[	        U [        5      (       a  U R                  c  S
n
O%[	        U [        [         ["        45      (       a  S
n
OSn
U
S
:X  am  [	        U [        [        [         ["        45      (       d+  Sn[        SR%                  SR'                  U5      5      5      eUS:X  a  SnUS:w  a  [        SU S35      eUb  [)        X15      n[+        USS9S:X  aO  [        R,                  " [        R.                  " US5      5      (       a  [        SUR0                  S   S-
   S35      e[        R2                  " [5        X5      [        R6                  SS9R9                  5       n[;        X5      nUR0                  S   nUc  S/[=        U5      -  nO[        R2                  " U5      nUR>                  S:X  a  [        S5      eUR@                  RB                  S:X  aB  UR>                  U:w  a  [        SUR>                   SU S 35      eU Vs/ s H  nUU   PM
     nnOcUR@                  RB                  S!;   a0  U Vs/ s H  n[E        UUS"9PM     nnU Vs/ s H  nUU;   PM
     nnO[        S#UR@                   S$35      eU	=(       d    0 n	[	        U[F        [H        45      (       a  U/n[K        XU5       HC  u  nnnU(       a  M  [M        UUSS%9R@                  RB                  S&;   d  M5  [        S'U< S(35      e   [M        XSS%9n[O        U5       VVs0 s H   u  nnUU	;   d  M  UU	RQ                  U5      _M"     nnn[S        UUUUU5      u  nnU
S:X  aQ  [U        U UXXc5      u  nnURV                  " S)UR0                  S   /U Vs/ s H  nUR0                  S   PM     snQ76 nO[Y        U UU5      nURV                  " S)/U Vs/ s H  nUR0                  S   PM     snQ76 n[[        US*9nUS	:X  a  UUS	'   U$ US+:X  a  WUS+'   U$ UUS	'   WUS+'   U$ s  snf s  snf s  snf s  snnf s  snf s  snf ),a1!  Partial dependence of ``features``.

Partial dependence of a feature (or a set of features) corresponds to
the average response of an estimator for each possible value of the
feature.

Read more in
:ref:`sphx_glr_auto_examples_inspection_plot_partial_dependence.py`
and the :ref:`User Guide <partial_dependence>`.

.. warning::

    For :class:`~sklearn.ensemble.GradientBoostingClassifier` and
    :class:`~sklearn.ensemble.GradientBoostingRegressor`, the
    `'recursion'` method (used by default) will not account for the `init`
    predictor of the boosting process. In practice, this will produce
    the same values as `'brute'` up to a constant offset in the target
    response, provided that `init` is a constant estimator (which is the
    default). However, if `init` is not a constant estimator, the
    partial dependence values are incorrect for `'recursion'` because the
    offset will be sample-dependent. It is preferable to use the `'brute'`
    method. Note that this only applies to
    :class:`~sklearn.ensemble.GradientBoostingClassifier` and
    :class:`~sklearn.ensemble.GradientBoostingRegressor`, not to
    :class:`~sklearn.ensemble.HistGradientBoostingClassifier` and
    :class:`~sklearn.ensemble.HistGradientBoostingRegressor`.

Parameters
----------
estimator : BaseEstimator
    A fitted estimator object implementing :term:`predict`,
    :term:`predict_proba`, or :term:`decision_function`.
    Multioutput-multiclass classifiers are not supported.

X : {array-like, sparse matrix or dataframe} of shape (n_samples, n_features)
    ``X`` is used to generate a grid of values for the target
    ``features`` (where the partial dependence will be evaluated), and
    also to generate values for the complement features when the
    `method` is 'brute'.

features : array-like of {int, str, bool} or int or str
    The feature (e.g. `[0]`) or pair of interacting features
    (e.g. `[(0, 1)]`) for which the partial dependency should be computed.

sample_weight : array-like of shape (n_samples,), default=None
    Sample weights are used to calculate weighted means when averaging the
    model output. If `None`, then samples are equally weighted. If
    `sample_weight` is not `None`, then `method` will be set to `'brute'`.
    Note that `sample_weight` is ignored for `kind='individual'`.

    .. versionadded:: 1.3

categorical_features : array-like of shape (n_features,) or shape             (n_categorical_features,), dtype={bool, int, str}, default=None
    Indicates the categorical features.

    - `None`: no feature will be considered categorical;
    - boolean array-like: boolean mask of shape `(n_features,)`
        indicating which features are categorical. Thus, this array has
        the same shape has `X.shape[1]`;
    - integer or string array-like: integer indices or strings
        indicating categorical features.

    .. versionadded:: 1.2

feature_names : array-like of shape (n_features,), dtype=str, default=None
    Name of each feature; `feature_names[i]` holds the name of the feature
    with index `i`.
    By default, the name of the feature corresponds to their numerical
    index for NumPy array and their column name for pandas dataframe.

    .. versionadded:: 1.2

response_method : {'auto', 'predict_proba', 'decision_function'},             default='auto'
    Specifies whether to use :term:`predict_proba` or
    :term:`decision_function` as the target response. For regressors
    this parameter is ignored and the response is always the output of
    :term:`predict`. By default, :term:`predict_proba` is tried first
    and we revert to :term:`decision_function` if it doesn't exist. If
    ``method`` is 'recursion', the response is always the output of
    :term:`decision_function`.

percentiles : tuple of float, default=(0.05, 0.95)
    The lower and upper percentile used to create the extreme values
    for the grid. Must be in [0, 1].
    This parameter is overridden by `custom_values` if that parameter is set.

grid_resolution : int, default=100
    The number of equally spaced points on the grid, for each target
    feature.
    This parameter is overridden by `custom_values` if that parameter is set.

custom_values : dict
    A dictionary mapping the index of an element of `features` to an array
    of values where the partial dependence should be calculated
    for that feature. Setting a range of values for a feature overrides
    `grid_resolution` and `percentiles`.

    See :ref:`how to use partial_dependence
    <plt_partial_dependence_custom_values>` for an example of how this parameter can
    be used.

    .. versionadded:: 1.7

method : {'auto', 'recursion', 'brute'}, default='auto'
    The method used to calculate the averaged predictions:

    - `'recursion'` is only supported for some tree-based estimators
      (namely
      :class:`~sklearn.ensemble.GradientBoostingClassifier`,
      :class:`~sklearn.ensemble.GradientBoostingRegressor`,
      :class:`~sklearn.ensemble.HistGradientBoostingClassifier`,
      :class:`~sklearn.ensemble.HistGradientBoostingRegressor`,
      :class:`~sklearn.tree.DecisionTreeRegressor`,
      :class:`~sklearn.ensemble.RandomForestRegressor`,
      ) when `kind='average'`.
      This is more efficient in terms of speed.
      With this method, the target response of a
      classifier is always the decision function, not the predicted
      probabilities. Since the `'recursion'` method implicitly computes
      the average of the Individual Conditional Expectation (ICE) by
      design, it is not compatible with ICE and thus `kind` must be
      `'average'`.

    - `'brute'` is supported for any estimator, but is more
      computationally intensive.

    - `'auto'`: the `'recursion'` is used for estimators that support it,
      and `'brute'` is used otherwise. If `sample_weight` is not `None`,
      then `'brute'` is used regardless of the estimator.

    Please see :ref:`this note <pdp_method_differences>` for
    differences between the `'brute'` and `'recursion'` method.

kind : {'average', 'individual', 'both'}, default='average'
    Whether to return the partial dependence averaged across all the
    samples in the dataset or one value per sample or both.
    See Returns below.

    Note that the fast `method='recursion'` option is only available for
    `kind='average'` and `sample_weights=None`. Computing individual
    dependencies and doing weighted averages requires using the slower
    `method='brute'`.

    .. versionadded:: 0.24

Returns
-------
predictions : :class:`~sklearn.utils.Bunch`
    Dictionary-like object, with the following attributes.

    individual : ndarray of shape (n_outputs, n_instances,                 len(values[0]), len(values[1]), ...)
        The predictions for all the points in the grid for all
        samples in X. This is also known as Individual
        Conditional Expectation (ICE).
        Only available when `kind='individual'` or `kind='both'`.

    average : ndarray of shape (n_outputs, len(values[0]),                 len(values[1]), ...)
        The predictions for all the points in the grid, averaged
        over all samples in X (or over the training data if
        `method` is 'recursion').
        Only available when `kind='average'` or `kind='both'`.

    grid_values : seq of 1d ndarrays
        The values with which the grid has been created. The generated
        grid is a cartesian product of the arrays in `grid_values` where
        `len(grid_values) == len(features)`. The size of each array
        `grid_values[j]` is either `grid_resolution`, or the number of
        unique values in `X[:, j]`, whichever is smaller.

        .. versionadded:: 1.3

    `n_outputs` corresponds to the number of classes in a multi-class
    setting, or to the number of tasks for multi-output regression.
    For classical regression and binary classification `n_outputs==1`.
    `n_values_feature_j` corresponds to the size `grid_values[j]`.

See Also
--------
PartialDependenceDisplay.from_estimator : Plot Partial Dependence.
PartialDependenceDisplay : Partial Dependence visualization.

Examples
--------
>>> X = [[0, 0, 2], [1, 0, 0]]
>>> y = [0, 1]
>>> from sklearn.ensemble import GradientBoostingClassifier
>>> gb = GradientBoostingClassifier(random_state=0).fit(X, y)
>>> partial_dependence(gb, features=[0], X=X, percentiles=(0, 1),
...                    grid_resolution=2) # doctest: +SKIP
(array([[-4.52,  4.52]]), [array([ 0.,  1.])])
z5'estimator' must be a fitted regressor or classifier.r   z3Multiclass-multioutput estimators are not supported	__array__z	allow-nan)ensure_all_finiter1   rg   zKThe response_method parameter is ignored for regressors and must be 'auto'.ro   r   zCThe 'recursion' method only applies when 'kind' is set to 'average'r   zFThe 'recursion' method can only be applied when sample_weight is None.)GradientBoostingClassifierGradientBoostingRegressorHistGradientBoostingClassifierHistGradientBoostingRegressorr   r   r   z[Only the following estimators support the 'recursion' method: {}. Try using method='brute'.r=   rj   zRWith the 'recursion' method, the response_method must be 'decision_function'. Got .F)accept_sliceintzall features must be in [0, r"   ]C)r1   orderzPassing an empty list (`[]`) to `categorical_features` is not supported. Use `None` instead to indicate that there are no categorical features.bzeWhen `categorical_features` is a boolean array-like, the array should be of shape (n_features,). Got z elements while `X` contains z
 features.)rv   OU)r   zXExpected `categorical_features` to be an array-like of boolean, integer, or string. Got z	 instead.r@   iuzThe column a   contains integer data. Partial dependence plots are not supported for integer data: this can lead to implicit rounding with NumPy arrays or even errors with newer pandas versions. Please convert numerical features to floating point dtypes ahead of time to avoid problems.r^   )grid_valuesr   ).r   r   r   rF   r,   classes_r4   ndarrayhasattrr   issparser   r3   r	   initr
   r   r   formatrI   r   r   r2   lessrM   r5   r   intpravelr   rE   sizer1   r   r   r-   r   zipr   rJ   getr\   r{   r`   re   r   )r   rQ   rc   rr   r   r   rl   rR   rT   rU   r   r   supported_classes_recursionfeatures_indices
n_featuresrS   idxcatcategorical_features_idxfeature_idxrW   rX   X_subsetindexcustom_values_for_X_subsetrb   r6   rd   rs   valpdp_resultss                                  r&   r   r   ]  s   N I)$$Y(?(?PQQYJy/A/A!/Dbjj$Q$QNOO A{##vq'9'9[GI?f#<
 	

 y[ U  !:T
 	
 $F	#788Y^^=S F%'<>ST
 
 !FF$(%%	
 
+' 88>II9:9  f$1O11,,;+<A? 
  ,]>8%8EA 66"''(A&'';AGGAJN;K1MNNzzA(seg  ):MJ#3'7#88!zz*>?$$)( 
  %%**c1#((J6 G+0011N!l*.  DTTCSC237CSNTN!'',,? 0(/C #3mD/ % (
 <L;KC//;K  N ,,@,F,F+GyR 
 "'RM(S#J'':(+,<(W$Wf![q177<<Dg[ )L L  )X a:H (1"1NE7m# 	*}  ))1  "  "LD& ,Et-/-
)k "))

6<=fsciilf=
  =t- 
 077
&,-fsciilf- F+Ky!5I  
	$/L!
  "6I$/L!_ U(8", > .s*   T'T,(T1'T68T6T<
U
r+   )6__doc__collections.abcr   numpyr4   scipyr   scipy.stats.mstatsr   sklearn.baser   r   sklearn.ensembler   sklearn.ensemble._gbr	   :sklearn.ensemble._hist_gradient_boosting.gradient_boostingr
   sklearn.inspection._pd_utilsr   r   sklearn.treer   sklearn.utilsr   r   r   sklearn.utils._indexingr   r   r   $sklearn.utils._optional_dependenciesr   sklearn.utils._param_validationr   r   r   r   r   sklearn.utils._responser   sklearn.utils.extmathr   sklearn.utils.validationr   r   __all__r\   re   r{   r-   tupledictr   r#   r9   r&   <module>r      s\   H
 %   ) 4 2 5 R . < < 
 J  9 + J 
u%p7 v <@}-@  y)*/0234

 O,!8S1&-!-t 4&-&'UVWw$Xq$vFG<=>=>?!$ #''4 	S+*Sr9   