validmind 2.4.10__py3-none-any.whl → 2.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- validmind/__version__.py +1 -1
- validmind/api_client.py +1 -0
- validmind/client.py +0 -2
- validmind/input_registry.py +8 -0
- validmind/tests/__types__.py +4 -0
- validmind/tests/data_validation/DatasetDescription.py +1 -0
- validmind/tests/model_validation/sklearn/ClassifierPerformance.py +15 -6
- validmind/tests/model_validation/sklearn/ClusterPerformance.py +2 -2
- validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py +10 -3
- validmind/tests/model_validation/sklearn/OverfitDiagnosis.py +349 -291
- validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py +1 -1
- validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py +36 -37
- validmind/tests/ongoing_monitoring/FeatureDrift.py +182 -0
- validmind/tests/ongoing_monitoring/PredictionAcrossEachFeature.py +76 -0
- validmind/tests/ongoing_monitoring/PredictionCorrelation.py +91 -0
- validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py +57 -0
- validmind/tests/run.py +35 -19
- validmind/unit_metrics/__init__.py +1 -1
- validmind/unit_metrics/classification/sklearn/ROC_AUC.py +22 -1
- validmind/utils.py +1 -1
- validmind/vm_models/__init__.py +2 -0
- validmind/vm_models/dataset/dataset.py +55 -14
- validmind/vm_models/input.py +31 -0
- validmind/vm_models/model.py +4 -2
- validmind/vm_models/test_context.py +9 -2
- {validmind-2.4.10.dist-info → validmind-2.5.1.dist-info}/METADATA +1 -1
- {validmind-2.4.10.dist-info → validmind-2.5.1.dist-info}/RECORD +30 -25
- {validmind-2.4.10.dist-info → validmind-2.5.1.dist-info}/LICENSE +0 -0
- {validmind-2.4.10.dist-info → validmind-2.5.1.dist-info}/WHEEL +0 -0
- {validmind-2.4.10.dist-info → validmind-2.5.1.dist-info}/entry_points.txt +0 -0
validmind/tests/run.py
CHANGED
@@ -83,32 +83,47 @@ def _combine_summaries(summaries: List[Dict[str, Any]]):
|
|
83
83
|
)
|
84
84
|
|
85
85
|
|
86
|
-
def
|
87
|
-
|
86
|
+
def _get_input_id(v):
|
87
|
+
if isinstance(v, str):
|
88
|
+
return v # If v is a string, return it as is.
|
89
|
+
elif isinstance(v, list) and all(hasattr(item, "input_id") for item in v):
|
90
|
+
# If v is a list and all items have an input_id attribute, join their input_id values.
|
91
|
+
return ", ".join(item.input_id for item in v)
|
92
|
+
elif hasattr(v, "input_id"):
|
93
|
+
return v.input_id # If v has an input_id attribute, return it.
|
94
|
+
return str(v) # Otherwise, return the string representation of v.
|
95
|
+
|
96
|
+
|
97
|
+
def _update_plotly_titles(figures, input_group, title_template):
|
98
|
+
for figure in figures:
|
99
|
+
|
100
|
+
current_title = figure.figure.layout.title.text
|
101
|
+
|
102
|
+
input_description = " and ".join(
|
103
|
+
f"{key}: {_get_input_id(value)}" for key, value in input_group.items()
|
104
|
+
)
|
88
105
|
|
89
|
-
for i, figure in enumerate(figures):
|
90
106
|
figure.figure.layout.title.text = title_template.format(
|
91
107
|
current_title=f"{current_title} " if current_title else "",
|
92
|
-
input_description=
|
93
|
-
f"{k}: {v if isinstance(v, str) else ', '.join(item.input_id for item in v) if isinstance(v, list) and all(hasattr(item, 'input_id') for item in v) else v.input_id}"
|
94
|
-
for k, v in input_groups[i].items()
|
95
|
-
),
|
108
|
+
input_description=input_description,
|
96
109
|
)
|
97
110
|
|
98
111
|
|
99
|
-
def _update_matplotlib_titles(figures,
|
100
|
-
|
101
|
-
|
102
|
-
|
112
|
+
def _update_matplotlib_titles(figures, input_group, title_template):
|
113
|
+
for figure in figures:
|
114
|
+
|
115
|
+
current_title = (
|
116
|
+
figure.figure._suptitle.get_text() if figure.figure._suptitle else ""
|
117
|
+
)
|
118
|
+
|
119
|
+
input_description = " and ".join(
|
120
|
+
f"{key}: {_get_input_id(value)}" for key, value in input_group.items()
|
121
|
+
)
|
103
122
|
|
104
|
-
for i, figure in enumerate(figures):
|
105
123
|
figure.figure.suptitle(
|
106
124
|
title_template.format(
|
107
125
|
current_title=f"{current_title} " if current_title else "",
|
108
|
-
input_description=
|
109
|
-
f"{k}: {v if isinstance(v, str) else ', '.join(item.input_id for item in v) if isinstance(v, list) and all(hasattr(item, 'input_id') for item in v) else v.input_id}"
|
110
|
-
for k, v in input_groups[i].items()
|
111
|
-
),
|
126
|
+
input_description=input_description,
|
112
127
|
)
|
113
128
|
)
|
114
129
|
|
@@ -120,11 +135,12 @@ def _combine_figures(figure_lists: List[List[Any]], input_groups: List[Dict[str,
|
|
120
135
|
|
121
136
|
title_template = "{current_title}({input_description})"
|
122
137
|
|
123
|
-
for figures in
|
138
|
+
for idx, figures in enumerate(figure_lists):
|
139
|
+
input_group = input_groups[idx]
|
124
140
|
if is_plotly_figure(figures[0].figure):
|
125
|
-
_update_plotly_titles(figures,
|
141
|
+
_update_plotly_titles(figures, input_group, title_template)
|
126
142
|
elif is_matplotlib_figure(figures[0].figure):
|
127
|
-
_update_matplotlib_titles(figures,
|
143
|
+
_update_matplotlib_titles(figures, input_group, title_template)
|
128
144
|
else:
|
129
145
|
logger.warning("Cannot properly annotate png figures")
|
130
146
|
|
@@ -2,7 +2,9 @@
|
|
2
2
|
# See the LICENSE file in the root of this repository for details.
|
3
3
|
# SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial
|
4
4
|
|
5
|
+
from numpy import unique
|
5
6
|
from sklearn.metrics import roc_auc_score
|
7
|
+
from sklearn.preprocessing import LabelBinarizer
|
6
8
|
|
7
9
|
from validmind import tags, tasks
|
8
10
|
|
@@ -10,4 +12,23 @@ from validmind import tags, tasks
|
|
10
12
|
@tags("classification", "sklearn", "unit_metric")
|
11
13
|
@tasks("classification")
|
12
14
|
def ROC_AUC(model, dataset, **kwargs):
|
13
|
-
|
15
|
+
|
16
|
+
y_true = dataset.y
|
17
|
+
|
18
|
+
if len(unique(y_true)) > 2:
|
19
|
+
y_pred = dataset.y_pred(model)
|
20
|
+
y_true = y_true.astype(y_pred.dtype)
|
21
|
+
roc_auc = _multiclass_roc_auc_score(y_true, y_pred, **kwargs)
|
22
|
+
else:
|
23
|
+
y_prob = dataset.y_prob(model)
|
24
|
+
y_true = y_true.astype(y_prob.dtype).flatten()
|
25
|
+
roc_auc = roc_auc_score(y_true, y_prob, **kwargs)
|
26
|
+
|
27
|
+
return roc_auc
|
28
|
+
|
29
|
+
|
30
|
+
def _multiclass_roc_auc_score(y_test, y_pred, average="macro"):
|
31
|
+
lb = LabelBinarizer()
|
32
|
+
lb.fit(y_test)
|
33
|
+
|
34
|
+
return roc_auc_score(lb.transform(y_test), lb.transform(y_pred), average=average)
|
validmind/utils.py
CHANGED
@@ -364,7 +364,7 @@ def get_model_info(model):
|
|
364
364
|
if language is None:
|
365
365
|
language = f"Python {python_version()}"
|
366
366
|
|
367
|
-
if framework_version is None:
|
367
|
+
if framework_version == "N/A" or framework_version is None:
|
368
368
|
try:
|
369
369
|
framework_version = sys.modules[framework].__version__
|
370
370
|
except (KeyError, AttributeError):
|
validmind/vm_models/__init__.py
CHANGED
@@ -8,6 +8,7 @@ Models entrypoint
|
|
8
8
|
|
9
9
|
from .dataset.dataset import VMDataset
|
10
10
|
from .figure import Figure
|
11
|
+
from .input import VMInput
|
11
12
|
from .model import R_MODEL_TYPES, ModelAttributes, VMModel
|
12
13
|
from .test.metric import Metric
|
13
14
|
from .test.metric_result import MetricResult
|
@@ -20,6 +21,7 @@ from .test_suite.runner import TestSuiteRunner
|
|
20
21
|
from .test_suite.test_suite import TestSuite
|
21
22
|
|
22
23
|
__all__ = [
|
24
|
+
"VMInput",
|
23
25
|
"VMDataset",
|
24
26
|
"VMModel",
|
25
27
|
"Figure",
|
@@ -7,6 +7,7 @@ Dataset class wrapper
|
|
7
7
|
"""
|
8
8
|
|
9
9
|
import warnings
|
10
|
+
from copy import deepcopy
|
10
11
|
|
11
12
|
import numpy as np
|
12
13
|
import pandas as pd
|
@@ -14,6 +15,7 @@ import polars as pl
|
|
14
15
|
|
15
16
|
from validmind.logging import get_logger
|
16
17
|
from validmind.models import FunctionModel, PipelineModel
|
18
|
+
from validmind.vm_models.input import VMInput
|
17
19
|
from validmind.vm_models.model import VMModel
|
18
20
|
|
19
21
|
from .utils import ExtraColumns, as_df, compute_predictions, convert_index_to_datetime
|
@@ -21,7 +23,7 @@ from .utils import ExtraColumns, as_df, compute_predictions, convert_index_to_da
|
|
21
23
|
logger = get_logger(__name__)
|
22
24
|
|
23
25
|
|
24
|
-
class VMDataset:
|
26
|
+
class VMDataset(VMInput):
|
25
27
|
"""Base class for VM datasets
|
26
28
|
|
27
29
|
Child classes should be used to support new dataset types (tensor, polars etc)
|
@@ -60,7 +62,6 @@ class VMDataset:
|
|
60
62
|
text_column: str = None,
|
61
63
|
extra_columns: dict = None,
|
62
64
|
target_class_labels: dict = None,
|
63
|
-
options: dict = None,
|
64
65
|
):
|
65
66
|
"""
|
66
67
|
Initializes a VMDataset instance.
|
@@ -77,7 +78,6 @@ class VMDataset:
|
|
77
78
|
feature_columns (str, optional): The feature column names of the dataset. Defaults to None.
|
78
79
|
text_column (str, optional): The text column name of the dataset for nlp tasks. Defaults to None.
|
79
80
|
target_class_labels (Dict, optional): The class labels for the target columns. Defaults to None.
|
80
|
-
options (Dict, optional): Additional options for the dataset. Defaults to None.
|
81
81
|
"""
|
82
82
|
# initialize input_id
|
83
83
|
self.input_id = input_id
|
@@ -101,8 +101,6 @@ class VMDataset:
|
|
101
101
|
if date_time_index:
|
102
102
|
self._df = convert_index_to_datetime(self._df)
|
103
103
|
|
104
|
-
self.options = options
|
105
|
-
|
106
104
|
self.columns = columns or []
|
107
105
|
self.column_aliases = {}
|
108
106
|
self.target_column = target_column
|
@@ -199,6 +197,56 @@ class VMDataset:
|
|
199
197
|
"Cannot use precomputed probabilities without precomputed predictions"
|
200
198
|
)
|
201
199
|
|
200
|
+
def with_options(self, **kwargs) -> "VMDataset":
|
201
|
+
"""Support options provided when passing an input to run_test or run_test_suite
|
202
|
+
|
203
|
+
Example:
|
204
|
+
```python
|
205
|
+
# to only use a certain subset of columns in the dataset:
|
206
|
+
run_test(
|
207
|
+
"validmind.SomeTestID",
|
208
|
+
inputs={
|
209
|
+
"dataset": {
|
210
|
+
"input_id": "my_dataset_id",
|
211
|
+
"columns": ["col1", "col2"],
|
212
|
+
}
|
213
|
+
}
|
214
|
+
)
|
215
|
+
|
216
|
+
# behind the scenes, this retrieves the dataset object (VMDataset) from the registry
|
217
|
+
# and then calls the `with_options()` method and passes `{"columns": ...}`
|
218
|
+
```
|
219
|
+
|
220
|
+
Args:
|
221
|
+
**kwargs: Options:
|
222
|
+
- columns: Filter columns in the dataset
|
223
|
+
|
224
|
+
Returns:
|
225
|
+
VMDataset: A new instance of the dataset with only the specified columns
|
226
|
+
"""
|
227
|
+
if "columns" in kwargs:
|
228
|
+
# filter columns (create a temp copy of self with only specified columns)
|
229
|
+
# TODO: need a more robust mechanism for this as we expand on this feature
|
230
|
+
columns = kwargs.pop("columns")
|
231
|
+
|
232
|
+
new = deepcopy(self)
|
233
|
+
|
234
|
+
new._set_feature_columns(
|
235
|
+
[col for col in new.feature_columns if col in columns]
|
236
|
+
)
|
237
|
+
new.text_column = new.text_column if new.text_column in columns else None
|
238
|
+
new.target_column = (
|
239
|
+
new.target_column if new.target_column in columns else None
|
240
|
+
)
|
241
|
+
new.extra_columns.extras = new.extra_columns.extras.intersection(columns)
|
242
|
+
|
243
|
+
return new
|
244
|
+
|
245
|
+
if kwargs:
|
246
|
+
raise NotImplementedError(
|
247
|
+
f"Options {kwargs} are not supported for this input"
|
248
|
+
)
|
249
|
+
|
202
250
|
def assign_predictions(
|
203
251
|
self,
|
204
252
|
model: VMModel,
|
@@ -345,7 +393,8 @@ class VMDataset:
|
|
345
393
|
assert self.target_column not in columns
|
346
394
|
columns.append(self.target_column)
|
347
395
|
|
348
|
-
return
|
396
|
+
# return a copy to prevent accidental modification
|
397
|
+
return as_df(self._df[columns]).copy()
|
349
398
|
|
350
399
|
@property
|
351
400
|
def x(self) -> np.ndarray:
|
@@ -444,7 +493,6 @@ class DataFrameDataset(VMDataset):
|
|
444
493
|
feature_columns: list = None,
|
445
494
|
text_column: str = None,
|
446
495
|
target_class_labels: dict = None,
|
447
|
-
options: dict = None,
|
448
496
|
date_time_index: bool = False,
|
449
497
|
):
|
450
498
|
"""
|
@@ -459,7 +507,6 @@ class DataFrameDataset(VMDataset):
|
|
459
507
|
feature_columns (list, optional): The feature columns of the dataset. Defaults to None.
|
460
508
|
text_column (str, optional): The text column name of the dataset for NLP tasks. Defaults to None.
|
461
509
|
target_class_labels (dict, optional): The class labels for the target columns. Defaults to None.
|
462
|
-
options (dict, optional): Additional options for the dataset. Defaults to None.
|
463
510
|
date_time_index (bool, optional): Whether to use date-time index. Defaults to False.
|
464
511
|
"""
|
465
512
|
index = None
|
@@ -478,7 +525,6 @@ class DataFrameDataset(VMDataset):
|
|
478
525
|
feature_columns=feature_columns,
|
479
526
|
text_column=text_column,
|
480
527
|
target_class_labels=target_class_labels,
|
481
|
-
options=options,
|
482
528
|
date_time_index=date_time_index,
|
483
529
|
)
|
484
530
|
|
@@ -498,7 +544,6 @@ class PolarsDataset(VMDataset):
|
|
498
544
|
feature_columns: list = None,
|
499
545
|
text_column: str = None,
|
500
546
|
target_class_labels: dict = None,
|
501
|
-
options: dict = None,
|
502
547
|
date_time_index: bool = False,
|
503
548
|
):
|
504
549
|
"""
|
@@ -513,7 +558,6 @@ class PolarsDataset(VMDataset):
|
|
513
558
|
feature_columns (list, optional): The feature columns of the dataset. Defaults to None.
|
514
559
|
text_column (str, optional): The text column name of the dataset for NLP tasks. Defaults to None.
|
515
560
|
target_class_labels (dict, optional): The class labels for the target columns. Defaults to None.
|
516
|
-
options (dict, optional): Additional options for the dataset. Defaults to None.
|
517
561
|
date_time_index (bool, optional): Whether to use date-time index. Defaults to False.
|
518
562
|
"""
|
519
563
|
super().__init__(
|
@@ -528,7 +572,6 @@ class PolarsDataset(VMDataset):
|
|
528
572
|
feature_columns=feature_columns,
|
529
573
|
text_column=text_column,
|
530
574
|
target_class_labels=target_class_labels,
|
531
|
-
options=options,
|
532
575
|
date_time_index=date_time_index,
|
533
576
|
)
|
534
577
|
|
@@ -551,7 +594,6 @@ class TorchDataset(VMDataset):
|
|
551
594
|
feature_columns: list = None,
|
552
595
|
text_column: str = None,
|
553
596
|
target_class_labels: dict = None,
|
554
|
-
options: dict = None,
|
555
597
|
):
|
556
598
|
"""
|
557
599
|
Initializes a TorchDataset instance.
|
@@ -609,5 +651,4 @@ class TorchDataset(VMDataset):
|
|
609
651
|
text_column=text_column,
|
610
652
|
extra_columns=extra_columns,
|
611
653
|
target_class_labels=target_class_labels,
|
612
|
-
options=options,
|
613
654
|
)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Copyright © 2023-2024 ValidMind Inc. All rights reserved.
|
2
|
+
# See the LICENSE file in the root of this repository for details.
|
3
|
+
# SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial
|
4
|
+
|
5
|
+
"""Base class for ValidMind Input types"""
|
6
|
+
|
7
|
+
from abc import ABC
|
8
|
+
|
9
|
+
|
10
|
+
class VMInput(ABC):
|
11
|
+
"""
|
12
|
+
Base class for ValidMind Input types
|
13
|
+
"""
|
14
|
+
|
15
|
+
def with_options(self, **kwargs) -> "VMInput":
|
16
|
+
"""
|
17
|
+
Allows for setting options on the input object that are passed by the user
|
18
|
+
when using the input to run a test or set of tests
|
19
|
+
|
20
|
+
To allow options, just override this method in the subclass (see VMDataset)
|
21
|
+
and ensure that it returns a new instance of the input with the specified options
|
22
|
+
set.
|
23
|
+
|
24
|
+
Args:
|
25
|
+
**kwargs: Arbitrary keyword arguments that will be passed to the input object
|
26
|
+
|
27
|
+
Returns:
|
28
|
+
VMInput: A new instance of the input with the specified options set
|
29
|
+
"""
|
30
|
+
if kwargs:
|
31
|
+
raise NotImplementedError("This type of input does not support options")
|
validmind/vm_models/model.py
CHANGED
@@ -7,11 +7,13 @@ Model class wrapper module
|
|
7
7
|
"""
|
8
8
|
import importlib
|
9
9
|
import inspect
|
10
|
-
from abc import
|
10
|
+
from abc import abstractmethod
|
11
11
|
from dataclasses import dataclass
|
12
12
|
|
13
13
|
from validmind.errors import MissingOrInvalidModelPredictFnError
|
14
14
|
|
15
|
+
from .input import VMInput
|
16
|
+
|
15
17
|
SUPPORTED_LIBRARIES = {
|
16
18
|
"catboost": "CatBoostModel",
|
17
19
|
"xgboost": "XGBoostModel",
|
@@ -77,7 +79,7 @@ class ModelAttributes:
|
|
77
79
|
)
|
78
80
|
|
79
81
|
|
80
|
-
class VMModel(
|
82
|
+
class VMModel(VMInput):
|
81
83
|
"""
|
82
84
|
An base class that wraps a trained model instance and its associated data.
|
83
85
|
|
@@ -78,13 +78,12 @@ class TestInput:
|
|
78
78
|
... (any): Any other arbitrary inputs that can be used by tests
|
79
79
|
"""
|
80
80
|
|
81
|
-
# TODO: we need to look into adding metadata for test inputs and logging that
|
82
|
-
|
83
81
|
def __init__(self, inputs):
|
84
82
|
"""Initialize with either a dictionary of inputs"""
|
85
83
|
for key, value in inputs.items():
|
86
84
|
# 1) retrieve input object from input registry if an input_id string is provided
|
87
85
|
# 2) check the input_id type if a list of inputs (mix of strings and objects) is provided
|
86
|
+
# 3) if its a dict, it should contain the `input_id` key as well as other options
|
88
87
|
if isinstance(value, str):
|
89
88
|
value = input_registry.get(key=value)
|
90
89
|
elif isinstance(value, list) or isinstance(value, tuple):
|
@@ -92,6 +91,14 @@ class TestInput:
|
|
92
91
|
input_registry.get(key=v) if isinstance(v, str) else v
|
93
92
|
for v in value
|
94
93
|
]
|
94
|
+
elif isinstance(value, dict):
|
95
|
+
assert "input_id" in value, (
|
96
|
+
"Input dictionary must contain an 'input_id' key "
|
97
|
+
"to retrieve the input object from the input registry."
|
98
|
+
)
|
99
|
+
value = input_registry.get(key=value.get("input_id")).with_options(
|
100
|
+
**{k: v for k, v in value.items() if k != "input_id"}
|
101
|
+
)
|
95
102
|
|
96
103
|
setattr(self, key, value)
|
97
104
|
|
@@ -1,9 +1,9 @@
|
|
1
1
|
validmind/__init__.py,sha256=UfmzPwUCdUWbWq3zPqqmq4jw0_kfl3hX4U72p_seE4I,3700
|
2
|
-
validmind/__version__.py,sha256
|
2
|
+
validmind/__version__.py,sha256=PfQ9ThOuZlUZhThya-_PpR02LjazRR6LNSivpta03mM,22
|
3
3
|
validmind/ai/test_descriptions.py,sha256=Q1Ftus4x5eiVLKWJu7hqPLukBQZzhy-dARqq_6_JWtk,9464
|
4
4
|
validmind/ai/utils.py,sha256=TEXII_S5CpkpczzSyHwTlqLcPMLnPBJWEBR6QFMKh1U,3421
|
5
|
-
validmind/api_client.py,sha256=
|
6
|
-
validmind/client.py,sha256=
|
5
|
+
validmind/api_client.py,sha256=JZIJWuYtvl-VEVi_AK4c839Fn7cGa40J2d4_4FUZcno,17483
|
6
|
+
validmind/client.py,sha256=guXu_9um4caPpepbAsfKgjLc63Ygx07Lgp8wZJD3p6Y,18653
|
7
7
|
validmind/client_config.py,sha256=58L6s6-9vFWC9vkSs_98CjV1YWmlksdhblJtPQxQsAk,1611
|
8
8
|
validmind/datasets/__init__.py,sha256=oYfcvW7BAyUgpghBOnTeGbQF6tpFAWg38rRirdLr8m8,262
|
9
9
|
validmind/datasets/classification/__init__.py,sha256=HlTOBLyb6IorRYmAhP3AIyX-l-NyemyDjV8BBOdrCrY,1787
|
@@ -60,7 +60,7 @@ validmind/datasets/regression/models/fred_loan_rates_model_5.pkl,sha256=FkNLHq9x
|
|
60
60
|
validmind/errors.py,sha256=qy7Gp6Uom5J6WmLw-CpE5zaTN96SiN7kJjDGBaJdoxY,8023
|
61
61
|
validmind/html_templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
62
62
|
validmind/html_templates/content_blocks.py,sha256=LTsv2Hr_drUUZVLEfY2JcT4z0M-45RGYy2sFInt1VKY,3998
|
63
|
-
validmind/input_registry.py,sha256=
|
63
|
+
validmind/input_registry.py,sha256=8C_mrhgLT72hwbt_lo3ZwXb5NCyIcSuCQI1HdJ3bK2A,1042
|
64
64
|
validmind/logging.py,sha256=J1Y1dYCH1dtkoYCHoXMOQH_B7EO4fJytWRDrDqZZz8U,5204
|
65
65
|
validmind/models/__init__.py,sha256=lraTbNwoKckXNP3Dbyj-euI78UTkZ_w5wpUOb8l5nWs,729
|
66
66
|
validmind/models/foundation.py,sha256=ZdVmwwRVbjgqMyfjguyf9Lka_KcgJnDD7ho8zv0gQok,1842
|
@@ -86,7 +86,7 @@ validmind/test_suites/tabular_datasets.py,sha256=WE4eLzRCfiqAxRqXnZFRR3Lo_u-TI6K
|
|
86
86
|
validmind/test_suites/text_data.py,sha256=YGVGBB05356jN9Gzcy5CHShRzo1fm5mKsZY7YBq0cYU,739
|
87
87
|
validmind/test_suites/time_series.py,sha256=msUyYySAe5VHJJp6z0k0cNt2ekMB8-XkxGER75Zs1hs,6724
|
88
88
|
validmind/tests/__init__.py,sha256=niYvgTHmjS5E42mJMCrzq1vP8PTKCWxVsqSkAaw2wsE,1036
|
89
|
-
validmind/tests/__types__.py,sha256=
|
89
|
+
validmind/tests/__types__.py,sha256=AaPsQrxikIasGshJN5AmKCTzLaZ9d4QBDT1c0Br2sDE,10142
|
90
90
|
validmind/tests/_store.py,sha256=G604L9g-XIJz8u7BLbHVVVcbx96tDYjAAciaF7wJoiM,2743
|
91
91
|
validmind/tests/data_validation/ACFandPACFPlot.py,sha256=NLoLe-9Z6_41RBee-gRYe4u3kaGojF7ujlyyIk4o3BU,4900
|
92
92
|
validmind/tests/data_validation/ADF.py,sha256=36ZdB8L-hgN0EnYlcxeSsQ3luWip8Qfz_nrYV-1lr74,5113
|
@@ -101,7 +101,7 @@ validmind/tests/data_validation/BivariateScatterPlots.py,sha256=9QcMcbc3yiZl8LbV
|
|
101
101
|
validmind/tests/data_validation/ChiSquaredFeaturesTable.py,sha256=5lPRnNbHjxEdMGtp6fhg4cYy7FLSHbHxUtpymU8GRO0,5977
|
102
102
|
validmind/tests/data_validation/ClassImbalance.py,sha256=nRNHDtjCAgLQfWbCWP-zX5CFZSjJno8NWLXZBPaG_yA,6882
|
103
103
|
validmind/tests/data_validation/DFGLSArch.py,sha256=D6_kR4AkvctjK-MRUJCc9cELwdmTT_085QIGagliSsA,5365
|
104
|
-
validmind/tests/data_validation/DatasetDescription.py,sha256
|
104
|
+
validmind/tests/data_validation/DatasetDescription.py,sha256=-V8pO260iRs1QzJfJFAP_YwayBQcCwYD_X51NZoLBXA,11366
|
105
105
|
validmind/tests/data_validation/DatasetSplit.py,sha256=4BCeshqxvNSwmRwXw37uIJ3xy8JnU7ZJIWPyzzTdLJ0,5068
|
106
106
|
validmind/tests/data_validation/DescriptiveStatistics.py,sha256=5u1qx-VGD8aVBFEi_4ffCWZfJ17YXbT5PO1Na52KoNo,6333
|
107
107
|
validmind/tests/data_validation/Duplicates.py,sha256=oO1LPMyclfJno1_AAITpKB-fZryU-705BvYCm5StClw,5592
|
@@ -202,9 +202,9 @@ validmind/tests/model_validation/ragas/Faithfulness.py,sha256=89EeM0lrUq5MAhKYhO
|
|
202
202
|
validmind/tests/model_validation/ragas/utils.py,sha256=zh9_pGitutGBS4Tvk3Bw1D-QVnDueggNErAhAvMPUOA,3130
|
203
203
|
validmind/tests/model_validation/sklearn/AdjustedMutualInformation.py,sha256=KhQroHKDG4gpRAoD9Clw65qNslwGS93rTETdZTOqoTk,2840
|
204
204
|
validmind/tests/model_validation/sklearn/AdjustedRandIndex.py,sha256=nSs1BGC8MSWWp7T6M0FZR5kNPraiZwRJF7U6LNCoMMM,2715
|
205
|
-
validmind/tests/model_validation/sklearn/ClassifierPerformance.py,sha256=
|
205
|
+
validmind/tests/model_validation/sklearn/ClassifierPerformance.py,sha256=dgfi8vD4WQraMLpBHXa7DVMFCNmHDfJk1tstsxWyXfQ,6217
|
206
206
|
validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.py,sha256=9B8WqGcOL29CVd1ZI6vw0rpUTCW2Jk_lFKzSnHYq9qs,5433
|
207
|
-
validmind/tests/model_validation/sklearn/ClusterPerformance.py,sha256=
|
207
|
+
validmind/tests/model_validation/sklearn/ClusterPerformance.py,sha256=uuso3wUL_urNJnIuEiGnldMltv8YkCb3lSzWVaxdoVc,5310
|
208
208
|
validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py,sha256=lPQb8B5LWBlNgdSmS8CD8WZTwu-Iye3TIkU0A7uVlWk,8525
|
209
209
|
validmind/tests/model_validation/sklearn/CompletenessScore.py,sha256=3cE4Wvwx_tpCADvr_nDm04CQkgtvvgq3EUwdBPI4YR8,2507
|
210
210
|
validmind/tests/model_validation/sklearn/ConfusionMatrix.py,sha256=wdEr8KopFOgbYGHKzCgP1jN0zkZ_AVLclxLneGrRyjA,6065
|
@@ -215,19 +215,19 @@ validmind/tests/model_validation/sklearn/HyperParametersTuning.py,sha256=5a4K15U
|
|
215
215
|
validmind/tests/model_validation/sklearn/KMeansClustersOptimization.py,sha256=lmSktn7usYZt-2v8Ykrig-9vEM910AfUdRkyOrsZd3U,5906
|
216
216
|
validmind/tests/model_validation/sklearn/MinimumAccuracy.py,sha256=5KSAd29dbKs3nNJ734t1j806Td3H5LRIw950g3Xp2nc,5277
|
217
217
|
validmind/tests/model_validation/sklearn/MinimumF1Score.py,sha256=TaLHk98CwQigyt17L1uBBLC25D5J_IKb6a_IFJFO7AE,4618
|
218
|
-
validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py,sha256=
|
218
|
+
validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py,sha256=Z5JZ4edtzuyneI8qSmGv-OKL2PVq5dg44CwSmePz3OU,5102
|
219
219
|
validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.py,sha256=-fGgddsc_0832zTl_gRRsLx2sZWBPB0FdS5YmbluN8s,6132
|
220
|
-
validmind/tests/model_validation/sklearn/OverfitDiagnosis.py,sha256=
|
220
|
+
validmind/tests/model_validation/sklearn/OverfitDiagnosis.py,sha256=1nei-MIF7utxuPJXnhTKIaLugUsxk1s4cFob1CR08Yg,13444
|
221
221
|
validmind/tests/model_validation/sklearn/PermutationFeatureImportance.py,sha256=CqMuBuNWzzTtzVcmhAlJHPmtyDO5YuaoXk5hhIXmRuY,4926
|
222
222
|
validmind/tests/model_validation/sklearn/PopulationStabilityIndex.py,sha256=chYVS4OcvSG3YA91N7VDJ4Lh7EDgNEcUM8_k72s13IM,10072
|
223
|
-
validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py,sha256=
|
223
|
+
validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py,sha256=V0SS06u8DsyaJpL0S14HBPAQwJJYXnvP3fNp2P4CT84,4363
|
224
224
|
validmind/tests/model_validation/sklearn/ROCCurve.py,sha256=f_NQtE2n5LLmAMWnA2io5kaIGI6MEn539GilBd5tjIo,5827
|
225
225
|
validmind/tests/model_validation/sklearn/RegressionErrors.py,sha256=iV9FjYEIzJS0I59imvRe7JC9KcBhm08bjeRSiCnE09Y,5924
|
226
226
|
validmind/tests/model_validation/sklearn/RegressionErrorsComparison.py,sha256=CHfdcRx6ZqvfkfZVy7HNgOUjZp-KepPS5rs2al19OyQ,3160
|
227
227
|
validmind/tests/model_validation/sklearn/RegressionModelsPerformanceComparison.py,sha256=ELYhY_My1YqS4_i2fnHgL5Dg7vKUIa0wska0bkAFkuU,5737
|
228
228
|
validmind/tests/model_validation/sklearn/RegressionR2Square.py,sha256=Ojm5sz3re4rk17u7xiezn1P_rp7wcA3etKgzdhGYH-s,4906
|
229
229
|
validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.py,sha256=tGJKpfeTvU2xBxsYbQSC5GPDcCS2_j0FcT3uceXZduI,2761
|
230
|
-
validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py,sha256=
|
230
|
+
validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py,sha256=ntzu5W4JF6pM8YXwtWVnQHx8zGaZMYSTlQlD38XpCUo,13366
|
231
231
|
validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py,sha256=ECYjHHIz5kfnLi2XlzWOKquRf23_77kdcPK8Xw2qwQk,8887
|
232
232
|
validmind/tests/model_validation/sklearn/SilhouettePlot.py,sha256=6PZ_sqiPBpL4_fyRE_sg0bSWWrDkryh_v-88KK4i3RQ,6185
|
233
233
|
validmind/tests/model_validation/sklearn/TrainingTestDegradation.py,sha256=K3F8Ev7nIaIjwLHC9ljnMp07YwZeqo4RLui5C6IDuR8,7209
|
@@ -257,6 +257,10 @@ validmind/tests/model_validation/statsmodels/ScorecardHistogram.py,sha256=tjImbx
|
|
257
257
|
validmind/tests/model_validation/statsmodels/ShapiroWilk.py,sha256=DfJXa0kb_ak2awlH6uorkOYcQPk56vI6QqwqEopKN18,3248
|
258
258
|
validmind/tests/model_validation/statsmodels/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
259
259
|
validmind/tests/model_validation/statsmodels/statsutils.py,sha256=s1J7lHJ4kAcp_gGI0LAsaIFxbSqPrqXanxgtDI_Kig0,495
|
260
|
+
validmind/tests/ongoing_monitoring/FeatureDrift.py,sha256=-83GOCa1sBMFd0tpL62mgVup832CH-cJBaLYNXY9VLw,6143
|
261
|
+
validmind/tests/ongoing_monitoring/PredictionAcrossEachFeature.py,sha256=oyiIGjVpvlcwRCDr4ohjj2jHZEqL8sigOhnsCcK3AWc,3336
|
262
|
+
validmind/tests/ongoing_monitoring/PredictionCorrelation.py,sha256=ve-7P3dXWNE_Vp3Z20q03XetRVFpUMBNMyq3VVMXqSY,3347
|
263
|
+
validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py,sha256=A4NfE9WgfSJVtljX3RPh3jkwcQBbQ9-LvFNhArqB31I,2384
|
260
264
|
validmind/tests/prompt_validation/Bias.py,sha256=NFNkym5arkYJ_7XndMvX_UDPLF3JhRnDCX9L_6OKcm8,7012
|
261
265
|
validmind/tests/prompt_validation/Clarity.py,sha256=4pVWyvmAoZlL8Kq-4m3I7866YQkITndJGW9nFGLxRS8,6208
|
262
266
|
validmind/tests/prompt_validation/Conciseness.py,sha256=6BmAggzrWP1UqRMcpbFUgvdnbxpRuL6Ro-Q8Y9xn1JA,5956
|
@@ -266,14 +270,14 @@ validmind/tests/prompt_validation/Robustness.py,sha256=fBdkYnO9yoBazz4wD-l62tT8D
|
|
266
270
|
validmind/tests/prompt_validation/Specificity.py,sha256=h3gKRTTi2rfnGWmGC1YnSt2s_VbZU4KX0iY7LciZ3PU,6068
|
267
271
|
validmind/tests/prompt_validation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
268
272
|
validmind/tests/prompt_validation/ai_powered_test.py,sha256=7TTeIR5GotQosm7oVT8Y3KnwPB3XkVT1Fzhckpr-SgE,1963
|
269
|
-
validmind/tests/run.py,sha256=
|
273
|
+
validmind/tests/run.py,sha256=WuLV8iY2xN7bRPu5px75-rgRKeh_XYPtbdLhqG8Dugo,15874
|
270
274
|
validmind/tests/test_providers.py,sha256=47xe5eb5ufvj1jmhdRsbSvDQTXSDpFDFNeXg3xtXwhw,5320
|
271
275
|
validmind/tests/utils.py,sha256=kNrxfUYbj4DwmkZtpp_1rG4GMUGxYEhvqnYR_A7qAKM,471
|
272
|
-
validmind/unit_metrics/__init__.py,sha256=
|
276
|
+
validmind/unit_metrics/__init__.py,sha256=mFk52eU7bOQKTpruKSrPyzjmxFUpIi5RZuwIE5BVFHU,7345
|
273
277
|
validmind/unit_metrics/classification/sklearn/Accuracy.py,sha256=2Ra_OpKceY01h1dAFCqRFAwe--K2oVbCUiYjM5AH_nQ,480
|
274
278
|
validmind/unit_metrics/classification/sklearn/F1.py,sha256=Uiq5sPyNpALhApTkmLUhh76mF91bLCABB5OVHOlbmGo,437
|
275
279
|
validmind/unit_metrics/classification/sklearn/Precision.py,sha256=8zO5VDZhfT8R2VFYiV-CzsZwhsTwVAKca4nhD-qALLw,458
|
276
|
-
validmind/unit_metrics/classification/sklearn/ROC_AUC.py,sha256=
|
280
|
+
validmind/unit_metrics/classification/sklearn/ROC_AUC.py,sha256=faDV8uxcohG38WrAWrDB1WSrzFDfcvD6I4uG9Az6W_E,1048
|
277
281
|
validmind/unit_metrics/classification/sklearn/Recall.py,sha256=0WG3A6K9M1UmbWQKoS_wwLfq-cXVDDTIA1ZpaJNyKp8,449
|
278
282
|
validmind/unit_metrics/composite.py,sha256=EJiSucxFkNyrl1JhrVTxmfOFsYL5TvJwe4fNiVNgTFo,8158
|
279
283
|
validmind/unit_metrics/regression/GiniCoefficient.py,sha256=ebh1rOob8mEmQp0EpXcneAXjc4AIfm6O3Y0_mnTahKA,984
|
@@ -287,13 +291,14 @@ validmind/unit_metrics/regression/sklearn/MeanAbsoluteError.py,sha256=LCNgpDw6FB
|
|
287
291
|
validmind/unit_metrics/regression/sklearn/MeanSquaredError.py,sha256=7UQnDTTO7yRRyMe3Zac9ZyjEbbD8pW_8WnZwHdVB_8U,463
|
288
292
|
validmind/unit_metrics/regression/sklearn/RSquaredScore.py,sha256=h9U5ndtnJfNNtKPZIo5n3KRp-m4akQcEo0t1iSwjVzY,420
|
289
293
|
validmind/unit_metrics/regression/sklearn/RootMeanSquaredError.py,sha256=_5IQIU9jNfmTE4NLJvaRWXbudRGV2PS7nYF5e4fkSMY,556
|
290
|
-
validmind/utils.py,sha256=
|
291
|
-
validmind/vm_models/__init__.py,sha256=
|
294
|
+
validmind/utils.py,sha256=DYUB3nig6MJwct5dymhy7Gt9apwzPVipKAWxSrm0-tg,15849
|
295
|
+
validmind/vm_models/__init__.py,sha256=V5DH-E1Rkvl-HQEkilppVCHBag9MQXkzyoORLW3LSGQ,1210
|
292
296
|
validmind/vm_models/dataset/__init__.py,sha256=U4CxZjdoc0dd9u2AqBl5PJh1UVbzXWNrmundmjLF-qE,346
|
293
|
-
validmind/vm_models/dataset/dataset.py,sha256=
|
297
|
+
validmind/vm_models/dataset/dataset.py,sha256=hBaczQjo-Jb1u6Ma5yX86m6JzT16XndAlq32WbHqVx8,25645
|
294
298
|
validmind/vm_models/dataset/utils.py,sha256=DRFCg93YE7sTRrWAGt1RIyvzPjINagMk6zUw7z692d0,5325
|
295
299
|
validmind/vm_models/figure.py,sha256=iSrvPcCG5sQrMkX1Fh6c5utRzaroh3bc6IlnGDOK_Eg,6651
|
296
|
-
validmind/vm_models/
|
300
|
+
validmind/vm_models/input.py,sha256=qLdqz_bktr4v0YcPha2vFdDvmkC-btT1pH9zBIkt1OY,1046
|
301
|
+
validmind/vm_models/model.py,sha256=P-zKbh0TrU_4ZK-bA0l83h6K6nfU6v0lIpC4mfCl6Fw,6115
|
297
302
|
validmind/vm_models/test/metric.py,sha256=DvXMju36JzxArXNWimq3SSrSUoIHkyvDbuhbgBOKxkk,3357
|
298
303
|
validmind/vm_models/test/metric_result.py,sha256=Bak4GDrMlNq5NtgP5exwlPsKZgz3tWgtC6jZqtHjvqM,1987
|
299
304
|
validmind/vm_models/test/output_template.py,sha256=njqCAMyLxwadkCWhACVskyL9-psTgmUysaeeirTVAX4,1500
|
@@ -302,13 +307,13 @@ validmind/vm_models/test/result_wrapper.py,sha256=Zb2IVjB3UTIMxTjmv9xZ1kaIIAd_dU
|
|
302
307
|
validmind/vm_models/test/test.py,sha256=2Wbte09E4l7fUXwfQije0LQbPeSuh2Wpbyt4ddwyVks,3419
|
303
308
|
validmind/vm_models/test/threshold_test.py,sha256=xSadM5t9Z-XZjkxu7LKmeljy2bdwTwXrUh-mkdePdLM,3740
|
304
309
|
validmind/vm_models/test/threshold_test_result.py,sha256=EXP-g_e3NsnpkvNgYew030qVUoY6ZTHyuuFUXaq-BuM,1954
|
305
|
-
validmind/vm_models/test_context.py,sha256=
|
310
|
+
validmind/vm_models/test_context.py,sha256=SGqoF_OeFC7Fj1jg5CPO1LOpfB7mA1FPwm61SYP8f2o,9475
|
306
311
|
validmind/vm_models/test_suite/runner.py,sha256=aewxadRfoOPH48jes2Gtb3Ju_FWFfVM_9ARIAJHD4wA,6982
|
307
312
|
validmind/vm_models/test_suite/summary.py,sha256=GQRNe2ZvvqjQN0yKmaN7ohAUjRFQIN4YYUYxfOuWN6M,4682
|
308
313
|
validmind/vm_models/test_suite/test.py,sha256=_GfbK36l98SjzgVcucmp0OKBJKqMW3neO7SqJ3EWeps,5049
|
309
314
|
validmind/vm_models/test_suite/test_suite.py,sha256=Cns2wL54v0T5Mv5_HJb3kMeaa4rtycdqT8KxK9_rWEU,6279
|
310
|
-
validmind-2.
|
311
|
-
validmind-2.
|
312
|
-
validmind-2.
|
313
|
-
validmind-2.
|
314
|
-
validmind-2.
|
315
|
+
validmind-2.5.1.dist-info/LICENSE,sha256=XonPUfwjvrC5Ombl3y-ko0Wubb1xdG_7nzvIbkZRKHw,35772
|
316
|
+
validmind-2.5.1.dist-info/METADATA,sha256=ZnwdazSYewQA2IZLaVIUQkuxmDl6yVke6kjyiSkLEJk,4250
|
317
|
+
validmind-2.5.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
318
|
+
validmind-2.5.1.dist-info/entry_points.txt,sha256=HuW7YyOv9u_OEWpViQXtv0nfoI67uieJHawKWA4Hv9A,76
|
319
|
+
validmind-2.5.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|