validmind 2.13.6__tar.gz → 2.13.8__tar.gz
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-2.13.6 → validmind-2.13.8}/PKG-INFO +1 -1
- {validmind-2.13.6 → validmind-2.13.8}/pyproject.toml +1 -1
- validmind-2.13.8/validmind/__version__.py +1 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/api_client.py +2 -2
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/CalibrationCurve.py +10 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/ConfusionMatrix.py +10 -5
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/OverfitDiagnosis.py +41 -1
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.py +146 -23
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py +95 -9
- validmind-2.13.8/validmind/tests/model_validation/sklearn/ROCCurve.py +204 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py +43 -3
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py +40 -19
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.py +9 -0
- validmind-2.13.8/validmind/tests/model_validation/sklearn/_diagnosis_metrics.py +126 -0
- validmind-2.13.8/validmind/tests/model_validation/sklearn/_multiclass_proba.py +150 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/GINITable.py +67 -2
- validmind-2.13.6/validmind/__version__.py +0 -1
- validmind-2.13.6/validmind/tests/model_validation/sklearn/ROCCurve.py +0 -112
- {validmind-2.13.6 → validmind-2.13.8}/.gitignore +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/LICENSE +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/README.pypi.md +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/ai/test_descriptions.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/ai/utils.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/client.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/client_config.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/credentials_store.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/classification/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/classification/config.json +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/classification/customer_churn.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/classification/datasets/bank_customer_churn.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/classification/datasets/taiwan_credit.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/classification/taiwan_credit.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/cluster/digits.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/credit_risk/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/credit_risk/datasets/lending_club_biased.csv.gz +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/credit_risk/datasets/lending_club_loan_data_2007_2014_clean.csv.gz +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/credit_risk/lending_club.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/credit_risk/lending_club_bias.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/llm/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/llm/agent_dataset.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/llm/rag/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_1.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_2.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_3.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_4.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_5.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/llm/rag/rfp.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/nlp/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/nlp/cnn_dailymail.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/nlp/datasets/Covid_19.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/nlp/datasets/cnn_dailymail_100_with_predictions.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/nlp/datasets/cnn_dailymail_500_with_predictions.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/nlp/datasets/sentiments_with_predictions.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/nlp/twitter_covid_19.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/california_housing.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/california_housing.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred/CPIAUCSL.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred/CSUSHPISA.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred/DRSFRMACBS.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred/FEDFUNDS.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred/GDP.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred/GDPC1.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred/GS10.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred/GS3.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred/GS5.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred/MORTGAGE30US.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred/UNRATE.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred_loan_rates.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred_loan_rates_test_1.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred_loan_rates_test_2.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred_loan_rates_test_3.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred_loan_rates_test_4.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/fred_loan_rates_test_5.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/datasets/leanding_club_loan_rates.csv +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/fred.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/fred_timeseries.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/generate_california_housing_csv.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/datasets/regression/lending_club.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/errors.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/experimental/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/experimental/agents.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/html_templates/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/html_templates/content_blocks.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/input_registry.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/logging.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/models/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/models/foundation.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/models/function.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/models/huggingface.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/models/metadata.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/models/pipeline.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/models/pytorch.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/models/r_model.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/models/sklearn.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/oidc_device.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/classification/AbsoluteError.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/classification/BrierScore.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/classification/CalibrationError.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/classification/ClassBalance.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/classification/Confidence.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/classification/Correctness.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/classification/LogLoss.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/classification/OutlierScore.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/classification/ProbabilityError.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/classification/Uncertainty.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/classification/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/llm/deepeval/AnswerRelevancy.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/llm/deepeval/ArgumentCorrectness.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/llm/deepeval/Bias.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/llm/deepeval/ContextualPrecision.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/llm/deepeval/ContextualRecall.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/llm/deepeval/ContextualRelevancy.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/llm/deepeval/Faithfulness.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/llm/deepeval/GEval.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/llm/deepeval/Hallucination.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/llm/deepeval/PlanAdherence.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/llm/deepeval/PlanQuality.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/llm/deepeval/Summarization.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/llm/deepeval/TaskCompletion.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/llm/deepeval/ToolCorrectness.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/scorers/llm/deepeval/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/template.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/test_suites/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/test_suites/classifier.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/test_suites/cluster.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/test_suites/embeddings.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/test_suites/llm.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/test_suites/nlp.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/test_suites/parameters_optimization.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/test_suites/regression.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/test_suites/statsmodels_timeseries.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/test_suites/summarization.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/test_suites/tabular_datasets.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/test_suites/text_data.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/test_suites/time_series.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/__types__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/_store.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/comparison.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/ACFandPACFPlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/ADF.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/AutoAR.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/AutoMA.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/AutoStationarity.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/BivariateScatterPlots.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/BoxPierce.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/ChiSquaredFeaturesTable.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/ClassImbalance.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/DatasetDescription.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/DatasetSplit.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/DescriptiveStatistics.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/DickeyFullerGLS.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/Duplicates.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/EngleGrangerCoint.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/FeatureTargetCorrelationPlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/HighCardinality.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/HighPearsonCorrelation.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/IQROutliersBarPlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/IQROutliersTable.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/IsolationForestOutliers.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/JarqueBera.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/KPSS.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/LJungBox.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/LaggedCorrelationHeatmap.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/MissingValues.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/MissingValuesBarPlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/MutualInformation.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/PearsonCorrelationMatrix.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/PhillipsPerronArch.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/ProtectedClassesCombination.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/ProtectedClassesDescription.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/ProtectedClassesDisparity.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/RollingStatsPlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/RunsTest.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/ScatterPlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/ScoreBandDefaultRates.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/SeasonalDecompose.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/ShapiroWilk.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/Skewness.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/SpreadPlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/TabularCategoricalBarPlots.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/TabularDateTimeHistograms.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/TabularDescriptionTables.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/TabularNumericalHistograms.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/TargetRateBarPlots.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/TimeSeriesDescription.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/TimeSeriesFrequency.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/TimeSeriesHistogram.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/TimeSeriesLinePlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/TimeSeriesMissingValues.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/TimeSeriesOutliers.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/TooManyZeroValues.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/UniqueRows.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/WOEBinPlots.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/WOEBinTable.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/ZivotAndrewsArch.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/nlp/CommonWords.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/nlp/Hashtags.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/nlp/LanguageDetection.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/nlp/Mentions.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/nlp/Punctuations.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/nlp/Sentiment.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/nlp/StopWords.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/nlp/TextDescription.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/nlp/Toxicity.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/data_validation/nlp/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/decorator.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/load.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/BertScore.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/BleuScore.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/ClusterSizeDistribution.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/ContextualRecall.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/FeaturesAUC.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/MeteorScore.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/ModelMetadata.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/ModelPredictionResiduals.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/RegardScore.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/RegressionResidualsPlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/RougeScore.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/TimeSeriesPredictionWithCI.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/TimeSeriesPredictionsPlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/TokenDisparity.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/ToxicityScore.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/embeddings/ClusterDistribution.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/embeddings/CosineSimilarityComparison.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/embeddings/CosineSimilarityDistribution.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/embeddings/CosineSimilarityHeatmap.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/embeddings/DescriptiveAnalytics.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/embeddings/EmbeddingsVisualization2D.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/embeddings/EuclideanDistanceComparison.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/embeddings/EuclideanDistanceHeatmap.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/embeddings/PCAComponentsPairwisePlots.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/embeddings/StabilityAnalysisKeyword.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/embeddings/StabilityAnalysisRandomNoise.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/embeddings/StabilityAnalysisSynonyms.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/embeddings/StabilityAnalysisTranslation.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/embeddings/TSNEComponentsPairwisePlots.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/embeddings/utils.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/ragas/AnswerCorrectness.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/ragas/AspectCritic.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/ragas/ContextEntityRecall.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/ragas/ContextPrecision.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/ragas/ContextPrecisionWithoutReference.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/ragas/ContextRecall.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/ragas/Faithfulness.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/ragas/NoiseSensitivity.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/ragas/ResponseRelevancy.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/ragas/SemanticSimilarity.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/ragas/utils.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/AdjustedRandIndex.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/ClassifierPerformance.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/CompletenessScore.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/FeatureImportance.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/HomogeneityScore.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/HyperParametersTuning.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/MinimumAccuracy.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/MinimumF1Score.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/ModelParameters.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/RegressionErrors.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/RegressionPerformance.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/RegressionR2Square.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/SilhouettePlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/TrainingTestDegradation.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/VMeasure.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/AutoARIMA.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/Lilliefors.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/RegressionCoeffs.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/RegressionModelSummary.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/ScorecardHistogram.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/statsmodels/statsutils.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/ongoing_monitoring/CalibrationCurveDrift.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/ongoing_monitoring/ClassDiscriminationDrift.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/ongoing_monitoring/ClassImbalanceDrift.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/ongoing_monitoring/ClassificationAccuracyDrift.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/ongoing_monitoring/ConfusionMatrixDrift.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/ongoing_monitoring/CumulativePredictionProbabilitiesDrift.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/ongoing_monitoring/FeatureDrift.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/ongoing_monitoring/PredictionAcrossEachFeature.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/ongoing_monitoring/PredictionCorrelation.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/ongoing_monitoring/PredictionProbabilitiesHistogramDrift.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/ongoing_monitoring/PredictionQuantilesAcrossFeatures.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/ongoing_monitoring/ROCCurveDrift.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/ongoing_monitoring/ScoreBandsDrift.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/ongoing_monitoring/ScorecardHistogramDrift.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/output.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/plots/BoxPlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/plots/CorrelationHeatmap.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/plots/HistogramPlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/plots/ViolinPlot.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/plots/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/prompt_validation/Bias.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/prompt_validation/Clarity.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/prompt_validation/Conciseness.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/prompt_validation/Delimitation.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/prompt_validation/NegativeInstruction.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/prompt_validation/Robustness.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/prompt_validation/Specificity.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/prompt_validation/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/prompt_validation/ai_powered_test.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/run.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/stats/CorrelationAnalysis.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/stats/DescriptiveStats.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/stats/NormalityTests.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/stats/OutlierDetection.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/stats/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/test_providers.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/tests/utils.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/classification/Accuracy.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/classification/F1.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/classification/Precision.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/classification/ROC_AUC.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/classification/Recall.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/regression/AdjustedRSquaredScore.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/regression/GiniCoefficient.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/regression/HuberLoss.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/regression/KolmogorovSmirnovStatistic.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/regression/MeanAbsoluteError.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/regression/MeanAbsolutePercentageError.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/regression/MeanBiasDeviation.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/regression/MeanSquaredError.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/regression/QuantileLoss.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/regression/RSquaredScore.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/unit_metrics/regression/RootMeanSquaredError.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/utils.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/dataset/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/dataset/dataset.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/dataset/utils.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/figure.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/html_progress.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/html_renderer.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/input.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/model.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/result/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/result/pii_filter.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/result/result.jinja +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/result/result.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/result/utils.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/test_suite/__init__.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/test_suite/runner.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/test_suite/summary.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/test_suite/test.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/test_suite/test_suite.py +0 -0
- {validmind-2.13.6 → validmind-2.13.8}/validmind/vm_models/text_generation_summary.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: validmind
|
|
3
|
-
Version: 2.13.
|
|
3
|
+
Version: 2.13.8
|
|
4
4
|
Summary: ValidMind Library
|
|
5
5
|
Author-email: Andres Rodriguez <andres@validmind.ai>, Juan Martinez <juan@validmind.ai>, Anil Sorathiya <anil@validmind.ai>, Luis Pallares <luis@validmind.ai>, John Walz <john@validmind.ai>
|
|
6
6
|
License: DUAL LICENSE NOTICE
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.13.8"
|
|
@@ -317,7 +317,7 @@ def init(
|
|
|
317
317
|
Can be set via env ``VM_OIDC_ISSUER``.
|
|
318
318
|
client_id (str, optional): OAuth public client id for device flow. Can be
|
|
319
319
|
set via env ``VM_OIDC_CLIENT_ID``.
|
|
320
|
-
scope (str, optional): OAuth scopes (default ``openid profile email``).
|
|
320
|
+
scope (str, optional): OAuth scopes (default ``openid profile email offline_access``).
|
|
321
321
|
Can be set via env ``VM_OIDC_SCOPE``.
|
|
322
322
|
audience (str, optional): Resource / API identifier for the access token
|
|
323
323
|
(e.g. Auth0 API Identifier). Use the same value the ValidMind backend
|
|
@@ -392,7 +392,7 @@ def init(
|
|
|
392
392
|
_api_key = None
|
|
393
393
|
_api_secret = None
|
|
394
394
|
_api_host = resolved_host
|
|
395
|
-
scope_val = oidc_scope or "openid profile email"
|
|
395
|
+
scope_val = oidc_scope or "openid profile email offline_access"
|
|
396
396
|
from .credentials_store import normalize_audience
|
|
397
397
|
|
|
398
398
|
oidc_audience_val = normalize_audience(
|
{validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/CalibrationCurve.py
RENAMED
|
@@ -4,10 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
from typing import Tuple
|
|
6
6
|
|
|
7
|
+
import numpy as np
|
|
7
8
|
import plotly.graph_objects as go
|
|
8
9
|
from sklearn.calibration import calibration_curve
|
|
9
10
|
|
|
10
11
|
from validmind import tags, tasks
|
|
12
|
+
from validmind.errors import SkipTestError
|
|
11
13
|
from validmind.vm_models import VMDataset, VMModel
|
|
12
14
|
from validmind.vm_models.result import RawData
|
|
13
15
|
|
|
@@ -70,6 +72,14 @@ def CalibrationCurve(
|
|
|
70
72
|
- Assumes bin boundaries are appropriate for the problem
|
|
71
73
|
- May be affected by class imbalance
|
|
72
74
|
"""
|
|
75
|
+
# Binary-only by design: sklearn's calibration_curve raises a cryptic
|
|
76
|
+
# "pos_label is not specified" error on multiclass targets, so skip cleanly
|
|
77
|
+
# like ROCCurve/PrecisionRecallCurve rather than crashing.
|
|
78
|
+
if len(np.unique(dataset.y)) > 2:
|
|
79
|
+
raise SkipTestError(
|
|
80
|
+
"Calibration Curve is only supported for binary classification models"
|
|
81
|
+
)
|
|
82
|
+
|
|
73
83
|
prob_true, prob_pred = calibration_curve(
|
|
74
84
|
dataset.y, dataset.y_prob(model), n_bins=n_bins
|
|
75
85
|
)
|
{validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/ConfusionMatrix.py
RENAMED
|
@@ -72,15 +72,20 @@ def ConfusionMatrix(
|
|
|
72
72
|
- It mainly serves as a descriptive tool and does not offer the capability for statistical hypothesis testing.
|
|
73
73
|
- Risks of misinterpretation exist because the matrix doesn't directly provide precision, recall, or F1-score data.
|
|
74
74
|
These metrics have to be computed separately.
|
|
75
|
+
- The `threshold` parameter only applies to binary classification (it splits a single positive-class probability
|
|
76
|
+
into two classes). For multiclass targets the model's argmax class predictions are used and `threshold` is ignored.
|
|
75
77
|
"""
|
|
76
|
-
#
|
|
77
|
-
|
|
78
|
+
# The `threshold` only has a meaning for binary classification (it splits a
|
|
79
|
+
# single positive-class probability into two classes). For multiclass we use
|
|
80
|
+
# the model's argmax class predictions directly, since thresholding a
|
|
81
|
+
# single probability column would silently produce wrong labels.
|
|
82
|
+
n_classes = len(np.unique(dataset.y))
|
|
83
|
+
if n_classes == 2 and hasattr(model.model, "predict_proba"):
|
|
78
84
|
y_prob = dataset.y_prob(model)
|
|
79
85
|
# Handle both 1D and 2D probability arrays
|
|
80
86
|
if y_prob.ndim == 2:
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
y_pred = (y_prob > threshold).astype(int)
|
|
87
|
+
y_prob = y_prob[:, 1]
|
|
88
|
+
y_pred = (y_prob > threshold).astype(int)
|
|
84
89
|
else:
|
|
85
90
|
y_pred = dataset.y_pred(model)
|
|
86
91
|
|
{validmind-2.13.6 → validmind-2.13.8}/validmind/tests/model_validation/sklearn/OverfitDiagnosis.py
RENAMED
|
@@ -15,6 +15,8 @@ from validmind import RawData, tags, tasks
|
|
|
15
15
|
from validmind.logging import get_logger
|
|
16
16
|
from validmind.vm_models import VMDataset, VMModel
|
|
17
17
|
|
|
18
|
+
from ._diagnosis_metrics import bind_averaging, full_labels, multiclass_auc
|
|
19
|
+
|
|
18
20
|
logger = get_logger(__name__)
|
|
19
21
|
|
|
20
22
|
# TODO: A couple of improvements here could be to:
|
|
@@ -96,6 +98,10 @@ def _compute_metrics(
|
|
|
96
98
|
feature_column: str,
|
|
97
99
|
metric: str,
|
|
98
100
|
is_classification: bool,
|
|
101
|
+
average: str = None,
|
|
102
|
+
pos_label=None,
|
|
103
|
+
labels: list = None,
|
|
104
|
+
is_multiclass: bool = False,
|
|
99
105
|
) -> None:
|
|
100
106
|
results["slice"].append(str(region))
|
|
101
107
|
results["shape"].append(df_region.shape[0])
|
|
@@ -115,11 +121,25 @@ def _compute_metrics(
|
|
|
115
121
|
if len(np.unique(y_true)) == 1:
|
|
116
122
|
return results[metric].append(0)
|
|
117
123
|
|
|
124
|
+
# The library retains only a single probability column, so a
|
|
125
|
+
# probability-based multiclass ROC AUC is not possible; fall back to the
|
|
126
|
+
# label-binarize convention used elsewhere for multiclass targets.
|
|
127
|
+
if is_multiclass:
|
|
128
|
+
return results[metric].append(
|
|
129
|
+
multiclass_auc(y_true, df_region[pred_column].values, labels)
|
|
130
|
+
)
|
|
131
|
+
|
|
118
132
|
return results[metric].append(
|
|
119
133
|
metric_func(y_true, df_region[prob_column].values)
|
|
120
134
|
)
|
|
121
135
|
|
|
122
|
-
|
|
136
|
+
# Bind averaging so precision/recall/F1 handle multiclass targets and binary
|
|
137
|
+
# targets encoded outside {0, 1}; accuracy and regression metrics pass through.
|
|
138
|
+
return results[metric].append(
|
|
139
|
+
bind_averaging(metric_func, average, pos_label)(
|
|
140
|
+
y_true, df_region[pred_column].values
|
|
141
|
+
)
|
|
142
|
+
)
|
|
123
143
|
|
|
124
144
|
|
|
125
145
|
def _plot_overfit_regions(
|
|
@@ -253,6 +273,18 @@ def OverfitDiagnosis(
|
|
|
253
273
|
train_df[prob_column] = datasets[0].y_prob(model)
|
|
254
274
|
test_df[prob_column] = datasets[1].y_prob(model)
|
|
255
275
|
|
|
276
|
+
# Resolve the label space once so every feature slice is scored consistently:
|
|
277
|
+
# multiclass targets use macro averaging (and label-binarize AUC), binary
|
|
278
|
+
# targets keep the positive label so non-{0, 1} encodings don't break.
|
|
279
|
+
if is_classification:
|
|
280
|
+
labels = full_labels(datasets, model)
|
|
281
|
+
is_multiclass = len(labels) > 2
|
|
282
|
+
average, pos_label = (
|
|
283
|
+
("macro", None) if is_multiclass else ("binary", labels[-1])
|
|
284
|
+
)
|
|
285
|
+
else:
|
|
286
|
+
labels, is_multiclass, average, pos_label = None, False, None, None
|
|
287
|
+
|
|
256
288
|
test_results = []
|
|
257
289
|
figures = []
|
|
258
290
|
results_headers = ["slice", "shape", "feature", metric]
|
|
@@ -277,6 +309,10 @@ def OverfitDiagnosis(
|
|
|
277
309
|
pred_column=pred_column,
|
|
278
310
|
metric=metric,
|
|
279
311
|
is_classification=is_classification,
|
|
312
|
+
average=average,
|
|
313
|
+
pos_label=pos_label,
|
|
314
|
+
labels=labels,
|
|
315
|
+
is_multiclass=is_multiclass,
|
|
280
316
|
)
|
|
281
317
|
df_test_region = test_df[
|
|
282
318
|
(test_df[feature_column] > region.left)
|
|
@@ -292,6 +328,10 @@ def OverfitDiagnosis(
|
|
|
292
328
|
pred_column=pred_column,
|
|
293
329
|
metric=metric,
|
|
294
330
|
is_classification=is_classification,
|
|
331
|
+
average=average,
|
|
332
|
+
pos_label=pos_label,
|
|
333
|
+
labels=labels,
|
|
334
|
+
is_multiclass=is_multiclass,
|
|
295
335
|
)
|
|
296
336
|
|
|
297
337
|
results = _prepare_results(results_train, results_test, metric)
|
|
@@ -7,14 +7,19 @@ from typing import Dict, List, Tuple
|
|
|
7
7
|
import numpy as np
|
|
8
8
|
import pandas as pd
|
|
9
9
|
import plotly.graph_objects as go
|
|
10
|
+
from plotly.subplots import make_subplots
|
|
10
11
|
|
|
11
12
|
from validmind import RawData, tags, tasks
|
|
12
13
|
from validmind.errors import SkipTestError
|
|
13
14
|
from validmind.logging import get_logger
|
|
14
15
|
from validmind.vm_models import VMDataset, VMModel
|
|
15
16
|
|
|
17
|
+
from ._multiclass_proba import multiclass_proba, proba_matrix
|
|
18
|
+
|
|
16
19
|
logger = get_logger(__name__)
|
|
17
20
|
|
|
21
|
+
_PSI_PALETTE = ["#DE257E", "#1F77B4", "#2CA02C", "#FF7F0E", "#9467BD", "#8C564B"]
|
|
22
|
+
|
|
18
23
|
|
|
19
24
|
def calculate_psi(score_initial, score_new, num_bins=10, mode="fixed"):
|
|
20
25
|
"""
|
|
@@ -76,6 +81,135 @@ def calculate_psi(score_initial, score_new, num_bins=10, mode="fixed"):
|
|
|
76
81
|
return psi_df.to_dict(orient="records")
|
|
77
82
|
|
|
78
83
|
|
|
84
|
+
def _psi_table_rows(psi_results):
|
|
85
|
+
"""Append the summed 'Total' row and format PSI records as table rows."""
|
|
86
|
+
total_psi = {
|
|
87
|
+
key: sum(d.get(key, 0) for d in psi_results)
|
|
88
|
+
for key in psi_results[0].keys()
|
|
89
|
+
if isinstance(psi_results[0][key], (int, float))
|
|
90
|
+
}
|
|
91
|
+
rows_with_total = psi_results + [total_psi]
|
|
92
|
+
|
|
93
|
+
table_rows = [
|
|
94
|
+
{
|
|
95
|
+
"Bin": (
|
|
96
|
+
i if i < (len(rows_with_total) - 1) else "Total"
|
|
97
|
+
), # The last bin is the "Total" bin
|
|
98
|
+
"Count Initial": values["initial"],
|
|
99
|
+
"Percent Initial (%)": values["percent_initial"] * 100,
|
|
100
|
+
"Count New": values["new"],
|
|
101
|
+
"Percent New (%)": values["percent_new"] * 100,
|
|
102
|
+
"PSI": values["psi"],
|
|
103
|
+
}
|
|
104
|
+
for i, values in enumerate(rows_with_total)
|
|
105
|
+
]
|
|
106
|
+
return rows_with_total, table_rows
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def _multiclass_psi(datasets, model, num_bins, mode):
|
|
110
|
+
"""One-vs-rest PSI for a multiclass model.
|
|
111
|
+
|
|
112
|
+
PSI needs a 1-D score distribution to compare across the two datasets. The
|
|
113
|
+
stored single probability column cannot represent every class, so the shared
|
|
114
|
+
helper reaches the underlying estimator for the full per-class probability
|
|
115
|
+
matrix (mirroring the ROC/PR curve tests), aligning columns to the training
|
|
116
|
+
class order. The initial dataset drives the class alignment and the set of
|
|
117
|
+
classes actually present; the new dataset's matrix is validated against the
|
|
118
|
+
same class list. Models that cannot supply a matching matrix are skipped.
|
|
119
|
+
"""
|
|
120
|
+
aligned = multiclass_proba(model, datasets[0], "Population Stability Index")
|
|
121
|
+
prob_initial = aligned.y_prob
|
|
122
|
+
prob_new = proba_matrix(
|
|
123
|
+
model, datasets[1], aligned.class_list, "Population Stability Index"
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
classes_present = aligned.classes_present
|
|
127
|
+
n_present = len(classes_present)
|
|
128
|
+
|
|
129
|
+
fig = make_subplots(
|
|
130
|
+
rows=n_present,
|
|
131
|
+
cols=1,
|
|
132
|
+
specs=[[{"secondary_y": True}] for _ in range(n_present)],
|
|
133
|
+
subplot_titles=[f"Class {cls}" for cls in classes_present],
|
|
134
|
+
vertical_spacing=0.08,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
tables = {}
|
|
138
|
+
raw_per_class = {}
|
|
139
|
+
for plot_i, (i, cls) in enumerate(zip(aligned.present_indices, classes_present)):
|
|
140
|
+
psi_results = calculate_psi(
|
|
141
|
+
prob_initial[:, i].copy(),
|
|
142
|
+
prob_new[:, i].copy(),
|
|
143
|
+
num_bins=num_bins,
|
|
144
|
+
mode=mode,
|
|
145
|
+
)
|
|
146
|
+
x = list(range(len(psi_results)))
|
|
147
|
+
color = _PSI_PALETTE[plot_i % len(_PSI_PALETTE)]
|
|
148
|
+
fig.add_trace(
|
|
149
|
+
go.Bar(
|
|
150
|
+
x=x,
|
|
151
|
+
y=[d["percent_initial"] for d in psi_results],
|
|
152
|
+
name="Initial",
|
|
153
|
+
marker=dict(color="#DE257E"),
|
|
154
|
+
showlegend=plot_i == 0,
|
|
155
|
+
legendgroup="initial",
|
|
156
|
+
),
|
|
157
|
+
row=plot_i + 1,
|
|
158
|
+
col=1,
|
|
159
|
+
secondary_y=False,
|
|
160
|
+
)
|
|
161
|
+
fig.add_trace(
|
|
162
|
+
go.Bar(
|
|
163
|
+
x=x,
|
|
164
|
+
y=[d["percent_new"] for d in psi_results],
|
|
165
|
+
name="New",
|
|
166
|
+
marker=dict(color="#E8B1F8"),
|
|
167
|
+
showlegend=plot_i == 0,
|
|
168
|
+
legendgroup="new",
|
|
169
|
+
),
|
|
170
|
+
row=plot_i + 1,
|
|
171
|
+
col=1,
|
|
172
|
+
secondary_y=False,
|
|
173
|
+
)
|
|
174
|
+
fig.add_trace(
|
|
175
|
+
go.Scatter(
|
|
176
|
+
x=x,
|
|
177
|
+
y=[d["psi"] for d in psi_results],
|
|
178
|
+
name="PSI",
|
|
179
|
+
line=dict(color=color),
|
|
180
|
+
showlegend=plot_i == 0,
|
|
181
|
+
legendgroup="psi",
|
|
182
|
+
),
|
|
183
|
+
row=plot_i + 1,
|
|
184
|
+
col=1,
|
|
185
|
+
secondary_y=True,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
rows_with_total, table_rows = _psi_table_rows(psi_results)
|
|
189
|
+
table_title = (
|
|
190
|
+
f"Population Stability Index for Class {cls} "
|
|
191
|
+
f"({datasets[0].input_id} vs {datasets[1].input_id})"
|
|
192
|
+
)
|
|
193
|
+
tables[table_title] = table_rows
|
|
194
|
+
raw_per_class[str(cls)] = rows_with_total
|
|
195
|
+
|
|
196
|
+
fig.update_layout(
|
|
197
|
+
title="Population Stability Index (PSI) — one-vs-rest per class",
|
|
198
|
+
barmode="group",
|
|
199
|
+
height=300 * n_present,
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
return (
|
|
203
|
+
tables,
|
|
204
|
+
fig,
|
|
205
|
+
RawData(
|
|
206
|
+
psi_raw=raw_per_class,
|
|
207
|
+
model=model.input_id,
|
|
208
|
+
datasets=[datasets[0].input_id, datasets[1].input_id],
|
|
209
|
+
),
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
|
|
79
213
|
@tags(
|
|
80
214
|
"sklearn", "binary_classification", "multiclass_classification", "model_performance"
|
|
81
215
|
)
|
|
@@ -132,10 +266,18 @@ def PopulationStabilityIndex(
|
|
|
132
266
|
lead to misinterpretations. Any changes in PSI could be due to shifts in the model (model drift), changes in the
|
|
133
267
|
relationships between features and the target variable (concept drift), or both. However, distinguishing between
|
|
134
268
|
these causes is non-trivial.
|
|
269
|
+
- For multiclass models the PSI is computed one-vs-rest (one table/plot per class), which requires per-class
|
|
270
|
+
probabilities from the model's `predict_proba`. Models that cannot produce a full per-class probability matrix
|
|
271
|
+
(e.g. metadata-only models, or predictions supplied as a single precomputed probability column) are skipped for
|
|
272
|
+
the multiclass case.
|
|
135
273
|
"""
|
|
136
274
|
if model.library in ["statsmodels", "pytorch", "catboost"]:
|
|
137
275
|
raise SkipTestError(f"Skiping PSI for {model.library} models")
|
|
138
276
|
|
|
277
|
+
classes = np.unique(datasets[0].y)
|
|
278
|
+
if len(classes) > 2:
|
|
279
|
+
return _multiclass_psi(datasets, model, num_bins, mode)
|
|
280
|
+
|
|
139
281
|
psi_results = calculate_psi(
|
|
140
282
|
datasets[0].y_prob(model).copy(),
|
|
141
283
|
datasets[1].y_prob(model).copy(),
|
|
@@ -182,35 +324,16 @@ def PopulationStabilityIndex(
|
|
|
182
324
|
),
|
|
183
325
|
)
|
|
184
326
|
|
|
185
|
-
# sum up the PSI values to get the total values
|
|
186
|
-
|
|
187
|
-
key: sum(d.get(key, 0) for d in psi_results)
|
|
188
|
-
for key in psi_results[0].keys()
|
|
189
|
-
if isinstance(psi_results[0][key], (int, float))
|
|
190
|
-
}
|
|
191
|
-
psi_results.append(total_psi)
|
|
327
|
+
# sum up the PSI values to get the total values and format the table rows
|
|
328
|
+
rows_with_total, table_rows = _psi_table_rows(psi_results)
|
|
192
329
|
|
|
193
330
|
table_title = f"Population Stability Index for {datasets[0].input_id} and {datasets[1].input_id} Datasets"
|
|
194
331
|
|
|
195
332
|
return (
|
|
196
|
-
{
|
|
197
|
-
table_title: [
|
|
198
|
-
{
|
|
199
|
-
"Bin": (
|
|
200
|
-
i if i < (len(psi_results) - 1) else "Total"
|
|
201
|
-
), # The last bin is the "Total" bin
|
|
202
|
-
"Count Initial": values["initial"],
|
|
203
|
-
"Percent Initial (%)": values["percent_initial"] * 100,
|
|
204
|
-
"Count New": values["new"],
|
|
205
|
-
"Percent New (%)": values["percent_new"] * 100,
|
|
206
|
-
"PSI": values["psi"],
|
|
207
|
-
}
|
|
208
|
-
for i, values in enumerate(psi_results)
|
|
209
|
-
],
|
|
210
|
-
},
|
|
333
|
+
{table_title: table_rows},
|
|
211
334
|
fig,
|
|
212
335
|
RawData(
|
|
213
|
-
psi_raw=
|
|
336
|
+
psi_raw=rows_with_total,
|
|
214
337
|
model=model.input_id,
|
|
215
338
|
datasets=[datasets[0].input_id, datasets[1].input_id],
|
|
216
339
|
),
|
|
@@ -6,15 +6,23 @@ from typing import Tuple
|
|
|
6
6
|
|
|
7
7
|
import numpy as np
|
|
8
8
|
import plotly.graph_objects as go
|
|
9
|
-
from sklearn.metrics import precision_recall_curve
|
|
9
|
+
from sklearn.metrics import average_precision_score, precision_recall_curve
|
|
10
10
|
|
|
11
11
|
from validmind import RawData, tags, tasks
|
|
12
12
|
from validmind.errors import SkipTestError
|
|
13
13
|
from validmind.models import FoundationModel
|
|
14
14
|
from validmind.vm_models import VMDataset, VMModel
|
|
15
15
|
|
|
16
|
+
from ._multiclass_proba import multiclass_proba
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
|
|
19
|
+
@tags(
|
|
20
|
+
"sklearn",
|
|
21
|
+
"binary_classification",
|
|
22
|
+
"multiclass_classification",
|
|
23
|
+
"model_performance",
|
|
24
|
+
"visualization",
|
|
25
|
+
)
|
|
18
26
|
@tasks("classification", "text_classification")
|
|
19
27
|
def PrecisionRecallCurve(
|
|
20
28
|
model: VMModel, dataset: VMDataset
|
|
@@ -54,8 +62,10 @@ def PrecisionRecallCurve(
|
|
|
54
62
|
|
|
55
63
|
### Limitations
|
|
56
64
|
|
|
57
|
-
-
|
|
58
|
-
|
|
65
|
+
- For multiclass models the curve is computed one-vs-rest (one curve per class plus a micro-average), which
|
|
66
|
+
requires per-class probabilities from the model's `predict_proba`. Models that cannot produce a full per-class
|
|
67
|
+
probability matrix (e.g. Foundation/metadata-only models, or predictions supplied as a single precomputed
|
|
68
|
+
probability column) are skipped for the multiclass case.
|
|
59
69
|
- It may not fully represent the overall accuracy of the model if the cost of false positives and false negatives
|
|
60
70
|
are extremely different, or if the dataset is heavily imbalanced.
|
|
61
71
|
"""
|
|
@@ -63,11 +73,10 @@ def PrecisionRecallCurve(
|
|
|
63
73
|
raise SkipTestError("Skipping PrecisionRecallCurve for Foundation models")
|
|
64
74
|
|
|
65
75
|
y_true = dataset.y
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
)
|
|
76
|
+
classes = np.unique(y_true)
|
|
77
|
+
|
|
78
|
+
if len(classes) > 2:
|
|
79
|
+
return _multiclass_pr_curve(model, dataset)
|
|
71
80
|
|
|
72
81
|
precision, recall, _ = precision_recall_curve(y_true, dataset.y_prob(model))
|
|
73
82
|
|
|
@@ -94,3 +103,80 @@ def PrecisionRecallCurve(
|
|
|
94
103
|
model=model.input_id,
|
|
95
104
|
dataset=dataset.input_id,
|
|
96
105
|
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _multiclass_pr_curve(
|
|
109
|
+
model: VMModel, dataset: VMDataset
|
|
110
|
+
) -> Tuple[go.Figure, RawData]:
|
|
111
|
+
"""One-vs-rest precision-recall curves for a multiclass model.
|
|
112
|
+
|
|
113
|
+
Needs the full per-class probability matrix, which the stored single
|
|
114
|
+
probability column cannot provide; the shared helper reaches the underlying
|
|
115
|
+
estimator, aligns the probability columns to the training class order and
|
|
116
|
+
skips models that cannot supply a matching matrix.
|
|
117
|
+
"""
|
|
118
|
+
aligned = multiclass_proba(model, dataset, "Precision-Recall Curve")
|
|
119
|
+
y_bin = aligned.y_bin
|
|
120
|
+
y_prob = aligned.y_prob
|
|
121
|
+
|
|
122
|
+
traces = []
|
|
123
|
+
raw_precision = {}
|
|
124
|
+
raw_recall = {}
|
|
125
|
+
raw_ap = {}
|
|
126
|
+
palette = ["#DE257E", "#1F77B4", "#2CA02C", "#FF7F0E", "#9467BD", "#8C564B"]
|
|
127
|
+
for plot_i, (i, cls) in enumerate(
|
|
128
|
+
zip(aligned.present_indices, aligned.classes_present)
|
|
129
|
+
):
|
|
130
|
+
precision, recall, _ = precision_recall_curve(y_bin[:, i], y_prob[:, i])
|
|
131
|
+
ap = average_precision_score(y_bin[:, i], y_prob[:, i])
|
|
132
|
+
key = str(cls)
|
|
133
|
+
raw_precision[key] = precision
|
|
134
|
+
raw_recall[key] = recall
|
|
135
|
+
raw_ap[key] = ap
|
|
136
|
+
traces.append(
|
|
137
|
+
go.Scatter(
|
|
138
|
+
x=recall,
|
|
139
|
+
y=precision,
|
|
140
|
+
mode="lines",
|
|
141
|
+
name=f"Class {key} (AP = {ap:.2f})",
|
|
142
|
+
line=dict(color=palette[plot_i % len(palette)]),
|
|
143
|
+
)
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
# Micro-average across the one-vs-rest decisions of the present classes.
|
|
147
|
+
present = aligned.present_indices
|
|
148
|
+
y_bin = y_bin[:, present]
|
|
149
|
+
y_prob = y_prob[:, present]
|
|
150
|
+
micro_precision, micro_recall, _ = precision_recall_curve(
|
|
151
|
+
y_bin.ravel(), y_prob.ravel()
|
|
152
|
+
)
|
|
153
|
+
micro_ap = average_precision_score(y_bin, y_prob, average="micro")
|
|
154
|
+
raw_precision["micro"] = micro_precision
|
|
155
|
+
raw_recall["micro"] = micro_recall
|
|
156
|
+
raw_ap["micro"] = micro_ap
|
|
157
|
+
traces.append(
|
|
158
|
+
go.Scatter(
|
|
159
|
+
x=micro_recall,
|
|
160
|
+
y=micro_precision,
|
|
161
|
+
mode="lines",
|
|
162
|
+
name=f"Micro-average (AP = {micro_ap:.2f})",
|
|
163
|
+
line=dict(color="black", dash="dot"),
|
|
164
|
+
)
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
fig = go.Figure(
|
|
168
|
+
data=traces,
|
|
169
|
+
layout=go.Layout(
|
|
170
|
+
title=f"Precision-Recall Curve (one-vs-rest) for {model.input_id} on {dataset.input_id}",
|
|
171
|
+
xaxis=dict(title="Recall"),
|
|
172
|
+
yaxis=dict(title="Precision"),
|
|
173
|
+
),
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
return fig, RawData(
|
|
177
|
+
precision=raw_precision,
|
|
178
|
+
recall=raw_recall,
|
|
179
|
+
average_precision=raw_ap,
|
|
180
|
+
model=model.input_id,
|
|
181
|
+
dataset=dataset.input_id,
|
|
182
|
+
)
|