validmind 2.8.28__py3-none-any.whl → 2.9.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.
Files changed (233) hide show
  1. validmind/__version__.py +1 -1
  2. validmind/ai/utils.py +4 -24
  3. validmind/api_client.py +6 -17
  4. validmind/logging.py +48 -0
  5. validmind/models/function.py +11 -3
  6. validmind/tests/__init__.py +2 -0
  7. validmind/tests/__types__.py +18 -0
  8. validmind/tests/data_validation/ACFandPACFPlot.py +3 -1
  9. validmind/tests/data_validation/ADF.py +3 -1
  10. validmind/tests/data_validation/AutoAR.py +3 -1
  11. validmind/tests/data_validation/AutoMA.py +5 -1
  12. validmind/tests/data_validation/AutoStationarity.py +5 -1
  13. validmind/tests/data_validation/BivariateScatterPlots.py +3 -1
  14. validmind/tests/data_validation/BoxPierce.py +4 -1
  15. validmind/tests/data_validation/ChiSquaredFeaturesTable.py +1 -1
  16. validmind/tests/data_validation/ClassImbalance.py +1 -1
  17. validmind/tests/data_validation/DatasetDescription.py +4 -1
  18. validmind/tests/data_validation/DatasetSplit.py +3 -2
  19. validmind/tests/data_validation/DescriptiveStatistics.py +3 -1
  20. validmind/tests/data_validation/DickeyFullerGLS.py +3 -1
  21. validmind/tests/data_validation/Duplicates.py +3 -1
  22. validmind/tests/data_validation/EngleGrangerCoint.py +6 -1
  23. validmind/tests/data_validation/FeatureTargetCorrelationPlot.py +3 -1
  24. validmind/tests/data_validation/HighCardinality.py +3 -1
  25. validmind/tests/data_validation/HighPearsonCorrelation.py +4 -1
  26. validmind/tests/data_validation/IQROutliersBarPlot.py +4 -1
  27. validmind/tests/data_validation/IQROutliersTable.py +6 -1
  28. validmind/tests/data_validation/IsolationForestOutliers.py +3 -1
  29. validmind/tests/data_validation/JarqueBera.py +3 -1
  30. validmind/tests/data_validation/KPSS.py +3 -1
  31. validmind/tests/data_validation/LJungBox.py +3 -1
  32. validmind/tests/data_validation/LaggedCorrelationHeatmap.py +6 -1
  33. validmind/tests/data_validation/MissingValues.py +5 -1
  34. validmind/tests/data_validation/MissingValuesBarPlot.py +3 -1
  35. validmind/tests/data_validation/MutualInformation.py +4 -1
  36. validmind/tests/data_validation/PearsonCorrelationMatrix.py +3 -1
  37. validmind/tests/data_validation/PhillipsPerronArch.py +3 -1
  38. validmind/tests/data_validation/ProtectedClassesCombination.py +5 -1
  39. validmind/tests/data_validation/ProtectedClassesDescription.py +5 -1
  40. validmind/tests/data_validation/ProtectedClassesDisparity.py +5 -3
  41. validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.py +9 -2
  42. validmind/tests/data_validation/RollingStatsPlot.py +5 -1
  43. validmind/tests/data_validation/RunsTest.py +1 -1
  44. validmind/tests/data_validation/ScatterPlot.py +2 -1
  45. validmind/tests/data_validation/ScoreBandDefaultRates.py +3 -1
  46. validmind/tests/data_validation/SeasonalDecompose.py +6 -1
  47. validmind/tests/data_validation/ShapiroWilk.py +4 -1
  48. validmind/tests/data_validation/Skewness.py +3 -1
  49. validmind/tests/data_validation/SpreadPlot.py +3 -1
  50. validmind/tests/data_validation/TabularCategoricalBarPlots.py +4 -1
  51. validmind/tests/data_validation/TabularDateTimeHistograms.py +3 -1
  52. validmind/tests/data_validation/TabularDescriptionTables.py +4 -1
  53. validmind/tests/data_validation/TabularNumericalHistograms.py +3 -1
  54. validmind/tests/data_validation/TargetRateBarPlots.py +4 -1
  55. validmind/tests/data_validation/TimeSeriesDescription.py +1 -1
  56. validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.py +1 -1
  57. validmind/tests/data_validation/TimeSeriesFrequency.py +5 -1
  58. validmind/tests/data_validation/TimeSeriesHistogram.py +4 -1
  59. validmind/tests/data_validation/TimeSeriesLinePlot.py +3 -1
  60. validmind/tests/data_validation/TimeSeriesMissingValues.py +6 -1
  61. validmind/tests/data_validation/TimeSeriesOutliers.py +5 -1
  62. validmind/tests/data_validation/TooManyZeroValues.py +6 -1
  63. validmind/tests/data_validation/UniqueRows.py +5 -1
  64. validmind/tests/data_validation/WOEBinPlots.py +4 -1
  65. validmind/tests/data_validation/WOEBinTable.py +5 -1
  66. validmind/tests/data_validation/ZivotAndrewsArch.py +3 -1
  67. validmind/tests/data_validation/nlp/CommonWords.py +2 -1
  68. validmind/tests/data_validation/nlp/Hashtags.py +2 -1
  69. validmind/tests/data_validation/nlp/LanguageDetection.py +4 -1
  70. validmind/tests/data_validation/nlp/Mentions.py +3 -1
  71. validmind/tests/data_validation/nlp/PolarityAndSubjectivity.py +6 -1
  72. validmind/tests/data_validation/nlp/Punctuations.py +2 -1
  73. validmind/tests/data_validation/nlp/Sentiment.py +3 -1
  74. validmind/tests/data_validation/nlp/StopWords.py +2 -1
  75. validmind/tests/data_validation/nlp/TextDescription.py +3 -1
  76. validmind/tests/data_validation/nlp/Toxicity.py +3 -1
  77. validmind/tests/load.py +91 -17
  78. validmind/tests/model_validation/BertScore.py +6 -3
  79. validmind/tests/model_validation/BleuScore.py +6 -1
  80. validmind/tests/model_validation/ClusterSizeDistribution.py +5 -1
  81. validmind/tests/model_validation/ContextualRecall.py +6 -1
  82. validmind/tests/model_validation/FeaturesAUC.py +5 -1
  83. validmind/tests/model_validation/MeteorScore.py +6 -1
  84. validmind/tests/model_validation/ModelMetadata.py +2 -1
  85. validmind/tests/model_validation/ModelPredictionResiduals.py +10 -2
  86. validmind/tests/model_validation/RegardScore.py +7 -1
  87. validmind/tests/model_validation/RegressionResidualsPlot.py +5 -1
  88. validmind/tests/model_validation/RougeScore.py +8 -1
  89. validmind/tests/model_validation/TimeSeriesPredictionWithCI.py +8 -1
  90. validmind/tests/model_validation/TimeSeriesPredictionsPlot.py +7 -1
  91. validmind/tests/model_validation/TimeSeriesR2SquareBySegments.py +6 -1
  92. validmind/tests/model_validation/TokenDisparity.py +6 -1
  93. validmind/tests/model_validation/ToxicityScore.py +6 -1
  94. validmind/tests/model_validation/embeddings/ClusterDistribution.py +6 -1
  95. validmind/tests/model_validation/embeddings/CosineSimilarityComparison.py +6 -1
  96. validmind/tests/model_validation/embeddings/CosineSimilarityDistribution.py +6 -1
  97. validmind/tests/model_validation/embeddings/CosineSimilarityHeatmap.py +7 -3
  98. validmind/tests/model_validation/embeddings/DescriptiveAnalytics.py +6 -1
  99. validmind/tests/model_validation/embeddings/EmbeddingsVisualization2D.py +4 -3
  100. validmind/tests/model_validation/embeddings/EuclideanDistanceComparison.py +6 -1
  101. validmind/tests/model_validation/embeddings/EuclideanDistanceHeatmap.py +7 -3
  102. validmind/tests/model_validation/embeddings/PCAComponentsPairwisePlots.py +6 -1
  103. validmind/tests/model_validation/embeddings/StabilityAnalysisKeyword.py +5 -2
  104. validmind/tests/model_validation/embeddings/StabilityAnalysisRandomNoise.py +5 -1
  105. validmind/tests/model_validation/embeddings/StabilityAnalysisSynonyms.py +4 -1
  106. validmind/tests/model_validation/embeddings/StabilityAnalysisTranslation.py +5 -1
  107. validmind/tests/model_validation/embeddings/TSNEComponentsPairwisePlots.py +9 -6
  108. validmind/tests/model_validation/ragas/AnswerCorrectness.py +8 -5
  109. validmind/tests/model_validation/ragas/AspectCritic.py +11 -8
  110. validmind/tests/model_validation/ragas/ContextEntityRecall.py +5 -2
  111. validmind/tests/model_validation/ragas/ContextPrecision.py +5 -2
  112. validmind/tests/model_validation/ragas/ContextPrecisionWithoutReference.py +5 -2
  113. validmind/tests/model_validation/ragas/ContextRecall.py +6 -2
  114. validmind/tests/model_validation/ragas/Faithfulness.py +9 -5
  115. validmind/tests/model_validation/ragas/NoiseSensitivity.py +10 -7
  116. validmind/tests/model_validation/ragas/ResponseRelevancy.py +9 -6
  117. validmind/tests/model_validation/ragas/SemanticSimilarity.py +7 -4
  118. validmind/tests/model_validation/sklearn/AdjustedMutualInformation.py +5 -1
  119. validmind/tests/model_validation/sklearn/AdjustedRandIndex.py +5 -1
  120. validmind/tests/model_validation/sklearn/CalibrationCurve.py +5 -1
  121. validmind/tests/model_validation/sklearn/ClassifierPerformance.py +5 -1
  122. validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.py +5 -1
  123. validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py +5 -1
  124. validmind/tests/model_validation/sklearn/CompletenessScore.py +5 -1
  125. validmind/tests/model_validation/sklearn/ConfusionMatrix.py +4 -1
  126. validmind/tests/model_validation/sklearn/FeatureImportance.py +5 -1
  127. validmind/tests/model_validation/sklearn/FowlkesMallowsScore.py +5 -1
  128. validmind/tests/model_validation/sklearn/HomogeneityScore.py +5 -1
  129. validmind/tests/model_validation/sklearn/HyperParametersTuning.py +2 -4
  130. validmind/tests/model_validation/sklearn/KMeansClustersOptimization.py +3 -3
  131. validmind/tests/model_validation/sklearn/MinimumAccuracy.py +5 -1
  132. validmind/tests/model_validation/sklearn/MinimumF1Score.py +5 -1
  133. validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py +5 -1
  134. validmind/tests/model_validation/sklearn/ModelParameters.py +6 -1
  135. validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.py +5 -1
  136. validmind/tests/model_validation/sklearn/OverfitDiagnosis.py +3 -2
  137. validmind/tests/model_validation/sklearn/PermutationFeatureImportance.py +4 -4
  138. validmind/tests/model_validation/sklearn/PopulationStabilityIndex.py +2 -2
  139. validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py +5 -1
  140. validmind/tests/model_validation/sklearn/ROCCurve.py +3 -1
  141. validmind/tests/model_validation/sklearn/RegressionErrors.py +6 -1
  142. validmind/tests/model_validation/sklearn/RegressionErrorsComparison.py +6 -1
  143. validmind/tests/model_validation/sklearn/RegressionPerformance.py +5 -1
  144. validmind/tests/model_validation/sklearn/RegressionR2Square.py +6 -1
  145. validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.py +6 -1
  146. validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py +2 -2
  147. validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.py +3 -1
  148. validmind/tests/model_validation/sklearn/SilhouettePlot.py +6 -1
  149. validmind/tests/model_validation/sklearn/TrainingTestDegradation.py +2 -2
  150. validmind/tests/model_validation/sklearn/VMeasure.py +5 -1
  151. validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.py +6 -5
  152. validmind/tests/model_validation/statsmodels/AutoARIMA.py +3 -1
  153. validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.py +6 -1
  154. validmind/tests/model_validation/statsmodels/DurbinWatsonTest.py +6 -1
  155. validmind/tests/model_validation/statsmodels/GINITable.py +4 -1
  156. validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.py +5 -1
  157. validmind/tests/model_validation/statsmodels/Lilliefors.py +3 -1
  158. validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.py +6 -2
  159. validmind/tests/model_validation/statsmodels/RegressionCoeffs.py +4 -1
  160. validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.py +7 -2
  161. validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.py +5 -4
  162. validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.py +4 -1
  163. validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.py +3 -2
  164. validmind/tests/model_validation/statsmodels/RegressionModelSummary.py +5 -1
  165. validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.py +3 -1
  166. validmind/tests/model_validation/statsmodels/ScorecardHistogram.py +6 -1
  167. validmind/tests/ongoing_monitoring/CalibrationCurveDrift.py +2 -2
  168. validmind/tests/ongoing_monitoring/ClassDiscriminationDrift.py +2 -2
  169. validmind/tests/ongoing_monitoring/ClassImbalanceDrift.py +2 -2
  170. validmind/tests/ongoing_monitoring/ClassificationAccuracyDrift.py +2 -2
  171. validmind/tests/ongoing_monitoring/ConfusionMatrixDrift.py +2 -2
  172. validmind/tests/ongoing_monitoring/CumulativePredictionProbabilitiesDrift.py +2 -2
  173. validmind/tests/ongoing_monitoring/FeatureDrift.py +5 -2
  174. validmind/tests/ongoing_monitoring/PredictionAcrossEachFeature.py +6 -1
  175. validmind/tests/ongoing_monitoring/PredictionCorrelation.py +8 -1
  176. validmind/tests/ongoing_monitoring/PredictionProbabilitiesHistogramDrift.py +2 -2
  177. validmind/tests/ongoing_monitoring/PredictionQuantilesAcrossFeatures.py +6 -1
  178. validmind/tests/ongoing_monitoring/ROCCurveDrift.py +4 -2
  179. validmind/tests/ongoing_monitoring/ScoreBandsDrift.py +2 -2
  180. validmind/tests/ongoing_monitoring/ScorecardHistogramDrift.py +2 -2
  181. validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py +8 -1
  182. validmind/tests/output.py +9 -2
  183. validmind/tests/plots/BoxPlot.py +260 -0
  184. validmind/tests/plots/CorrelationHeatmap.py +235 -0
  185. validmind/tests/plots/HistogramPlot.py +233 -0
  186. validmind/tests/plots/ViolinPlot.py +125 -0
  187. validmind/tests/plots/__init__.py +0 -0
  188. validmind/tests/prompt_validation/Bias.py +5 -1
  189. validmind/tests/prompt_validation/Clarity.py +5 -1
  190. validmind/tests/prompt_validation/Conciseness.py +5 -1
  191. validmind/tests/prompt_validation/Delimitation.py +5 -1
  192. validmind/tests/prompt_validation/NegativeInstruction.py +5 -1
  193. validmind/tests/prompt_validation/Robustness.py +5 -1
  194. validmind/tests/prompt_validation/Specificity.py +5 -1
  195. validmind/tests/stats/CorrelationAnalysis.py +251 -0
  196. validmind/tests/stats/DescriptiveStats.py +197 -0
  197. validmind/tests/stats/NormalityTests.py +147 -0
  198. validmind/tests/stats/OutlierDetection.py +173 -0
  199. validmind/tests/stats/__init__.py +0 -0
  200. validmind/unit_metrics/classification/Accuracy.py +2 -1
  201. validmind/unit_metrics/classification/F1.py +2 -1
  202. validmind/unit_metrics/classification/Precision.py +2 -1
  203. validmind/unit_metrics/classification/ROC_AUC.py +2 -1
  204. validmind/unit_metrics/classification/Recall.py +2 -1
  205. validmind/unit_metrics/classification/individual/AbsoluteError.py +42 -0
  206. validmind/unit_metrics/classification/individual/BrierScore.py +56 -0
  207. validmind/unit_metrics/classification/individual/CalibrationError.py +77 -0
  208. validmind/unit_metrics/classification/individual/ClassBalance.py +65 -0
  209. validmind/unit_metrics/classification/individual/Confidence.py +52 -0
  210. validmind/unit_metrics/classification/individual/Correctness.py +41 -0
  211. validmind/unit_metrics/classification/individual/LogLoss.py +61 -0
  212. validmind/unit_metrics/classification/individual/OutlierScore.py +86 -0
  213. validmind/unit_metrics/classification/individual/ProbabilityError.py +54 -0
  214. validmind/unit_metrics/classification/individual/Uncertainty.py +60 -0
  215. validmind/unit_metrics/classification/individual/__init__.py +0 -0
  216. validmind/unit_metrics/regression/AdjustedRSquaredScore.py +2 -1
  217. validmind/unit_metrics/regression/GiniCoefficient.py +2 -1
  218. validmind/unit_metrics/regression/HuberLoss.py +2 -1
  219. validmind/unit_metrics/regression/KolmogorovSmirnovStatistic.py +2 -1
  220. validmind/unit_metrics/regression/MeanAbsoluteError.py +2 -1
  221. validmind/unit_metrics/regression/MeanAbsolutePercentageError.py +2 -1
  222. validmind/unit_metrics/regression/MeanBiasDeviation.py +2 -1
  223. validmind/unit_metrics/regression/MeanSquaredError.py +2 -1
  224. validmind/unit_metrics/regression/QuantileLoss.py +1 -1
  225. validmind/unit_metrics/regression/RSquaredScore.py +2 -1
  226. validmind/unit_metrics/regression/RootMeanSquaredError.py +2 -1
  227. validmind/vm_models/dataset/dataset.py +291 -38
  228. validmind/vm_models/result/result.py +26 -4
  229. {validmind-2.8.28.dist-info → validmind-2.9.1.dist-info}/METADATA +2 -2
  230. {validmind-2.8.28.dist-info → validmind-2.9.1.dist-info}/RECORD +233 -212
  231. {validmind-2.8.28.dist-info → validmind-2.9.1.dist-info}/LICENSE +0 -0
  232. {validmind-2.8.28.dist-info → validmind-2.9.1.dist-info}/WHEEL +0 -0
  233. {validmind-2.8.28.dist-info → validmind-2.9.1.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,86 @@
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
+ from typing import List
6
+
7
+ import numpy as np
8
+ from sklearn.ensemble import IsolationForest
9
+ from sklearn.preprocessing import StandardScaler
10
+
11
+ from validmind import tags, tasks
12
+ from validmind.vm_models import VMDataset, VMModel
13
+
14
+
15
+ @tasks("classification")
16
+ @tags("classification")
17
+ def OutlierScore(
18
+ model: VMModel, dataset: VMDataset, contamination: float = 0.1, **kwargs
19
+ ) -> List[float]:
20
+ """Calculates the outlier score per row for a classification model.
21
+
22
+ Uses Isolation Forest to identify samples that deviate significantly from
23
+ the typical patterns in the feature space. Higher scores indicate more
24
+ anomalous/outlier-like samples. This can help identify out-of-distribution
25
+ samples or data points that might be harder to predict accurately.
26
+
27
+ Args:
28
+ model: The classification model to evaluate (unused but kept for consistency)
29
+ dataset: The dataset containing feature data
30
+ contamination: Expected proportion of outliers, defaults to 0.1
31
+ **kwargs: Additional parameters (unused for compatibility)
32
+
33
+ Returns:
34
+ List[float]: Per-row outlier scores as a list of float values
35
+
36
+ Note:
37
+ Scores are normalized to [0, 1] where higher values indicate more outlier-like samples
38
+ """
39
+ # Get feature data
40
+ X = dataset.x_df()
41
+
42
+ # Handle case where we have no features or only categorical features
43
+ if X.empty or X.shape[1] == 0:
44
+ # Return zero outlier scores if no features available
45
+ return [0.0] * len(dataset.y)
46
+
47
+ # Select only numeric features for outlier detection
48
+ numeric_features = dataset.feature_columns_numeric
49
+ if not numeric_features:
50
+ # If no numeric features, return zero outlier scores
51
+ return [0.0] * len(dataset.y)
52
+
53
+ X_numeric = X[numeric_features]
54
+
55
+ # Handle missing values by filling with median
56
+ X_filled = X_numeric.fillna(X_numeric.median())
57
+
58
+ # Standardize features for better outlier detection
59
+ scaler = StandardScaler()
60
+ X_scaled = scaler.fit_transform(X_filled)
61
+
62
+ # Fit Isolation Forest
63
+ isolation_forest = IsolationForest(
64
+ contamination=contamination, random_state=42, n_estimators=100
65
+ )
66
+
67
+ # Fit the model on the data
68
+ isolation_forest.fit(X_scaled)
69
+
70
+ # Get anomaly scores (negative values for outliers)
71
+ anomaly_scores = isolation_forest.decision_function(X_scaled)
72
+
73
+ # Convert to outlier scores (0 to 1, where 1 is most outlier-like)
74
+ # Normalize using min-max scaling
75
+ min_score = np.min(anomaly_scores)
76
+ max_score = np.max(anomaly_scores)
77
+
78
+ if max_score == min_score:
79
+ # All samples have same score, no outliers detected
80
+ outlier_scores = np.zeros_like(anomaly_scores)
81
+ else:
82
+ # Invert and normalize: higher values = more outlier-like
83
+ outlier_scores = (max_score - anomaly_scores) / (max_score - min_score)
84
+
85
+ # Return as a list of floats
86
+ return outlier_scores.tolist()
@@ -0,0 +1,54 @@
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
+ from typing import List
6
+
7
+ import numpy as np
8
+
9
+ from validmind import tags, tasks
10
+ from validmind.vm_models import VMDataset, VMModel
11
+
12
+
13
+ @tasks("classification")
14
+ @tags("classification")
15
+ def ProbabilityError(model: VMModel, dataset: VMDataset, **kwargs) -> List[float]:
16
+ """Calculates the probability error per row for a classification model.
17
+
18
+ For binary classification tasks, this computes the absolute difference between
19
+ the true class labels (0 or 1) and the predicted probabilities for each row.
20
+ This provides insight into how confident the model's predictions are and
21
+ how far off they are from the actual labels.
22
+
23
+ Args:
24
+ model: The classification model to evaluate
25
+ dataset: The dataset containing true labels and predicted probabilities
26
+ **kwargs: Additional parameters (unused for compatibility)
27
+
28
+ Returns:
29
+ List[float]: Per-row probability errors as a list of float values
30
+
31
+ Raises:
32
+ ValueError: If probability column is not found for the model
33
+ """
34
+ y_true = dataset.y
35
+
36
+ # Try to get probabilities, fall back to predictions if not available
37
+ try:
38
+ y_prob = dataset.y_prob(model)
39
+ # For binary classification, use the positive class probability
40
+ if y_prob.ndim > 1 and y_prob.shape[1] > 1:
41
+ y_prob = y_prob[:, 1] # Use probability of positive class
42
+ except ValueError:
43
+ # Fall back to predictions if probabilities not available
44
+ y_prob = dataset.y_pred(model)
45
+
46
+ # Convert to numpy arrays and ensure same data type
47
+ y_true = np.asarray(y_true, dtype=float)
48
+ y_prob = np.asarray(y_prob, dtype=float)
49
+
50
+ # Compute absolute difference between true labels and predicted probabilities
51
+ probability_errors = np.abs(y_true - y_prob)
52
+
53
+ # Return as a list of floats
54
+ return probability_errors.tolist()
@@ -0,0 +1,60 @@
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
+ from typing import List
6
+
7
+ import numpy as np
8
+
9
+ from validmind import tags, tasks
10
+ from validmind.vm_models import VMDataset, VMModel
11
+
12
+
13
+ @tasks("classification")
14
+ @tags("classification")
15
+ def Uncertainty(model: VMModel, dataset: VMDataset, **kwargs) -> List[float]:
16
+ """Calculates the prediction uncertainty per row for a classification model.
17
+
18
+ Uncertainty is measured using the entropy of the predicted probability distribution.
19
+ Higher entropy indicates higher uncertainty in the prediction. For binary
20
+ classification, maximum uncertainty occurs at probability 0.5.
21
+
22
+ Args:
23
+ model: The classification model to evaluate
24
+ dataset: The dataset containing true labels and predicted probabilities
25
+ **kwargs: Additional parameters (unused for compatibility)
26
+
27
+ Returns:
28
+ List[float]: Per-row uncertainty scores as a list of float values
29
+
30
+ Raises:
31
+ ValueError: If probability column is not found for the model
32
+ """
33
+ # Try to get probabilities
34
+ try:
35
+ y_prob = dataset.y_prob(model)
36
+
37
+ if y_prob.ndim > 1 and y_prob.shape[1] > 1:
38
+ # Multi-class: calculate entropy across all classes
39
+ # Clip to avoid log(0)
40
+ y_prob_clipped = np.clip(y_prob, 1e-15, 1 - 1e-15)
41
+ # Entropy: -sum(p * log(p))
42
+ uncertainty = -np.sum(y_prob_clipped * np.log(y_prob_clipped), axis=1)
43
+ else:
44
+ # Binary classification: calculate binary entropy
45
+ y_prob = np.asarray(y_prob, dtype=float)
46
+ # Clip to avoid log(0)
47
+ y_prob_clipped = np.clip(y_prob, 1e-15, 1 - 1e-15)
48
+ # Binary entropy: -[p*log(p) + (1-p)*log(1-p)]
49
+ uncertainty = -(
50
+ y_prob_clipped * np.log(y_prob_clipped)
51
+ + (1 - y_prob_clipped) * np.log(1 - y_prob_clipped)
52
+ )
53
+
54
+ except ValueError:
55
+ # If no probabilities available, assume zero uncertainty for hard predictions
56
+ n_samples = len(dataset.y)
57
+ uncertainty = np.zeros(n_samples)
58
+
59
+ # Return as a list of floats
60
+ return uncertainty.tolist()
@@ -5,11 +5,12 @@
5
5
  from sklearn.metrics import r2_score as _r2_score
6
6
 
7
7
  from validmind import tags, tasks
8
+ from validmind.vm_models import VMDataset, VMModel
8
9
 
9
10
 
10
11
  @tags("regression")
11
12
  @tasks("regression")
12
- def AdjustedRSquaredScore(model, dataset):
13
+ def AdjustedRSquaredScore(model: VMModel, dataset: VMDataset) -> float:
13
14
  """Calculates the adjusted R-squared score for a regression model."""
14
15
  r2_score = _r2_score(
15
16
  dataset.y,
@@ -5,11 +5,12 @@
5
5
  import numpy as np
6
6
 
7
7
  from validmind import tags, tasks
8
+ from validmind.vm_models import VMDataset, VMModel
8
9
 
9
10
 
10
11
  @tags("regression")
11
12
  @tasks("regression")
12
- def GiniCoefficient(dataset, model):
13
+ def GiniCoefficient(dataset: VMDataset, model: VMModel) -> float:
13
14
  """Calculates the Gini coefficient for a regression model."""
14
15
  y_true = dataset.y
15
16
  y_pred = dataset.y_pred(model)
@@ -5,11 +5,12 @@
5
5
  import numpy as np
6
6
 
7
7
  from validmind import tags, tasks
8
+ from validmind.vm_models import VMDataset, VMModel
8
9
 
9
10
 
10
11
  @tags("regression")
11
12
  @tasks("regression")
12
- def HuberLoss(model, dataset):
13
+ def HuberLoss(model: VMModel, dataset: VMDataset) -> float:
13
14
  """Calculates the Huber loss for a regression model."""
14
15
  y_true = dataset.y
15
16
  y_pred = dataset.y_pred(model)
@@ -5,11 +5,12 @@
5
5
  import numpy as np
6
6
 
7
7
  from validmind import tags, tasks
8
+ from validmind.vm_models import VMDataset, VMModel
8
9
 
9
10
 
10
11
  @tags("regression")
11
12
  @tasks("regression")
12
- def KolmogorovSmirnovStatistic(dataset, model):
13
+ def KolmogorovSmirnovStatistic(dataset: VMDataset, model: VMModel) -> float:
13
14
  """Calculates the Kolmogorov-Smirnov statistic for a regression model."""
14
15
  y_true = dataset.y.flatten()
15
16
  y_pred = dataset.y_pred(model)
@@ -5,10 +5,11 @@
5
5
  from sklearn.metrics import mean_absolute_error as _mean_absolute_error
6
6
 
7
7
  from validmind import tags, tasks
8
+ from validmind.vm_models import VMDataset, VMModel
8
9
 
9
10
 
10
11
  @tags("regression")
11
12
  @tasks("regression")
12
- def MeanAbsoluteError(model, dataset, **kwargs):
13
+ def MeanAbsoluteError(model: VMModel, dataset: VMDataset, **kwargs) -> float:
13
14
  """Calculates the mean absolute error for a regression model."""
14
15
  return _mean_absolute_error(dataset.y, dataset.y_pred(model), **kwargs)
@@ -5,11 +5,12 @@
5
5
  import numpy as np
6
6
 
7
7
  from validmind import tags, tasks
8
+ from validmind.vm_models import VMDataset, VMModel
8
9
 
9
10
 
10
11
  @tags("regression")
11
12
  @tasks("regression")
12
- def MeanAbsolutePercentageError(model, dataset):
13
+ def MeanAbsolutePercentageError(model: VMModel, dataset: VMDataset) -> float:
13
14
  """Calculates the mean absolute percentage error for a regression model."""
14
15
  y_true = dataset.y
15
16
  y_pred = dataset.y_pred(model)
@@ -5,10 +5,11 @@
5
5
  import numpy as np
6
6
 
7
7
  from validmind import tags, tasks
8
+ from validmind.vm_models import VMDataset, VMModel
8
9
 
9
10
 
10
11
  @tags("regression")
11
12
  @tasks("regression")
12
- def MeanBiasDeviation(model, dataset):
13
+ def MeanBiasDeviation(model: VMModel, dataset: VMDataset) -> float:
13
14
  """Calculates the mean bias deviation for a regression model."""
14
15
  return np.mean(dataset.y - dataset.y_pred(model))
@@ -5,10 +5,11 @@
5
5
  from sklearn.metrics import mean_squared_error
6
6
 
7
7
  from validmind import tags, tasks
8
+ from validmind.vm_models import VMDataset, VMModel
8
9
 
9
10
 
10
11
  @tags("regression")
11
12
  @tasks("regression")
12
- def MeanSquaredError(model, dataset, **kwargs):
13
+ def MeanSquaredError(model: VMModel, dataset: VMDataset, **kwargs) -> float:
13
14
  """Calculates the mean squared error for a regression model."""
14
15
  return mean_squared_error(dataset.y, dataset.y_pred(model), **kwargs)
@@ -9,7 +9,7 @@ from validmind import tags, tasks
9
9
 
10
10
  @tags("regression")
11
11
  @tasks("regression")
12
- def QuantileLoss(model, dataset, quantile=0.5):
12
+ def QuantileLoss(model, dataset, quantile=0.5) -> float:
13
13
  """Calculates the quantile loss for a regression model."""
14
14
  error = dataset.y - dataset.y_pred(model)
15
15
 
@@ -5,10 +5,11 @@
5
5
  from sklearn.metrics import r2_score
6
6
 
7
7
  from validmind import tags, tasks
8
+ from validmind.vm_models import VMDataset, VMModel
8
9
 
9
10
 
10
11
  @tags("regression")
11
12
  @tasks("regression")
12
- def RSquaredScore(model, dataset):
13
+ def RSquaredScore(model: VMModel, dataset: VMDataset) -> float:
13
14
  """Calculates the R-squared score for a regression model."""
14
15
  return r2_score(dataset.y, dataset.y_pred(model))
@@ -6,11 +6,12 @@ import numpy as np
6
6
  from sklearn.metrics import mean_squared_error
7
7
 
8
8
  from validmind import tags, tasks
9
+ from validmind.vm_models import VMDataset, VMModel
9
10
 
10
11
 
11
12
  @tags("regression")
12
13
  @tasks("regression")
13
- def RootMeanSquaredError(model, dataset, **kwargs):
14
+ def RootMeanSquaredError(model: VMModel, dataset: VMDataset, **kwargs) -> float:
14
15
  """Calculates the root mean squared error for a regression model."""
15
16
  return np.sqrt(
16
17
  mean_squared_error(