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.
- validmind/__version__.py +1 -1
- validmind/ai/utils.py +4 -24
- validmind/api_client.py +6 -17
- validmind/logging.py +48 -0
- validmind/models/function.py +11 -3
- validmind/tests/__init__.py +2 -0
- validmind/tests/__types__.py +18 -0
- validmind/tests/data_validation/ACFandPACFPlot.py +3 -1
- validmind/tests/data_validation/ADF.py +3 -1
- validmind/tests/data_validation/AutoAR.py +3 -1
- validmind/tests/data_validation/AutoMA.py +5 -1
- validmind/tests/data_validation/AutoStationarity.py +5 -1
- validmind/tests/data_validation/BivariateScatterPlots.py +3 -1
- validmind/tests/data_validation/BoxPierce.py +4 -1
- validmind/tests/data_validation/ChiSquaredFeaturesTable.py +1 -1
- validmind/tests/data_validation/ClassImbalance.py +1 -1
- validmind/tests/data_validation/DatasetDescription.py +4 -1
- validmind/tests/data_validation/DatasetSplit.py +3 -2
- validmind/tests/data_validation/DescriptiveStatistics.py +3 -1
- validmind/tests/data_validation/DickeyFullerGLS.py +3 -1
- validmind/tests/data_validation/Duplicates.py +3 -1
- validmind/tests/data_validation/EngleGrangerCoint.py +6 -1
- validmind/tests/data_validation/FeatureTargetCorrelationPlot.py +3 -1
- validmind/tests/data_validation/HighCardinality.py +3 -1
- validmind/tests/data_validation/HighPearsonCorrelation.py +4 -1
- validmind/tests/data_validation/IQROutliersBarPlot.py +4 -1
- validmind/tests/data_validation/IQROutliersTable.py +6 -1
- validmind/tests/data_validation/IsolationForestOutliers.py +3 -1
- validmind/tests/data_validation/JarqueBera.py +3 -1
- validmind/tests/data_validation/KPSS.py +3 -1
- validmind/tests/data_validation/LJungBox.py +3 -1
- validmind/tests/data_validation/LaggedCorrelationHeatmap.py +6 -1
- validmind/tests/data_validation/MissingValues.py +5 -1
- validmind/tests/data_validation/MissingValuesBarPlot.py +3 -1
- validmind/tests/data_validation/MutualInformation.py +4 -1
- validmind/tests/data_validation/PearsonCorrelationMatrix.py +3 -1
- validmind/tests/data_validation/PhillipsPerronArch.py +3 -1
- validmind/tests/data_validation/ProtectedClassesCombination.py +5 -1
- validmind/tests/data_validation/ProtectedClassesDescription.py +5 -1
- validmind/tests/data_validation/ProtectedClassesDisparity.py +5 -3
- validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.py +9 -2
- validmind/tests/data_validation/RollingStatsPlot.py +5 -1
- validmind/tests/data_validation/RunsTest.py +1 -1
- validmind/tests/data_validation/ScatterPlot.py +2 -1
- validmind/tests/data_validation/ScoreBandDefaultRates.py +3 -1
- validmind/tests/data_validation/SeasonalDecompose.py +6 -1
- validmind/tests/data_validation/ShapiroWilk.py +4 -1
- validmind/tests/data_validation/Skewness.py +3 -1
- validmind/tests/data_validation/SpreadPlot.py +3 -1
- validmind/tests/data_validation/TabularCategoricalBarPlots.py +4 -1
- validmind/tests/data_validation/TabularDateTimeHistograms.py +3 -1
- validmind/tests/data_validation/TabularDescriptionTables.py +4 -1
- validmind/tests/data_validation/TabularNumericalHistograms.py +3 -1
- validmind/tests/data_validation/TargetRateBarPlots.py +4 -1
- validmind/tests/data_validation/TimeSeriesDescription.py +1 -1
- validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.py +1 -1
- validmind/tests/data_validation/TimeSeriesFrequency.py +5 -1
- validmind/tests/data_validation/TimeSeriesHistogram.py +4 -1
- validmind/tests/data_validation/TimeSeriesLinePlot.py +3 -1
- validmind/tests/data_validation/TimeSeriesMissingValues.py +6 -1
- validmind/tests/data_validation/TimeSeriesOutliers.py +5 -1
- validmind/tests/data_validation/TooManyZeroValues.py +6 -1
- validmind/tests/data_validation/UniqueRows.py +5 -1
- validmind/tests/data_validation/WOEBinPlots.py +4 -1
- validmind/tests/data_validation/WOEBinTable.py +5 -1
- validmind/tests/data_validation/ZivotAndrewsArch.py +3 -1
- validmind/tests/data_validation/nlp/CommonWords.py +2 -1
- validmind/tests/data_validation/nlp/Hashtags.py +2 -1
- validmind/tests/data_validation/nlp/LanguageDetection.py +4 -1
- validmind/tests/data_validation/nlp/Mentions.py +3 -1
- validmind/tests/data_validation/nlp/PolarityAndSubjectivity.py +6 -1
- validmind/tests/data_validation/nlp/Punctuations.py +2 -1
- validmind/tests/data_validation/nlp/Sentiment.py +3 -1
- validmind/tests/data_validation/nlp/StopWords.py +2 -1
- validmind/tests/data_validation/nlp/TextDescription.py +3 -1
- validmind/tests/data_validation/nlp/Toxicity.py +3 -1
- validmind/tests/load.py +91 -17
- validmind/tests/model_validation/BertScore.py +6 -3
- validmind/tests/model_validation/BleuScore.py +6 -1
- validmind/tests/model_validation/ClusterSizeDistribution.py +5 -1
- validmind/tests/model_validation/ContextualRecall.py +6 -1
- validmind/tests/model_validation/FeaturesAUC.py +5 -1
- validmind/tests/model_validation/MeteorScore.py +6 -1
- validmind/tests/model_validation/ModelMetadata.py +2 -1
- validmind/tests/model_validation/ModelPredictionResiduals.py +10 -2
- validmind/tests/model_validation/RegardScore.py +7 -1
- validmind/tests/model_validation/RegressionResidualsPlot.py +5 -1
- validmind/tests/model_validation/RougeScore.py +8 -1
- validmind/tests/model_validation/TimeSeriesPredictionWithCI.py +8 -1
- validmind/tests/model_validation/TimeSeriesPredictionsPlot.py +7 -1
- validmind/tests/model_validation/TimeSeriesR2SquareBySegments.py +6 -1
- validmind/tests/model_validation/TokenDisparity.py +6 -1
- validmind/tests/model_validation/ToxicityScore.py +6 -1
- validmind/tests/model_validation/embeddings/ClusterDistribution.py +6 -1
- validmind/tests/model_validation/embeddings/CosineSimilarityComparison.py +6 -1
- validmind/tests/model_validation/embeddings/CosineSimilarityDistribution.py +6 -1
- validmind/tests/model_validation/embeddings/CosineSimilarityHeatmap.py +7 -3
- validmind/tests/model_validation/embeddings/DescriptiveAnalytics.py +6 -1
- validmind/tests/model_validation/embeddings/EmbeddingsVisualization2D.py +4 -3
- validmind/tests/model_validation/embeddings/EuclideanDistanceComparison.py +6 -1
- validmind/tests/model_validation/embeddings/EuclideanDistanceHeatmap.py +7 -3
- validmind/tests/model_validation/embeddings/PCAComponentsPairwisePlots.py +6 -1
- validmind/tests/model_validation/embeddings/StabilityAnalysisKeyword.py +5 -2
- validmind/tests/model_validation/embeddings/StabilityAnalysisRandomNoise.py +5 -1
- validmind/tests/model_validation/embeddings/StabilityAnalysisSynonyms.py +4 -1
- validmind/tests/model_validation/embeddings/StabilityAnalysisTranslation.py +5 -1
- validmind/tests/model_validation/embeddings/TSNEComponentsPairwisePlots.py +9 -6
- validmind/tests/model_validation/ragas/AnswerCorrectness.py +8 -5
- validmind/tests/model_validation/ragas/AspectCritic.py +11 -8
- validmind/tests/model_validation/ragas/ContextEntityRecall.py +5 -2
- validmind/tests/model_validation/ragas/ContextPrecision.py +5 -2
- validmind/tests/model_validation/ragas/ContextPrecisionWithoutReference.py +5 -2
- validmind/tests/model_validation/ragas/ContextRecall.py +6 -2
- validmind/tests/model_validation/ragas/Faithfulness.py +9 -5
- validmind/tests/model_validation/ragas/NoiseSensitivity.py +10 -7
- validmind/tests/model_validation/ragas/ResponseRelevancy.py +9 -6
- validmind/tests/model_validation/ragas/SemanticSimilarity.py +7 -4
- validmind/tests/model_validation/sklearn/AdjustedMutualInformation.py +5 -1
- validmind/tests/model_validation/sklearn/AdjustedRandIndex.py +5 -1
- validmind/tests/model_validation/sklearn/CalibrationCurve.py +5 -1
- validmind/tests/model_validation/sklearn/ClassifierPerformance.py +5 -1
- validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.py +5 -1
- validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py +5 -1
- validmind/tests/model_validation/sklearn/CompletenessScore.py +5 -1
- validmind/tests/model_validation/sklearn/ConfusionMatrix.py +4 -1
- validmind/tests/model_validation/sklearn/FeatureImportance.py +5 -1
- validmind/tests/model_validation/sklearn/FowlkesMallowsScore.py +5 -1
- validmind/tests/model_validation/sklearn/HomogeneityScore.py +5 -1
- validmind/tests/model_validation/sklearn/HyperParametersTuning.py +2 -4
- validmind/tests/model_validation/sklearn/KMeansClustersOptimization.py +3 -3
- validmind/tests/model_validation/sklearn/MinimumAccuracy.py +5 -1
- validmind/tests/model_validation/sklearn/MinimumF1Score.py +5 -1
- validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py +5 -1
- validmind/tests/model_validation/sklearn/ModelParameters.py +6 -1
- validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.py +5 -1
- validmind/tests/model_validation/sklearn/OverfitDiagnosis.py +3 -2
- validmind/tests/model_validation/sklearn/PermutationFeatureImportance.py +4 -4
- validmind/tests/model_validation/sklearn/PopulationStabilityIndex.py +2 -2
- validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py +5 -1
- validmind/tests/model_validation/sklearn/ROCCurve.py +3 -1
- validmind/tests/model_validation/sklearn/RegressionErrors.py +6 -1
- validmind/tests/model_validation/sklearn/RegressionErrorsComparison.py +6 -1
- validmind/tests/model_validation/sklearn/RegressionPerformance.py +5 -1
- validmind/tests/model_validation/sklearn/RegressionR2Square.py +6 -1
- validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.py +6 -1
- validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py +2 -2
- validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.py +3 -1
- validmind/tests/model_validation/sklearn/SilhouettePlot.py +6 -1
- validmind/tests/model_validation/sklearn/TrainingTestDegradation.py +2 -2
- validmind/tests/model_validation/sklearn/VMeasure.py +5 -1
- validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.py +6 -5
- validmind/tests/model_validation/statsmodels/AutoARIMA.py +3 -1
- validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.py +6 -1
- validmind/tests/model_validation/statsmodels/DurbinWatsonTest.py +6 -1
- validmind/tests/model_validation/statsmodels/GINITable.py +4 -1
- validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.py +5 -1
- validmind/tests/model_validation/statsmodels/Lilliefors.py +3 -1
- validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.py +6 -2
- validmind/tests/model_validation/statsmodels/RegressionCoeffs.py +4 -1
- validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.py +7 -2
- validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.py +5 -4
- validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.py +4 -1
- validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.py +3 -2
- validmind/tests/model_validation/statsmodels/RegressionModelSummary.py +5 -1
- validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.py +3 -1
- validmind/tests/model_validation/statsmodels/ScorecardHistogram.py +6 -1
- validmind/tests/ongoing_monitoring/CalibrationCurveDrift.py +2 -2
- validmind/tests/ongoing_monitoring/ClassDiscriminationDrift.py +2 -2
- validmind/tests/ongoing_monitoring/ClassImbalanceDrift.py +2 -2
- validmind/tests/ongoing_monitoring/ClassificationAccuracyDrift.py +2 -2
- validmind/tests/ongoing_monitoring/ConfusionMatrixDrift.py +2 -2
- validmind/tests/ongoing_monitoring/CumulativePredictionProbabilitiesDrift.py +2 -2
- validmind/tests/ongoing_monitoring/FeatureDrift.py +5 -2
- validmind/tests/ongoing_monitoring/PredictionAcrossEachFeature.py +6 -1
- validmind/tests/ongoing_monitoring/PredictionCorrelation.py +8 -1
- validmind/tests/ongoing_monitoring/PredictionProbabilitiesHistogramDrift.py +2 -2
- validmind/tests/ongoing_monitoring/PredictionQuantilesAcrossFeatures.py +6 -1
- validmind/tests/ongoing_monitoring/ROCCurveDrift.py +4 -2
- validmind/tests/ongoing_monitoring/ScoreBandsDrift.py +2 -2
- validmind/tests/ongoing_monitoring/ScorecardHistogramDrift.py +2 -2
- validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py +8 -1
- validmind/tests/output.py +9 -2
- validmind/tests/plots/BoxPlot.py +260 -0
- validmind/tests/plots/CorrelationHeatmap.py +235 -0
- validmind/tests/plots/HistogramPlot.py +233 -0
- validmind/tests/plots/ViolinPlot.py +125 -0
- validmind/tests/plots/__init__.py +0 -0
- validmind/tests/prompt_validation/Bias.py +5 -1
- validmind/tests/prompt_validation/Clarity.py +5 -1
- validmind/tests/prompt_validation/Conciseness.py +5 -1
- validmind/tests/prompt_validation/Delimitation.py +5 -1
- validmind/tests/prompt_validation/NegativeInstruction.py +5 -1
- validmind/tests/prompt_validation/Robustness.py +5 -1
- validmind/tests/prompt_validation/Specificity.py +5 -1
- validmind/tests/stats/CorrelationAnalysis.py +251 -0
- validmind/tests/stats/DescriptiveStats.py +197 -0
- validmind/tests/stats/NormalityTests.py +147 -0
- validmind/tests/stats/OutlierDetection.py +173 -0
- validmind/tests/stats/__init__.py +0 -0
- validmind/unit_metrics/classification/Accuracy.py +2 -1
- validmind/unit_metrics/classification/F1.py +2 -1
- validmind/unit_metrics/classification/Precision.py +2 -1
- validmind/unit_metrics/classification/ROC_AUC.py +2 -1
- validmind/unit_metrics/classification/Recall.py +2 -1
- validmind/unit_metrics/classification/individual/AbsoluteError.py +42 -0
- validmind/unit_metrics/classification/individual/BrierScore.py +56 -0
- validmind/unit_metrics/classification/individual/CalibrationError.py +77 -0
- validmind/unit_metrics/classification/individual/ClassBalance.py +65 -0
- validmind/unit_metrics/classification/individual/Confidence.py +52 -0
- validmind/unit_metrics/classification/individual/Correctness.py +41 -0
- validmind/unit_metrics/classification/individual/LogLoss.py +61 -0
- validmind/unit_metrics/classification/individual/OutlierScore.py +86 -0
- validmind/unit_metrics/classification/individual/ProbabilityError.py +54 -0
- validmind/unit_metrics/classification/individual/Uncertainty.py +60 -0
- validmind/unit_metrics/classification/individual/__init__.py +0 -0
- validmind/unit_metrics/regression/AdjustedRSquaredScore.py +2 -1
- validmind/unit_metrics/regression/GiniCoefficient.py +2 -1
- validmind/unit_metrics/regression/HuberLoss.py +2 -1
- validmind/unit_metrics/regression/KolmogorovSmirnovStatistic.py +2 -1
- validmind/unit_metrics/regression/MeanAbsoluteError.py +2 -1
- validmind/unit_metrics/regression/MeanAbsolutePercentageError.py +2 -1
- validmind/unit_metrics/regression/MeanBiasDeviation.py +2 -1
- validmind/unit_metrics/regression/MeanSquaredError.py +2 -1
- validmind/unit_metrics/regression/QuantileLoss.py +1 -1
- validmind/unit_metrics/regression/RSquaredScore.py +2 -1
- validmind/unit_metrics/regression/RootMeanSquaredError.py +2 -1
- validmind/vm_models/dataset/dataset.py +291 -38
- validmind/vm_models/result/result.py +26 -4
- {validmind-2.8.28.dist-info → validmind-2.9.1.dist-info}/METADATA +2 -2
- {validmind-2.8.28.dist-info → validmind-2.9.1.dist-info}/RECORD +233 -212
- {validmind-2.8.28.dist-info → validmind-2.9.1.dist-info}/LICENSE +0 -0
- {validmind-2.8.28.dist-info → validmind-2.9.1.dist-info}/WHEEL +0 -0
- {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()
|
File without changes
|
@@ -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(
|