validmind 1.11.5__py3-none-any.whl → 1.11.6__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/client.py CHANGED
@@ -91,9 +91,7 @@ def init_model(
91
91
 
92
92
  if not Model.is_supported_model(model):
93
93
  raise ValueError(
94
- "Model type {} is not supported at the moment.".format(
95
- Model.model_class(model)
96
- )
94
+ f"Model type {Model.model_library(model)}.{Model.model_class(model)} is not supported at the moment."
97
95
  )
98
96
 
99
97
  return Model.init_vm_model(
@@ -18,6 +18,13 @@ SUPPORTED_STATSMODELS_LINK_FUNCTIONS = {
18
18
  }
19
19
 
20
20
 
21
+ def get_catboost_version():
22
+ if "catboost" in sys.modules:
23
+ return sys.modules["catboost"].__version__
24
+
25
+ return "n/a"
26
+
27
+
21
28
  def get_pytorch_version():
22
29
  if "torch" in sys.modules:
23
30
  return sys.modules["torch"].__version__
@@ -113,6 +120,12 @@ def get_info_from_model_instance(model):
113
120
  subtask = "binary"
114
121
  framework = "PyTorch"
115
122
  framework_version = get_pytorch_version()
123
+ elif model_class == "CatBoostClassifier":
124
+ architecture = "Gradient Boosting"
125
+ task = "classification"
126
+ subtask = "binary"
127
+ framework = "CatBoost"
128
+ framework_version = get_catboost_version()
116
129
  else:
117
130
  raise ValueError(f"Model class {model_class} is not supported by this test")
118
131
 
@@ -162,6 +175,8 @@ def get_params_from_model_instance(model):
162
175
  params = model.get_params()
163
176
  elif model_library == "pytorch":
164
177
  params = {}
178
+ elif model_library == "catboost":
179
+ params = model.get_all_params()
165
180
  else:
166
181
  raise ValueError(f"Model library {model_library} is not supported by this test")
167
182
 
@@ -444,8 +444,12 @@ class SHAPGlobalImportance(Metric):
444
444
  # the shap library generates a bunch of annoying warnings that we don't care about
445
445
  warnings.filterwarnings("ignore", category=UserWarning)
446
446
 
447
- # RandomForestClassifier applies here too
448
- if model_class == "XGBClassifier" or model_class == "RandomForestClassifier":
447
+ # Any tree based model can go here
448
+ if (
449
+ model_class == "XGBClassifier"
450
+ or model_class == "RandomForestClassifier"
451
+ or model_class == "CatBoostClassifier"
452
+ ):
449
453
  explainer = shap.TreeExplainer(trained_model)
450
454
  elif (
451
455
  model_class == "LogisticRegression"
@@ -485,6 +489,8 @@ class PopulationStabilityIndex(Metric):
485
489
  print(f"Skiping PSI for {model_library} models")
486
490
  return
487
491
 
488
- psi_df = _get_psi(self.model.y_train_predict, self.model.y_test_predict)
492
+ psi_df = _get_psi(
493
+ self.model.y_train_predict.copy(), self.model.y_test_predict.copy()
494
+ )
489
495
 
490
496
  return self.cache_results(metric_value=psi_df)
@@ -318,9 +318,13 @@ class OverfitDiagnosis(ThresholdTest):
318
318
  features_list = self.params["features_columns"]
319
319
 
320
320
  # Check if all elements from features_list are present in the feature columns
321
- all_present = all(elem in self.model.train_ds.get_features_columns() for elem in features_list)
321
+ all_present = all(
322
+ elem in self.model.train_ds.get_features_columns() for elem in features_list
323
+ )
322
324
  if not all_present:
323
- raise ValueError("The list of feature columns provided do not match with training dataset feature columns")
325
+ raise ValueError(
326
+ "The list of feature columns provided do not match with training dataset feature columns"
327
+ )
324
328
 
325
329
  if not isinstance(features_list, list):
326
330
  raise ValueError(
@@ -595,10 +599,14 @@ class WeakspotsDiagnosis(ThresholdTest):
595
599
  features_list = self.params["features_columns"]
596
600
 
597
601
  # Check if all elements from features_list are present in the feature columns
598
- all_present = all(elem in self.model.train_ds.get_features_columns() for elem in features_list)
602
+ all_present = all(
603
+ elem in self.model.train_ds.get_features_columns() for elem in features_list
604
+ )
599
605
  if not all_present:
600
- raise ValueError("The list of feature columns provided do not match with "
601
- + "training dataset feature columns")
606
+ raise ValueError(
607
+ "The list of feature columns provided do not match with "
608
+ + "training dataset feature columns"
609
+ )
602
610
 
603
611
  target_column = self.model.train_ds.target_column
604
612
  prediction_column = f"{target_column}_pred"
@@ -866,14 +874,20 @@ class RobustnessDiagnosis(ThresholdTest):
866
874
  features_list = self.model.train_ds.get_numeric_features_columns()
867
875
 
868
876
  # Check if all elements from features_list are present in the numerical feature columns
869
- all_present = all(elem in self.model.train_ds.get_numeric_features_columns()
870
- for elem in features_list)
877
+ all_present = all(
878
+ elem in self.model.train_ds.get_numeric_features_columns()
879
+ for elem in features_list
880
+ )
871
881
  if not all_present:
872
- raise ValueError("The list of feature columns provided do not match with training "
873
- + "dataset numerical feature columns")
882
+ raise ValueError(
883
+ "The list of feature columns provided do not match with training "
884
+ + "dataset numerical feature columns"
885
+ )
874
886
 
875
887
  # Remove target column if it exist in the list
876
- features_list = [col for col in features_list if col != self.model.train_ds.target_column]
888
+ features_list = [
889
+ col for col in features_list if col != self.model.train_ds.target_column
890
+ ]
877
891
 
878
892
  train_df = self.model.train_ds.x.copy()
879
893
  train_y_true = self.model.train_ds.y
@@ -884,7 +898,9 @@ class RobustnessDiagnosis(ThresholdTest):
884
898
  test_results = []
885
899
  test_figures = []
886
900
 
887
- results_headers = ["Perturbation Size", "Dataset Type", "Records"] + list(self.default_metrics.keys())
901
+ results_headers = ["Perturbation Size", "Dataset Type", "Records"] + list(
902
+ self.default_metrics.keys()
903
+ )
888
904
  results = {k: [] for k in results_headers}
889
905
 
890
906
  # Iterate scaling factor for the standard deviation list
@@ -920,14 +936,20 @@ class RobustnessDiagnosis(ThresholdTest):
920
936
  )
921
937
  )
922
938
 
923
- train_acc = df.loc[(df['Dataset Type'] == "Training") , 'accuracy'].values[0]
924
- test_acc = df.loc[(df['Dataset Type'] == "Test") , 'accuracy'].values[0]
925
-
926
- df["Passed"] = np.where((df['Dataset Type'] == "Training") & (df['accuracy'] >= (train_acc - accuracy_threshold)),
927
- True,
928
- np.where((df['Dataset Type'] == "Test") & (df['accuracy'] >= (test_acc - accuracy_threshold)),
929
- True,
930
- False))
939
+ train_acc = df.loc[(df["Dataset Type"] == "Training"), "accuracy"].values[0]
940
+ test_acc = df.loc[(df["Dataset Type"] == "Test"), "accuracy"].values[0]
941
+
942
+ df["Passed"] = np.where(
943
+ (df["Dataset Type"] == "Training")
944
+ & (df["accuracy"] >= (train_acc - accuracy_threshold)),
945
+ True,
946
+ np.where(
947
+ (df["Dataset Type"] == "Test")
948
+ & (df["accuracy"] >= (test_acc - accuracy_threshold)),
949
+ True,
950
+ False,
951
+ ),
952
+ )
931
953
  test_results.append(
932
954
  TestResult(
933
955
  test_name="accuracy",
@@ -936,7 +958,9 @@ class RobustnessDiagnosis(ThresholdTest):
936
958
  values=df.to_dict(),
937
959
  )
938
960
  )
939
- return self.cache_results(test_results, passed=df['Passed'].all(), figures=test_figures)
961
+ return self.cache_results(
962
+ test_results, passed=df["Passed"].all(), figures=test_figures
963
+ )
940
964
 
941
965
  def _compute_metrics(
942
966
  self,
@@ -9,6 +9,7 @@ from .dataset import Dataset
9
9
  # import torch.nn as nn
10
10
 
11
11
  SUPPORTED_MODEL_TYPES = [
12
+ "catboost.CatBoostClassifier",
12
13
  "pytorch.PyTorchModel",
13
14
  "sklearn.LogisticRegression",
14
15
  "sklearn.LinearRegression",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: validmind
3
- Version: 1.11.5
3
+ Version: 1.11.6
4
4
  Summary: ValidMind Developer Framework
5
5
  Author: Andres Rodriguez
6
6
  Author-email: andres@validmind.ai
@@ -11,6 +11,7 @@ Classifier: Programming Language :: Python :: 3.9
11
11
  Classifier: Programming Language :: Python :: 3.10
12
12
  Provides-Extra: r-support
13
13
  Requires-Dist: arch (>=5.4.0,<6.0.0)
14
+ Requires-Dist: catboost (>=1.2,<2.0)
14
15
  Requires-Dist: click (>=8.0.4,<9.0.0)
15
16
  Requires-Dist: dython (>=0.7.1,<0.8.0)
16
17
  Requires-Dist: ipython (==7.34.0)
@@ -1,6 +1,6 @@
1
1
  validmind/__init__.py,sha256=ND6a4RZrm1QFdYvDnGqhfwoXFsC762CJrUzdPdcVtp0,1443
2
2
  validmind/api_client.py,sha256=bjRsGzSJlviQVah8Dben_NHnaYcoMov06xeT2rxZiG0,11540
3
- validmind/client.py,sha256=z2bS0oyBz5pTf0II6YLy3HlIlGjXpt_QyETBqAkOmPI,9232
3
+ validmind/client.py,sha256=hUdQGgKL_aJDW_rRQufQoOGeSIroUzmy8S3xCDaKL44,9223
4
4
  validmind/data_validation/__init__.py,sha256=xytRpsfQ86fDnIZRoAO7GMVVU_TwWVMXxSCwm0mb45I,590
5
5
  validmind/data_validation/metrics.py,sha256=fLi9vkalf8Yp1MQ0HyJ7y_RbArf-NriE0-gzeXxlI3Q,44383
6
6
  validmind/data_validation/threshold_tests.py,sha256=lUW3_LKHaLg9_Npp-HViOW4cbGbPF18qtprODjQEiEw,31630
@@ -27,10 +27,10 @@ validmind/datasets/regression/models/fred_loan_rates_model_4.pkl,sha256=cSxhpcrI
27
27
  validmind/datasets/regression/models/fred_loan_rates_model_5.pkl,sha256=FkNLHq9xkPMbYks_vyMjFL371mw9SQYbP1iX9lY4Ljo,60343
28
28
  validmind/model_utils.py,sha256=DuPN2tF582ho167mfodODseJ6LIVuQOF9Xx0zv6b4Yk,10529
29
29
  validmind/model_validation/__init__.py,sha256=fYWK9BES5uKGW4yhRLtXk6L2IAytk9xkB-NFVMVK_Gk,43
30
- validmind/model_validation/model_metadata.py,sha256=Akm6jO9MJN4ybIAV9TivZ-QyuMjewF_4Pg05Y2ND0AY,6712
30
+ validmind/model_validation/model_metadata.py,sha256=r-MyR1KTg7Dnmtbw1VW18dGwDt2mDjjxzk2kqLoOfrw,7153
31
31
  validmind/model_validation/sklearn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
- validmind/model_validation/sklearn/metrics.py,sha256=JXuYlkJ72qaLzNVeGFmzlLmSQCs2pqWRwopBzcAxn-8,15135
33
- validmind/model_validation/sklearn/threshold_tests.py,sha256=fU3vy-_RcV0XqNoiwNq0wSWeACBLMsHmsAbXEwgtySM,39678
32
+ validmind/model_validation/sklearn/metrics.py,sha256=J6vizOm06VoMK1YA--3BrBC-JcmcBoC2s7PvHLeRcWY,15251
33
+ validmind/model_validation/sklearn/threshold_tests.py,sha256=Phc4Ppek25Fb5B5bul7X8Zuue_8KU5O1jkAh2Foalsk,39850
34
34
  validmind/model_validation/statsmodels/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  validmind/model_validation/statsmodels/metrics.py,sha256=4OUd-pv7kfrnIMXUyYudJX9tPGLH5yELLDBoJ8g5quU,28272
36
36
  validmind/model_validation/statsmodels/threshold_tests.py,sha256=SyEv7oaNIgiQ1ML3dQrGN54pSP88j9htOy4V2l4Ipwk,1317
@@ -50,7 +50,7 @@ validmind/vm_models/dataset_utils.py,sha256=xWq6dbxe9fCUdpKCiEFvbxhy9t7cOKh0boS-
50
50
  validmind/vm_models/figure.py,sha256=EarfMm49J2BWf6UhsMFGr3VSdGu8v2ZewzArKKp_LfU,592
51
51
  validmind/vm_models/metric.py,sha256=kf1N646Wq2pSZ1GkxG1tDoFyqGntN1N-PTMLPz1j-5o,3746
52
52
  validmind/vm_models/metric_result.py,sha256=NVPNIt4S9HN05CnFr-DPYp2ZUYoFGVP-zT2KX6gNypQ,1757
53
- validmind/vm_models/model.py,sha256=segtsvR0fg34hH8qlF9V9ujIVv3VI4s9CBtRX4TVqnE,6530
53
+ validmind/vm_models/model.py,sha256=9ubRdS8eVZaQWtmupLedtD7xf905r3UxePBJrMoxcFs,6565
54
54
  validmind/vm_models/plot_utils.py,sha256=BWYc9SwITwZxaAJePVYDLrBSV1XEV0EmVllq9A1K_IM,3721
55
55
  validmind/vm_models/result_summary.py,sha256=1YGlWqcO4PY2NtDm7fbuOSLXPIu6KM1USp_pgh6rmJM,1518
56
56
  validmind/vm_models/test_context.py,sha256=nWiTIORPNEl7mKkYme8n2QaJyAotp034A2NK33MNmhE,2501
@@ -59,7 +59,7 @@ validmind/vm_models/test_plan_result.py,sha256=oPEkss0eJAetRzv11P4McF9b651v6Tq7k
59
59
  validmind/vm_models/test_result.py,sha256=jiX8yb1NptBXZQ_pOyHloc8I6yS6zamYm0j9OWUqrHs,1698
60
60
  validmind/vm_models/test_suite.py,sha256=d2yBuLD4ga7Bb_yK67LJ14C58_Mj4GYBPdy4BuxoBog,5407
61
61
  validmind/vm_models/threshold_test.py,sha256=F0s4JPN8JXpGjsNU40xaeOgt8kB2BI1GrOrcYCGcxqA,4231
62
- validmind-1.11.5.dist-info/LICENSE,sha256=oyp_7jnk_p7ZNF9mcWpiHadwWc1JqR1aaemjjfCFscE,5458
63
- validmind-1.11.5.dist-info/METADATA,sha256=r6WtQH3p_8SwS138CHzzzESPlim0gWxMJf7ctVXKrlg,1420
64
- validmind-1.11.5.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
65
- validmind-1.11.5.dist-info/RECORD,,
62
+ validmind-1.11.6.dist-info/LICENSE,sha256=oyp_7jnk_p7ZNF9mcWpiHadwWc1JqR1aaemjjfCFscE,5458
63
+ validmind-1.11.6.dist-info/METADATA,sha256=Qbl-H0aQ0ma-SA8SiC7Os1_F94fWMpmhWItRK_k8zXU,1457
64
+ validmind-1.11.6.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
65
+ validmind-1.11.6.dist-info/RECORD,,