validmind 2.5.1__tar.gz → 2.5.6__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.5.1 → validmind-2.5.6}/PKG-INFO +2 -2
- {validmind-2.5.1 → validmind-2.5.6}/pyproject.toml +2 -2
- validmind-2.5.6/validmind/__version__.py +1 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/client.py +6 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/__types__.py +0 -1
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ragas/AnswerCorrectness.py +1 -1
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ragas/AnswerRelevance.py +1 -1
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ragas/AnswerSimilarity.py +1 -1
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ragas/AspectCritique.py +1 -1
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ragas/ContextEntityRecall.py +1 -1
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ragas/ContextPrecision.py +1 -1
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ragas/ContextRecall.py +1 -1
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ragas/Faithfulness.py +1 -1
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/OverfitDiagnosis.py +17 -36
- validmind-2.5.6/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py +379 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/run.py +1 -1
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/dataset/utils.py +9 -2
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/model.py +12 -1
- validmind-2.5.1/validmind/__version__.py +0 -1
- validmind-2.5.1/validmind/tests/model_validation/ragas/ContextRelevancy.py +0 -119
- validmind-2.5.1/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.py +0 -328
- {validmind-2.5.1 → validmind-2.5.6}/LICENSE +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/README.pypi.md +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/ai/test_descriptions.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/ai/utils.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/api_client.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/client_config.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/classification/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/classification/customer_churn.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/classification/datasets/bank_customer_churn.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/classification/datasets/taiwan_credit.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/classification/taiwan_credit.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/cluster/digits.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/credit_risk/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/credit_risk/datasets/lending_club_loan_data_2007_2014_clean.csv.gz +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/credit_risk/lending_club.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/llm/rag/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_1.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_2.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_3.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_4.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/llm/rag/datasets/rfp_existing_questions_client_5.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/llm/rag/rfp.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/nlp/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/nlp/cnn_dailymail.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/nlp/datasets/Covid_19.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/nlp/datasets/cnn_dailymail_100_with_predictions.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/nlp/datasets/cnn_dailymail_500_with_predictions.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/nlp/datasets/sentiments_with_predictions.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/nlp/twitter_covid_19.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/california_housing.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred/CPIAUCSL.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred/CSUSHPISA.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred/DRSFRMACBS.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred/FEDFUNDS.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred/GDP.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred/GDPC1.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred/GS10.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred/GS3.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred/GS5.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred/MORTGAGE30US.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred/UNRATE.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred_loan_rates.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred_loan_rates_test_1.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred_loan_rates_test_2.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred_loan_rates_test_3.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred_loan_rates_test_4.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/fred_loan_rates_test_5.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/datasets/leanding_club_loan_rates.csv +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/fred.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/fred_timeseries.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/lending_club.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/models/fred_loan_rates_model_1.pkl +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/models/fred_loan_rates_model_2.pkl +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/models/fred_loan_rates_model_3.pkl +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/models/fred_loan_rates_model_4.pkl +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/datasets/regression/models/fred_loan_rates_model_5.pkl +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/errors.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/html_templates/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/html_templates/content_blocks.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/input_registry.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/logging.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/models/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/models/foundation.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/models/function.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/models/huggingface.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/models/metadata.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/models/pipeline.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/models/pytorch.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/models/r_model.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/models/sklearn.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/template.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/test_suites/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/test_suites/classifier.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/test_suites/cluster.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/test_suites/embeddings.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/test_suites/llm.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/test_suites/nlp.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/test_suites/parameters_optimization.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/test_suites/regression.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/test_suites/statsmodels_timeseries.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/test_suites/summarization.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/test_suites/tabular_datasets.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/test_suites/text_data.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/test_suites/time_series.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/_store.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/ACFandPACFPlot.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/ADF.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/ANOVAOneWayTable.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/AutoAR.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/AutoMA.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/AutoSeasonality.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/AutoStationarity.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/BivariateFeaturesBarPlots.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/BivariateHistograms.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/BivariateScatterPlots.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/ChiSquaredFeaturesTable.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/ClassImbalance.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/DFGLSArch.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/DatasetDescription.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/DatasetSplit.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/DescriptiveStatistics.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/Duplicates.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/EngleGrangerCoint.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/FeatureTargetCorrelationPlot.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/HeatmapFeatureCorrelations.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/HighCardinality.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/HighPearsonCorrelation.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/IQROutliersBarPlot.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/IQROutliersTable.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/IsolationForestOutliers.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/KPSS.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/LaggedCorrelationHeatmap.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/MissingValues.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/MissingValuesBarPlot.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/MissingValuesRisk.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/PearsonCorrelationMatrix.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/PhillipsPerronArch.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/RollingStatsPlot.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/ScatterPlot.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/SeasonalDecompose.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/Skewness.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/SpreadPlot.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/TabularCategoricalBarPlots.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/TabularDateTimeHistograms.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/TabularDescriptionTables.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/TabularNumericalHistograms.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/TargetRateBarPlots.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/TimeSeriesDescription.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/TimeSeriesFrequency.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/TimeSeriesHistogram.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/TimeSeriesLinePlot.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/TimeSeriesMissingValues.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/TimeSeriesOutliers.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/TooManyZeroValues.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/UniqueRows.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/WOEBinPlots.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/WOEBinTable.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/ZivotAndrewsArch.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/nlp/CommonWords.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/nlp/Hashtags.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/nlp/LanguageDetection.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/nlp/Mentions.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/nlp/Punctuations.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/nlp/Sentiment.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/nlp/StopWords.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/nlp/TextDescription.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/nlp/Toxicity.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/data_validation/nlp/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/decorator.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/load.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/metadata.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/BertScore.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/BleuScore.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ClusterSizeDistribution.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ContextualRecall.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/FeaturesAUC.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/MeteorScore.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ModelMetadata.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ModelMetadataComparison.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ModelPredictionResiduals.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/RegardScore.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/RegressionResidualsPlot.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/RougeScore.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/TimeSeriesPredictionWithCI.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/TimeSeriesPredictionsPlot.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/TokenDisparity.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ToxicityScore.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/embeddings/ClusterDistribution.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/embeddings/CosineSimilarityComparison.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/embeddings/CosineSimilarityDistribution.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/embeddings/CosineSimilarityHeatmap.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/embeddings/DescriptiveAnalytics.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/embeddings/EmbeddingsVisualization2D.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/embeddings/EuclideanDistanceComparison.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/embeddings/EuclideanDistanceHeatmap.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/embeddings/PCAComponentsPairwisePlots.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/embeddings/StabilityAnalysis.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/embeddings/StabilityAnalysisKeyword.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/embeddings/StabilityAnalysisRandomNoise.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/embeddings/StabilityAnalysisSynonyms.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/embeddings/StabilityAnalysisTranslation.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/embeddings/TSNEComponentsPairwisePlots.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ragas/utils.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/AdjustedRandIndex.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/ClassifierPerformance.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/ClusterPerformance.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/CompletenessScore.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/ConfusionMatrix.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/FeatureImportanceComparison.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/HomogeneityScore.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/HyperParametersTuning.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/MinimumAccuracy.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/MinimumF1Score.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/ROCCurve.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/RegressionErrors.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/RegressionModelsPerformanceComparison.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/RegressionR2Square.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/SilhouettePlot.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/TrainingTestDegradation.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/VMeasure.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/AutoARIMA.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/BoxPierce.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/GINITable.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/JarqueBera.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/LJungBox.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/Lilliefors.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/RegressionCoeffsPlot.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/RegressionModelSummary.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/RegressionModelsCoeffs.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/RunsTest.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/ScorecardHistogram.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/ShapiroWilk.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/statsmodels/statsutils.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/ongoing_monitoring/FeatureDrift.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/ongoing_monitoring/PredictionAcrossEachFeature.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/ongoing_monitoring/PredictionCorrelation.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/prompt_validation/Bias.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/prompt_validation/Clarity.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/prompt_validation/Conciseness.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/prompt_validation/Delimitation.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/prompt_validation/NegativeInstruction.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/prompt_validation/Robustness.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/prompt_validation/Specificity.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/prompt_validation/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/prompt_validation/ai_powered_test.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/test_providers.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/tests/utils.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/classification/sklearn/Accuracy.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/classification/sklearn/F1.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/classification/sklearn/Precision.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/classification/sklearn/ROC_AUC.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/classification/sklearn/Recall.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/composite.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/regression/GiniCoefficient.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/regression/HuberLoss.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/regression/KolmogorovSmirnovStatistic.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/regression/MeanAbsolutePercentageError.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/regression/MeanBiasDeviation.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/regression/QuantileLoss.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/regression/sklearn/AdjustedRSquaredScore.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/regression/sklearn/MeanAbsoluteError.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/regression/sklearn/MeanSquaredError.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/regression/sklearn/RSquaredScore.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/unit_metrics/regression/sklearn/RootMeanSquaredError.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/utils.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/dataset/__init__.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/dataset/dataset.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/figure.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/input.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/test/metric.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/test/metric_result.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/test/output_template.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/test/result_summary.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/test/result_wrapper.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/test/test.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/test/threshold_test.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/test/threshold_test_result.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/test_context.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/test_suite/runner.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/test_suite/summary.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/test_suite/test.py +0 -0
- {validmind-2.5.1 → validmind-2.5.6}/validmind/vm_models/test_suite/test_suite.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: validmind
|
3
|
-
Version: 2.5.
|
3
|
+
Version: 2.5.6
|
4
4
|
Summary: ValidMind Developer Framework
|
5
5
|
License: Commercial License
|
6
6
|
Author: Andres Rodriguez
|
@@ -49,7 +49,7 @@ Requires-Dist: scorecardpy (>=0.1.9.6,<0.2.0.0)
|
|
49
49
|
Requires-Dist: seaborn
|
50
50
|
Requires-Dist: sentencepiece (>=0.2.0,<0.3.0) ; extra == "all" or extra == "huggingface" or extra == "llm"
|
51
51
|
Requires-Dist: sentry-sdk (>=1.24.0,<2.0.0)
|
52
|
-
Requires-Dist: shap (
|
52
|
+
Requires-Dist: shap (==0.44.1)
|
53
53
|
Requires-Dist: statsmodels
|
54
54
|
Requires-Dist: tabulate (>=0.8.9,<0.9.0)
|
55
55
|
Requires-Dist: textblob (>=0.18.0.post0,<0.19.0)
|
@@ -10,7 +10,7 @@ description = "ValidMind Developer Framework"
|
|
10
10
|
license = "Commercial License"
|
11
11
|
name = "validmind"
|
12
12
|
readme = "README.pypi.md"
|
13
|
-
version = "2.5.
|
13
|
+
version = "2.5.6"
|
14
14
|
|
15
15
|
[tool.poetry.dependencies]
|
16
16
|
python = ">=3.8.1,<3.12"
|
@@ -47,7 +47,7 @@ scorecardpy = "^0.1.9.6"
|
|
47
47
|
seaborn = "*"
|
48
48
|
sentencepiece = {version = "^0.2.0", optional = true}
|
49
49
|
sentry-sdk = "^1.24.0"
|
50
|
-
shap = "
|
50
|
+
shap = "0.44.1"
|
51
51
|
statsmodels = "*"
|
52
52
|
tabulate = "^0.8.9"
|
53
53
|
textblob = "^0.18.0.post0"
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "2.5.6"
|
@@ -240,6 +240,11 @@ def init_model(
|
|
240
240
|
vm_model = class_obj(
|
241
241
|
pipeline=model,
|
242
242
|
input_id=input_id,
|
243
|
+
attributes=(
|
244
|
+
ModelAttributes.from_dict(attributes)
|
245
|
+
if attributes
|
246
|
+
else ModelAttributes()
|
247
|
+
),
|
243
248
|
)
|
244
249
|
# TODO: Add metadata for pipeline model
|
245
250
|
metadata = get_model_info(vm_model)
|
@@ -248,6 +253,7 @@ def init_model(
|
|
248
253
|
input_id=input_id,
|
249
254
|
model=model, # Trained model instance
|
250
255
|
predict_fn=predict_fn,
|
256
|
+
attributes=ModelAttributes.from_dict(attributes) if attributes else None,
|
251
257
|
**kwargs,
|
252
258
|
)
|
253
259
|
metadata = get_model_info(vm_model)
|
@@ -56,7 +56,6 @@ TestID = Literal[
|
|
56
56
|
"validmind.model_validation.ragas.AnswerSimilarity",
|
57
57
|
"validmind.model_validation.ragas.AnswerCorrectness",
|
58
58
|
"validmind.model_validation.ragas.ContextRecall",
|
59
|
-
"validmind.model_validation.ragas.ContextRelevancy",
|
60
59
|
"validmind.model_validation.ragas.ContextPrecision",
|
61
60
|
"validmind.model_validation.ragas.AnswerRelevance",
|
62
61
|
"validmind.model_validation.sklearn.RegressionModelsPerformanceComparison",
|
{validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ragas/AnswerCorrectness.py
RENAMED
@@ -105,7 +105,7 @@ def AnswerCorrectness(
|
|
105
105
|
"ground_truth": ground_truth_column,
|
106
106
|
}
|
107
107
|
|
108
|
-
df = get_renamed_columns(dataset.
|
108
|
+
df = get_renamed_columns(dataset._df, required_columns)
|
109
109
|
|
110
110
|
result_df = evaluate(
|
111
111
|
Dataset.from_pandas(df), metrics=[answer_correctness], **get_ragas_config()
|
{validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ragas/AnswerRelevance.py
RENAMED
@@ -109,7 +109,7 @@ def AnswerRelevance(
|
|
109
109
|
"contexts": contexts_column,
|
110
110
|
}
|
111
111
|
|
112
|
-
df = get_renamed_columns(dataset.
|
112
|
+
df = get_renamed_columns(dataset._df, required_columns)
|
113
113
|
|
114
114
|
result_df = evaluate(
|
115
115
|
Dataset.from_pandas(df), metrics=[answer_relevancy], **get_ragas_config()
|
{validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ragas/AnswerSimilarity.py
RENAMED
@@ -94,7 +94,7 @@ def AnswerSimilarity(
|
|
94
94
|
"ground_truth": ground_truth_column,
|
95
95
|
}
|
96
96
|
|
97
|
-
df = get_renamed_columns(dataset.
|
97
|
+
df = get_renamed_columns(dataset._df, required_columns)
|
98
98
|
|
99
99
|
result_df = evaluate(
|
100
100
|
Dataset.from_pandas(df), metrics=[answer_similarity], **get_ragas_config()
|
{validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ragas/AspectCritique.py
RENAMED
@@ -132,7 +132,7 @@ def AspectCritique(
|
|
132
132
|
"contexts": contexts_column,
|
133
133
|
}
|
134
134
|
|
135
|
-
df = get_renamed_columns(dataset.
|
135
|
+
df = get_renamed_columns(dataset._df, required_columns)
|
136
136
|
|
137
137
|
built_in_aspects = [aspect_map[aspect] for aspect in aspects]
|
138
138
|
custom_aspects = (
|
{validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ragas/ContextEntityRecall.py
RENAMED
@@ -100,7 +100,7 @@ def ContextEntityRecall(
|
|
100
100
|
"contexts": contexts_column,
|
101
101
|
}
|
102
102
|
|
103
|
-
df = get_renamed_columns(dataset.
|
103
|
+
df = get_renamed_columns(dataset._df, required_columns)
|
104
104
|
|
105
105
|
result_df = evaluate(
|
106
106
|
Dataset.from_pandas(df), metrics=[context_entity_recall], **get_ragas_config()
|
{validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/ragas/ContextPrecision.py
RENAMED
@@ -96,7 +96,7 @@ def ContextPrecision(
|
|
96
96
|
"ground_truth": ground_truth_column,
|
97
97
|
}
|
98
98
|
|
99
|
-
df = get_renamed_columns(dataset.
|
99
|
+
df = get_renamed_columns(dataset._df, required_columns)
|
100
100
|
|
101
101
|
result_df = evaluate(
|
102
102
|
Dataset.from_pandas(df), metrics=[context_precision], **get_ragas_config()
|
@@ -96,7 +96,7 @@ def ContextRecall(
|
|
96
96
|
"ground_truth": ground_truth_column,
|
97
97
|
}
|
98
98
|
|
99
|
-
df = get_renamed_columns(dataset.
|
99
|
+
df = get_renamed_columns(dataset._df, required_columns)
|
100
100
|
|
101
101
|
result_df = evaluate(
|
102
102
|
Dataset.from_pandas(df), metrics=[context_recall], **get_ragas_config()
|
@@ -94,7 +94,7 @@ def Faithfulness(
|
|
94
94
|
"contexts": contexts_column,
|
95
95
|
}
|
96
96
|
|
97
|
-
df = get_renamed_columns(dataset.
|
97
|
+
df = get_renamed_columns(dataset._df, required_columns)
|
98
98
|
|
99
99
|
result_df = evaluate(
|
100
100
|
Dataset.from_pandas(df), metrics=[faithfulness], **get_ragas_config()
|
{validmind-2.5.1 → validmind-2.5.6}/validmind/tests/model_validation/sklearn/OverfitDiagnosis.py
RENAMED
@@ -25,51 +25,48 @@ from validmind.vm_models import (
|
|
25
25
|
|
26
26
|
logger = get_logger(__name__)
|
27
27
|
|
28
|
+
# TODO: A couple of improvements here could be to:
|
29
|
+
# 1. Allow the test to use multiple metrics at once
|
30
|
+
# 2. Allow custom functions for computing performance
|
31
|
+
|
28
32
|
DEFAULT_THRESHOLD = 0.04
|
33
|
+
DEFAULT_CLASSIFICATION_METRIC = "auc"
|
34
|
+
DEFAULT_REGRESSION_METRIC = "mse"
|
29
35
|
PERFORMANCE_METRICS = {
|
30
36
|
"accuracy": {
|
31
37
|
"function": metrics.accuracy_score,
|
32
|
-
"is_classification": True,
|
33
38
|
"is_lower_better": False,
|
34
39
|
},
|
35
40
|
"auc": {
|
36
41
|
"function": metrics.roc_auc_score,
|
37
|
-
"is_classification": True,
|
38
42
|
"is_lower_better": False,
|
39
43
|
},
|
40
44
|
"f1": {
|
41
45
|
"function": metrics.f1_score,
|
42
|
-
"is_classification": True,
|
43
46
|
"is_lower_better": False,
|
44
47
|
},
|
45
48
|
"precision": {
|
46
49
|
"function": metrics.precision_score,
|
47
|
-
"is_classification": True,
|
48
50
|
"is_lower_better": False,
|
49
51
|
},
|
50
52
|
"recall": {
|
51
53
|
"function": metrics.recall_score,
|
52
|
-
"is_classification": True,
|
53
54
|
"is_lower_better": False,
|
54
55
|
},
|
55
56
|
"mse": {
|
56
57
|
"function": metrics.mean_squared_error,
|
57
|
-
"is_classification": False,
|
58
58
|
"is_lower_better": True,
|
59
59
|
},
|
60
60
|
"mae": {
|
61
61
|
"function": metrics.mean_absolute_error,
|
62
|
-
"is_classification": False,
|
63
62
|
"is_lower_better": True,
|
64
63
|
},
|
65
64
|
"r2": {
|
66
65
|
"function": metrics.r2_score,
|
67
|
-
"is_classification": False,
|
68
66
|
"is_lower_better": False,
|
69
67
|
},
|
70
68
|
"mape": {
|
71
69
|
"function": metrics.mean_absolute_percentage_error,
|
72
|
-
"is_classification": False,
|
73
70
|
"is_lower_better": True,
|
74
71
|
},
|
75
72
|
}
|
@@ -123,20 +120,13 @@ def _compute_metrics(
|
|
123
120
|
if is_classification and metric == "auc":
|
124
121
|
# if only one class is present in the data, return 0
|
125
122
|
if len(np.unique(y_true)) == 1:
|
126
|
-
results[metric].append(0)
|
127
|
-
return
|
128
|
-
|
129
|
-
score = metric_func(y_true, df_region[prob_column].values)
|
130
|
-
|
131
|
-
# All other classification metrics
|
132
|
-
elif is_classification:
|
133
|
-
score = metric_func(y_true, df_region[pred_column].values)
|
123
|
+
return results[metric].append(0)
|
134
124
|
|
135
|
-
|
136
|
-
|
137
|
-
|
125
|
+
return results[metric].append(
|
126
|
+
metric_func(y_true, df_region[prob_column].values)
|
127
|
+
)
|
138
128
|
|
139
|
-
results[metric].append(
|
129
|
+
return results[metric].append(metric_func(y_true, df_region[pred_column].values))
|
140
130
|
|
141
131
|
|
142
132
|
def _plot_overfit_regions(
|
@@ -219,8 +209,12 @@ def overfit_diagnosis( # noqa: C901
|
|
219
209
|
is_classification = bool(datasets[0].probability_column(model))
|
220
210
|
|
221
211
|
# Set default metric if not provided
|
222
|
-
if metric
|
223
|
-
metric =
|
212
|
+
if not metric:
|
213
|
+
metric = (
|
214
|
+
DEFAULT_CLASSIFICATION_METRIC
|
215
|
+
if is_classification
|
216
|
+
else DEFAULT_REGRESSION_METRIC
|
217
|
+
)
|
224
218
|
logger.info(
|
225
219
|
f"Using default {'classification' if is_classification else 'regression'} metric: {metric}"
|
226
220
|
)
|
@@ -228,19 +222,6 @@ def overfit_diagnosis( # noqa: C901
|
|
228
222
|
if id(cut_off_threshold) == id(DEFAULT_THRESHOLD):
|
229
223
|
logger.info("Using default cut-off threshold of 0.04")
|
230
224
|
|
231
|
-
metric = metric.lower()
|
232
|
-
try:
|
233
|
-
_metric = PERFORMANCE_METRICS[metric.lower()]
|
234
|
-
except KeyError:
|
235
|
-
raise ValueError(
|
236
|
-
f"Invalid metric. Choose from: {', '.join(PERFORMANCE_METRICS.keys())}"
|
237
|
-
)
|
238
|
-
|
239
|
-
if is_classification and not _metric["is_classification"]:
|
240
|
-
raise ValueError(f"Cannot use regression metric ({metric}) for classification.")
|
241
|
-
elif not is_classification and _metric["is_classification"]:
|
242
|
-
raise ValueError(f"Cannot use classification metric ({metric}) for regression.")
|
243
|
-
|
244
225
|
train_df = datasets[0].df
|
245
226
|
test_df = datasets[1].df
|
246
227
|
|
@@ -0,0 +1,379 @@
|
|
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 collections import defaultdict
|
6
|
+
from dataclasses import dataclass
|
7
|
+
from operator import add
|
8
|
+
from typing import List, Tuple
|
9
|
+
|
10
|
+
import matplotlib.pyplot as plt
|
11
|
+
import numpy as np
|
12
|
+
import pandas as pd
|
13
|
+
import seaborn as sns
|
14
|
+
from sklearn import metrics
|
15
|
+
|
16
|
+
from validmind.errors import MissingOrInvalidModelPredictFnError
|
17
|
+
from validmind.logging import get_logger
|
18
|
+
from validmind.vm_models import (
|
19
|
+
Figure,
|
20
|
+
ResultSummary,
|
21
|
+
ResultTable,
|
22
|
+
ResultTableMetadata,
|
23
|
+
ThresholdTest,
|
24
|
+
ThresholdTestResult,
|
25
|
+
VMDataset,
|
26
|
+
VMModel,
|
27
|
+
)
|
28
|
+
|
29
|
+
logger = get_logger(__name__)
|
30
|
+
|
31
|
+
DEFAULT_DECAY_THRESHOLD = 0.05
|
32
|
+
DEFAULT_STD_DEV_LIST = [0.1, 0.2, 0.3, 0.4, 0.5]
|
33
|
+
DEFAULT_CLASSIFICATION_METRIC = "auc"
|
34
|
+
DEFAULT_REGRESSION_METRIC = "mse"
|
35
|
+
PERFORMANCE_METRICS = {
|
36
|
+
"accuracy": {
|
37
|
+
"function": metrics.accuracy_score,
|
38
|
+
"is_lower_better": False,
|
39
|
+
},
|
40
|
+
"auc": {
|
41
|
+
"function": metrics.roc_auc_score,
|
42
|
+
"is_lower_better": False,
|
43
|
+
},
|
44
|
+
"f1": {
|
45
|
+
"function": metrics.f1_score,
|
46
|
+
"is_lower_better": False,
|
47
|
+
},
|
48
|
+
"precision": {
|
49
|
+
"function": metrics.precision_score,
|
50
|
+
"is_lower_better": False,
|
51
|
+
},
|
52
|
+
"recall": {
|
53
|
+
"function": metrics.recall_score,
|
54
|
+
"is_lower_better": False,
|
55
|
+
},
|
56
|
+
"mse": {
|
57
|
+
"function": metrics.mean_squared_error,
|
58
|
+
"is_lower_better": True,
|
59
|
+
},
|
60
|
+
"mae": {
|
61
|
+
"function": metrics.mean_absolute_error,
|
62
|
+
"is_lower_better": True,
|
63
|
+
},
|
64
|
+
"r2": {
|
65
|
+
"function": metrics.r2_score,
|
66
|
+
"is_lower_better": False,
|
67
|
+
},
|
68
|
+
"mape": {
|
69
|
+
"function": metrics.mean_absolute_percentage_error,
|
70
|
+
"is_lower_better": True,
|
71
|
+
},
|
72
|
+
}
|
73
|
+
|
74
|
+
|
75
|
+
def _add_noise_std_dev(
|
76
|
+
values: List[float], x_std_dev: float
|
77
|
+
) -> Tuple[List[float], float]:
|
78
|
+
"""
|
79
|
+
Adds Gaussian noise to a list of values.
|
80
|
+
Args:
|
81
|
+
values (list[float]): A list of numerical values to which noise is added.
|
82
|
+
x_std_dev (float): A scaling factor for the standard deviation of the noise.
|
83
|
+
Returns:
|
84
|
+
tuple[list[float], float]: A tuple containing:
|
85
|
+
- A list of noisy values, where each value is the sum of the corresponding value
|
86
|
+
in the input list and a randomly generated value sampled from a Gaussian distribution
|
87
|
+
with mean 0 and standard deviation x_std_dev times the standard deviation of the input list.
|
88
|
+
- The standard deviation of the input list of values.
|
89
|
+
"""
|
90
|
+
std_dev = np.std(values)
|
91
|
+
noise_list = np.random.normal(0, x_std_dev * std_dev, size=len(values))
|
92
|
+
noisy_values = list(map(add, noise_list, values))
|
93
|
+
|
94
|
+
return noisy_values
|
95
|
+
|
96
|
+
|
97
|
+
def _compute_metric(
|
98
|
+
dataset: VMDataset, model: VMModel, X: pd.DataFrame, metric: str
|
99
|
+
) -> float:
|
100
|
+
if metric not in PERFORMANCE_METRICS:
|
101
|
+
raise ValueError(
|
102
|
+
f"Invalid metric: {metric}, expected one of {PERFORMANCE_METRICS.keys()}"
|
103
|
+
)
|
104
|
+
|
105
|
+
if metric == "auc":
|
106
|
+
try:
|
107
|
+
y_proba = model.predict_proba(X)
|
108
|
+
except MissingOrInvalidModelPredictFnError:
|
109
|
+
y_proba = model.predict(X)
|
110
|
+
return metrics.roc_auc_score(dataset.y, y_proba)
|
111
|
+
|
112
|
+
return PERFORMANCE_METRICS[metric]["function"](dataset.y, model.predict(X))
|
113
|
+
|
114
|
+
|
115
|
+
def _compute_gap(result: dict, metric: str) -> float:
|
116
|
+
if PERFORMANCE_METRICS[metric]["is_lower_better"]:
|
117
|
+
return result[metric.upper()][-1] - result[metric.upper()][0]
|
118
|
+
|
119
|
+
return result[metric.upper()][0] - result[metric.upper()][-1]
|
120
|
+
|
121
|
+
|
122
|
+
def _combine_results(results: List[dict]):
|
123
|
+
final_results = defaultdict(list)
|
124
|
+
|
125
|
+
# Interleave rows from each dictionary
|
126
|
+
for i in range(len(results[0]["Perturbation Size"])):
|
127
|
+
for result in results:
|
128
|
+
for key in result.keys():
|
129
|
+
final_results[key].append(result[key][i])
|
130
|
+
|
131
|
+
return pd.DataFrame(final_results)
|
132
|
+
|
133
|
+
|
134
|
+
def _plot_robustness(
|
135
|
+
results: pd.DataFrame, metric: str, threshold: float, columns: List[str]
|
136
|
+
):
|
137
|
+
fig, ax = plt.subplots()
|
138
|
+
|
139
|
+
pallete = sns.color_palette("muted", len(results["Dataset"].unique()))
|
140
|
+
sns.lineplot(
|
141
|
+
data=results,
|
142
|
+
x="Perturbation Size",
|
143
|
+
y=metric.upper(),
|
144
|
+
hue="Dataset",
|
145
|
+
style="Dataset",
|
146
|
+
linewidth=3,
|
147
|
+
markers=True,
|
148
|
+
markersize=10,
|
149
|
+
dashes=False,
|
150
|
+
palette=pallete,
|
151
|
+
ax=ax,
|
152
|
+
)
|
153
|
+
|
154
|
+
if PERFORMANCE_METRICS[metric]["is_lower_better"]:
|
155
|
+
y_label = f"{metric.upper()} (lower is better)"
|
156
|
+
else:
|
157
|
+
threshold = -threshold
|
158
|
+
y_label = f"{metric.upper()} (higher is better)"
|
159
|
+
|
160
|
+
# add dotted threshold line
|
161
|
+
for i in range(len(results["Dataset"].unique())):
|
162
|
+
baseline = results[results["Dataset"] == results["Dataset"].unique()[i]][
|
163
|
+
metric.upper()
|
164
|
+
].iloc[0]
|
165
|
+
ax.axhline(
|
166
|
+
y=baseline + threshold,
|
167
|
+
color=pallete[i],
|
168
|
+
linestyle="dotted",
|
169
|
+
)
|
170
|
+
|
171
|
+
ax.tick_params(axis="x")
|
172
|
+
ax.set_ylabel(y_label, weight="bold", fontsize=18)
|
173
|
+
ax.legend(fontsize=18)
|
174
|
+
ax.set_xlabel(
|
175
|
+
"Perturbation Size (X * Standard Deviation)", weight="bold", fontsize=18
|
176
|
+
)
|
177
|
+
ax.set_title(
|
178
|
+
f"Perturbed Features: {', '.join(columns)}",
|
179
|
+
weight="bold",
|
180
|
+
fontsize=20,
|
181
|
+
wrap=True,
|
182
|
+
)
|
183
|
+
|
184
|
+
# prevent the figure from being displayed
|
185
|
+
plt.close("all")
|
186
|
+
|
187
|
+
return fig
|
188
|
+
|
189
|
+
|
190
|
+
# TODO: make this a functional test instead of class-based when appropriate
|
191
|
+
# simply have to remove the class and rename this func to OverfitDiagnosis
|
192
|
+
def robustness_diagnosis(
|
193
|
+
model: VMModel,
|
194
|
+
datasets: List[VMDataset],
|
195
|
+
metric: str = None,
|
196
|
+
scaling_factor_std_dev_list: List[float] = DEFAULT_STD_DEV_LIST,
|
197
|
+
performance_decay_threshold: float = DEFAULT_DECAY_THRESHOLD,
|
198
|
+
):
|
199
|
+
if not metric:
|
200
|
+
metric = (
|
201
|
+
DEFAULT_CLASSIFICATION_METRIC
|
202
|
+
if datasets[0].probability_column(model)
|
203
|
+
else DEFAULT_REGRESSION_METRIC
|
204
|
+
)
|
205
|
+
logger.info(f"Using default metric ({metric.upper()}) for robustness diagnosis")
|
206
|
+
|
207
|
+
if id(scaling_factor_std_dev_list) == id(DEFAULT_STD_DEV_LIST):
|
208
|
+
logger.info(
|
209
|
+
f"Using default scaling factors for the standard deviation of the noise: {DEFAULT_STD_DEV_LIST}"
|
210
|
+
)
|
211
|
+
|
212
|
+
if id(performance_decay_threshold) == id(DEFAULT_DECAY_THRESHOLD):
|
213
|
+
logger.info(
|
214
|
+
f"Using default performance decay threshold of {DEFAULT_DECAY_THRESHOLD}"
|
215
|
+
)
|
216
|
+
|
217
|
+
results = [{} for _ in range(len(datasets))]
|
218
|
+
|
219
|
+
# add baseline results (no perturbation)
|
220
|
+
for dataset, result in zip(datasets, results):
|
221
|
+
result["Perturbation Size"] = [0.0]
|
222
|
+
result["Dataset"] = [f"{dataset.input_id}"]
|
223
|
+
result["Row Count"] = [dataset._df.shape[0]]
|
224
|
+
|
225
|
+
result[metric.upper()] = [
|
226
|
+
_compute_metric(
|
227
|
+
dataset=dataset,
|
228
|
+
model=model,
|
229
|
+
X=dataset.x_df(),
|
230
|
+
metric=metric,
|
231
|
+
)
|
232
|
+
]
|
233
|
+
result["Performance Decay"] = [0.0]
|
234
|
+
result["Passed"] = [True]
|
235
|
+
|
236
|
+
# Iterate scaling factor for the standard deviation list
|
237
|
+
for x_std_dev in scaling_factor_std_dev_list:
|
238
|
+
for dataset, result in zip(datasets, results):
|
239
|
+
|
240
|
+
result["Perturbation Size"].append(x_std_dev)
|
241
|
+
result["Dataset"].append(result["Dataset"][0])
|
242
|
+
result["Row Count"].append(result["Row Count"][0])
|
243
|
+
|
244
|
+
temp_df = dataset.x_df().copy()
|
245
|
+
for feature in dataset.feature_columns_numeric:
|
246
|
+
temp_df[feature] = _add_noise_std_dev(
|
247
|
+
values=temp_df[feature].to_list(),
|
248
|
+
x_std_dev=x_std_dev,
|
249
|
+
)
|
250
|
+
|
251
|
+
result[metric.upper()].append(
|
252
|
+
_compute_metric(
|
253
|
+
dataset=dataset,
|
254
|
+
model=model,
|
255
|
+
X=temp_df,
|
256
|
+
metric=metric,
|
257
|
+
)
|
258
|
+
)
|
259
|
+
result["Performance Decay"].append(_compute_gap(result, metric))
|
260
|
+
result["Passed"].append(
|
261
|
+
result["Performance Decay"][-1] < performance_decay_threshold
|
262
|
+
)
|
263
|
+
|
264
|
+
results_df = _combine_results(results)
|
265
|
+
fig = _plot_robustness(
|
266
|
+
results=results_df,
|
267
|
+
metric=metric,
|
268
|
+
threshold=performance_decay_threshold,
|
269
|
+
columns=datasets[0].feature_columns_numeric,
|
270
|
+
)
|
271
|
+
|
272
|
+
# rename perturbation size for baseline
|
273
|
+
results_df["Perturbation Size"][
|
274
|
+
results_df["Perturbation Size"] == 0.0
|
275
|
+
] = "Baseline (0.0)"
|
276
|
+
|
277
|
+
return results_df, fig
|
278
|
+
|
279
|
+
|
280
|
+
@dataclass
|
281
|
+
class RobustnessDiagnosis(ThresholdTest):
|
282
|
+
"""Evaluate the robustness of a machine learning model to noise
|
283
|
+
|
284
|
+
Robustness refers to a model's ability to maintain a high level of performance in
|
285
|
+
the face of perturbations or changes (particularly noise) added to its input data.
|
286
|
+
This test is designed to help gauge how well the model can handle potential real-
|
287
|
+
world scenarios where the input data might be incomplete or corrupted.
|
288
|
+
|
289
|
+
## Test Methodology
|
290
|
+
This test is conducted by adding Gaussian noise, proportional to a particular standard
|
291
|
+
deviation scale, to numeric input features of the input datasets. The model's
|
292
|
+
performance on the perturbed data is then evaluated using a user-defined metric or the
|
293
|
+
default metric of AUC for classification tasks and MSE for regression tasks. The results
|
294
|
+
are then plotted to visualize the model's performance decay as the perturbation size
|
295
|
+
increases.
|
296
|
+
|
297
|
+
When using this test, it is highly recommended to tailor the performance metric, list
|
298
|
+
of scaling factors for the standard deviation of the noise, and the performance decay
|
299
|
+
threshold to the specific use case of the model being evaluated.
|
300
|
+
|
301
|
+
**Inputs**:
|
302
|
+
- model (VMModel): The trained model to be evaluated.
|
303
|
+
- datasets (List[VMDataset]): A list of datasets to evaluate the model against.
|
304
|
+
|
305
|
+
## Parameters
|
306
|
+
- metric (str, optional): The performance metric to be used for evaluation. If not
|
307
|
+
provided, the default metric is used based on the task of the model. Default values
|
308
|
+
are "auc" for classification tasks and "mse" for regression tasks.
|
309
|
+
- scaling_factor_std_dev_list (List[float], optional): A list of scaling factors for
|
310
|
+
the standard deviation of the noise to be added to the input features. The default
|
311
|
+
values are [0.1, 0.2, 0.3, 0.4, 0.5].
|
312
|
+
- performance_decay_threshold (float, optional): The threshold for the performance
|
313
|
+
decay of the model. The default value is 0.05.
|
314
|
+
"""
|
315
|
+
|
316
|
+
name = "robustness"
|
317
|
+
required_inputs = ["model", "datasets"]
|
318
|
+
default_params = {
|
319
|
+
"metric": None,
|
320
|
+
"scaling_factor_std_dev_list": DEFAULT_STD_DEV_LIST,
|
321
|
+
"performance_decay_threshold": DEFAULT_DECAY_THRESHOLD,
|
322
|
+
}
|
323
|
+
tasks = ["classification", "regression"]
|
324
|
+
tags = [
|
325
|
+
"sklearn",
|
326
|
+
"model_diagnosis",
|
327
|
+
"visualization",
|
328
|
+
]
|
329
|
+
|
330
|
+
def run(self):
|
331
|
+
results, fig = robustness_diagnosis(
|
332
|
+
model=self.inputs.model,
|
333
|
+
datasets=self.inputs.datasets,
|
334
|
+
metric=self.params["metric"],
|
335
|
+
scaling_factor_std_dev_list=self.params["scaling_factor_std_dev_list"],
|
336
|
+
performance_decay_threshold=self.params["performance_decay_threshold"],
|
337
|
+
)
|
338
|
+
|
339
|
+
return self.cache_results(
|
340
|
+
passed=results["Passed"].all(),
|
341
|
+
test_results_list=[
|
342
|
+
ThresholdTestResult(
|
343
|
+
test_name=self.params["metric"],
|
344
|
+
passed=results["Passed"].all(),
|
345
|
+
values=results.to_dict(orient="records"),
|
346
|
+
)
|
347
|
+
],
|
348
|
+
figures=[
|
349
|
+
Figure(
|
350
|
+
for_object=self,
|
351
|
+
key=f"{self.name}:{self.params['metric']}",
|
352
|
+
figure=fig,
|
353
|
+
)
|
354
|
+
],
|
355
|
+
)
|
356
|
+
|
357
|
+
def summary(self, results: List[ThresholdTestResult], _):
|
358
|
+
return ResultSummary(
|
359
|
+
results=[
|
360
|
+
ResultTable(
|
361
|
+
data=results[0].values,
|
362
|
+
metadata=ResultTableMetadata(title="Robustness Diagnosis Results"),
|
363
|
+
)
|
364
|
+
]
|
365
|
+
)
|
366
|
+
|
367
|
+
def test(self):
|
368
|
+
"""Unit Test for Robustness Diagnosis Threshold Test"""
|
369
|
+
# Verify the result object is present
|
370
|
+
assert self.result is not None
|
371
|
+
|
372
|
+
# Verify test results and their type
|
373
|
+
assert isinstance(self.result.test_results.results, list)
|
374
|
+
|
375
|
+
# Check for presence and validity of 'values' and 'passed' flag in each result
|
376
|
+
for test_result in self.result.test_results.results:
|
377
|
+
assert "values" in test_result.__dict__
|
378
|
+
assert "passed" in test_result.__dict__
|
379
|
+
assert isinstance(test_result.values, list)
|
@@ -405,7 +405,7 @@ def run_test(
|
|
405
405
|
|
406
406
|
if unit_metrics:
|
407
407
|
metric_id_name = "".join(word[0].upper() + word[1:] for word in name.split())
|
408
|
-
test_id = f"validmind.
|
408
|
+
test_id = f"validmind.composite_metric.{metric_id_name}"
|
409
409
|
|
410
410
|
error, TestClass = load_composite_metric(
|
411
411
|
unit_metrics=unit_metrics, metric_name=metric_id_name
|
@@ -10,6 +10,7 @@ import pandas as pd
|
|
10
10
|
|
11
11
|
from validmind.errors import MissingOrInvalidModelPredictFnError
|
12
12
|
from validmind.logging import get_logger
|
13
|
+
from validmind.vm_models.model import ModelTask
|
13
14
|
|
14
15
|
logger = get_logger(__name__)
|
15
16
|
|
@@ -118,8 +119,14 @@ def compute_predictions(model, X, **kwargs) -> tuple:
|
|
118
119
|
"You can pass `prediction_values` or `prediction_columns` to use precomputed predictions"
|
119
120
|
)
|
120
121
|
|
121
|
-
|
122
|
-
|
122
|
+
if model.attributes.task is ModelTask.REGRESSION:
|
123
|
+
logger.info("Model is configured for regression.")
|
124
|
+
return probability_values, prediction_values
|
125
|
+
|
126
|
+
if probability_values is None and (
|
127
|
+
model.attributes.task is ModelTask.CLASSIFICATION
|
128
|
+
or _is_probabilties(prediction_values)
|
129
|
+
):
|
123
130
|
logger.info(
|
124
131
|
"Predict method returned probabilities instead of direct labels or regression values. "
|
125
132
|
"This implies the model is likely configured for a classification task with probability output."
|