[med-svn] [Git][med-team/q2-sample-classifier][master] 8 commits: routine-update: New upstream version
Michael R. Crusoe (@crusoe)
gitlab at salsa.debian.org
Tue Jun 25 03:18:51 BST 2024
Michael R. Crusoe pushed to branch master at Debian Med / q2-sample-classifier
Commits:
389271bf by Michael R. Crusoe at 2024-06-25T03:40:50+02:00
routine-update: New upstream version
- - - - -
ae87a6bf by Michael R. Crusoe at 2024-06-25T03:40:51+02:00
New upstream version 2024.5.0
- - - - -
b62cadbc by Michael R. Crusoe at 2024-06-25T03:40:53+02:00
Update upstream source from tag 'upstream/2024.5.0'
Update to upstream version '2024.5.0'
with Debian dir 8eae257f2cc536893a13f9fab566ba9425ca3d4f
- - - - -
a44847eb by Michael R. Crusoe at 2024-06-25T03:41:12+02:00
routine-update: Regenerate debian/control from debian/control.in
- - - - -
71ff9e36 by Michael R. Crusoe at 2024-06-25T03:49:55+02:00
d/patches/{convert-estimator,pandas2.0,sklearn-1.2.1}.patch: removed, applied upstream.
- - - - -
bde8f4a6 by Michael R. Crusoe at 2024-06-25T03:57:16+02:00
Only build for Python 3.11 until upstream catches up with Python 3.12.
- - - - -
705fbda4 by Michael R. Crusoe at 2024-06-25T04:16:43+02:00
routine-update: Regenerate debian/control from debian/control.in
- - - - -
fb5206a7 by Michael R. Crusoe at 2024-06-25T04:16:44+02:00
routine-update: Ready to upload to unstable
- - - - -
16 changed files:
- debian/changelog
- debian/control
- − debian/patches/convert-estimator.patch
- debian/patches/fix-autopkgtest.patch
- − debian/patches/pandas2.0.patch
- debian/patches/series
- − debian/patches/sklearn-1.2.1.patch
- debian/rules
- debian/tests/run-unit-test
- q2_sample_classifier/_version.py
- q2_sample_classifier/classify.py
- q2_sample_classifier/tests/test_actions.py
- q2_sample_classifier/tests/test_estimators.py
- q2_sample_classifier/tests/test_types_formats_transformers.py
- q2_sample_classifier/utilities.py
- q2_sample_classifier/visuals.py
Changes:
=====================================
debian/changelog
=====================================
@@ -1,3 +1,16 @@
+q2-sample-classifier (2024.5.0-1) unstable; urgency=medium
+
+ * Team upload.
+ * New upstream version
+ * Regenerate debian/control from debian/control.in (routine-update)
+ * d/patches/{convert-estimator,pandas2.0,sklearn-1.2.1}.patch:
+ removed, applied upstream.
+ * Only build for Python 3.11 until upstream catches up with Python
+ 3.12.
+ * Regenerate debian/control from debian/control.in (routine-update)
+
+ -- Michael R. Crusoe <crusoe at debian.org> Tue, 25 Jun 2024 04:16:44 +0200
+
q2-sample-classifier (2024.2.0-1) unstable; urgency=medium
* Team upload.
=====================================
debian/control
=====================================
@@ -8,7 +8,7 @@ Section: science
Priority: optional
Build-Depends: debhelper-compat (= 13),
dh-sequence-python3,
- qiime (>= 2024.2),
+ qiime (>= 2024.5),
python3-all,
python3-setuptools,
python3-pytest <!nocheck>
@@ -25,9 +25,9 @@ Depends: ${shlibs:Depends},
${python3:Depends},
python3-distutils,
python3-sklearn,
- qiime (>= 2024.2),
- q2-types (>= 2024.2),
- q2-feature-table (>= 2024.2)
+ qiime (>= 2024.5),
+ q2-types (>= 2024.5),
+ q2-feature-table (>= 2024.5)
Description: QIIME 2 plugin for machine learning prediction of sample data
QIIME 2 is a powerful, extensible, and decentralized microbiome analysis
package with a focus on data and analysis transparency. QIIME 2 enables
=====================================
debian/patches/convert-estimator.patch deleted
=====================================
@@ -1,28 +0,0 @@
-Description: fix use of obsolete base_estimator AdaBoost attribute
- The AdaBoostRegressor base_estimator attribute has been renamed "estimator"
- in scikit 1.2 onwards.
-Author: Étienne Mollier <emollier at debian.org>
-Bug: https://github.com/qiime2/q2-sample-classifier/issues/227
-Last-Update: 2023-08-30
----
-This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
---- q2-sample-classifier.orig/q2_sample_classifier/tests/test_estimators.py
-+++ q2-sample-classifier/q2_sample_classifier/tests/test_estimators.py
-@@ -398,7 +398,7 @@
- parameter_tuning=True, classification=True,
- missing_samples='ignore', base_estimator="DecisionTree")
- self.assertEqual(type(abe.named_steps.est), AdaBoostClassifier)
-- self.assertEqual(type(abe.named_steps.est.base_estimator),
-+ self.assertEqual(type(abe.named_steps.est.estimator),
- DecisionTreeClassifier)
-
- def test_train_adaboost_extra_trees(self):
-@@ -408,7 +408,7 @@
- parameter_tuning=True, classification=True,
- missing_samples='ignore', base_estimator="ExtraTrees")
- self.assertEqual(type(abe.named_steps.est), AdaBoostClassifier)
-- self.assertEqual(type(abe.named_steps.est.base_estimator),
-+ self.assertEqual(type(abe.named_steps.est.estimator),
- ExtraTreeClassifier)
-
- # test some invalid inputs/edge cases
=====================================
debian/patches/fix-autopkgtest.patch
=====================================
@@ -2,18 +2,9 @@ Description: Fix autopkgtest errors that were failing due to sklearn changed API
assignment of multi-dimensiondal array to pandas
Author: Mohammed Bilal <mdbilal at disroot.org>
Last-Update: 2022-09-09
---- a/q2_sample_classifier/utilities.py
-+++ b/q2_sample_classifier/utilities.py
-@@ -258,7 +258,7 @@ def _extract_rfe_scores(rfecv):
- for n in range(len(rfecv.grid_scores_)-1, -1, -1)]
- if x[0] < 1:
- x[0] = 1
-- return pd.Series(rfecv.grid_scores_, index=x, name='Accuracy')
-+ return pd.Series(rfecv.cv_results_['mean_test_score'], index=x, name='Accuracy')
-
-
- def nested_cross_validation(table, metadata, cv, random_state, n_jobs,
-@@ -523,13 +523,13 @@ def _extract_estimator_parameters(estima
+--- q2-sample-classifier.orig/q2_sample_classifier/utilities.py
++++ q2-sample-classifier/q2_sample_classifier/utilities.py
+@@ -524,13 +524,13 @@
# (drop pipeline params and individual base estimators)
estimator_params = {k: v for k, v in estimator.get_params().items() if
k.startswith('est__') and k != 'est__base_estimator'}
@@ -29,12 +20,3 @@ Last-Update: 2022-09-09
rfep.savefig(join(output_dir, 'rfe_plot.png'))
rfep.savefig(join(output_dir, 'rfe_plot.pdf'))
plt.close('all')
-@@ -828,7 +828,7 @@ def _train_adaboost_base_estimator(table
- return Pipeline(
- [('dv', estimator.named_steps.dv),
- ('est', adaboost_estimator(estimator.named_steps.est,
-- n_estimators, random_state=random_state))])
-+ n_estimators=n_estimators, random_state=random_state))])
-
-
- def _disable_feature_selection(estimator, optimize_feature_selection):
=====================================
debian/patches/pandas2.0.patch deleted
=====================================
@@ -1,47 +0,0 @@
-Description: Port to Pandas 2.0
-Author: Andreas Tille <tille at debian.org>
-Last-Update: Sun, 18 Feb 2024 15:54:19 +0100
-
---- a/q2_sample_classifier/tests/test_estimators.py
-+++ b/q2_sample_classifier/tests/test_estimators.py
-@@ -117,7 +117,7 @@ class EstimatorsTests(SampleClassifierTe
- index_col=0, names=['feature', 'importance'])
- self.exp_pred = pd.read_csv(
- self.get_data_path('predictions.tsv'), sep='\t', header=0,
-- index_col=0, squeeze=True)
-+ index_col=0).squeeze('columns')
- index = pd.Index(['A', 'B', 'C', 'D'], name='id')
- self.table_percnorm = qiime2.Artifact.import_data(
- FeatureTable[PercentileNormalized], pd.DataFrame(
---- a/q2_sample_classifier/tests/test_types_formats_transformers.py
-+++ b/q2_sample_classifier/tests/test_types_formats_transformers.py
-@@ -84,8 +84,7 @@ class TestSemanticTypes(SampleClassifier
- exp = pd.Series([True, False, True, False, True, False],
- name='outlier', index=exp_index)
- obs = transformer(exp)
-- obs = pd.read_csv(str(obs), sep='\t', header=0, index_col=0,
-- squeeze=True)
-+ obs = pd.read_csv(str(obs), sep='\t', header=0, index_col=0).squeeze('columns')
- self.assertEqual(sorted(exp), sorted(obs))
-
- def test_boolean_format_to_pd_series(self):
-@@ -151,8 +150,7 @@ class TestSemanticTypes(SampleClassifier
- exp = pd.Series([1, 2, 3, 4],
- name='prediction', index=['a', 'b', 'c', 'd'])
- obs = transformer(exp)
-- obs = pd.read_csv(str(obs), sep='\t', header=0, index_col=0,
-- squeeze=True)
-+ obs = pd.read_csv(str(obs), sep='\t', header=0, index_col=0).squeeze('columns')
- pdt.assert_series_equal(obs, exp)
-
- def test_pd_series_to_Predictions_format_allow_nans(self):
-@@ -160,8 +158,7 @@ class TestSemanticTypes(SampleClassifier
- exp = pd.Series([1, np.nan, 3, np.nan],
- name='prediction', index=['a', 'b', 'c', 'd'])
- obs = transformer(exp)
-- obs = pd.read_csv(str(obs), sep='\t', header=0, index_col=0,
-- squeeze=True)
-+ obs = pd.read_csv(str(obs), sep='\t', header=0, index_col=0).squeeze('columns')
- pdt.assert_series_equal(obs, exp)
-
- def test_Predictions_format_to_pd_series(self):
=====================================
debian/patches/series
=====================================
@@ -1,7 +1,4 @@
py2to3test.patch
reduce-precision-in-tests.patch
fix-autopkgtest.patch
-sklearn-1.2.1.patch
-convert-estimator.patch
python3.12.patch
-pandas2.0.patch
=====================================
debian/patches/sklearn-1.2.1.patch deleted
=====================================
@@ -1,68 +0,0 @@
-Description: fix get_feature_names deprecation with sklearn 1.2.1
- Since sklearn 1.2.1, autopkgtest are failing due to occurrence of:
- AttributeError: 'DictVectorizer' object has no attribute 'get_feature_names'
- This function is replaced by get_feature_names_out.
-Author: Étienne Mollier <emollier at debian.org>
-Forwarded: https://github.com/qiime2/q2-sample-classifier/issues/227
-Last-Update: 2023-02-02
----
-This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
---- a/q2_sample_classifier/tests/test_estimators.py
-+++ b/q2_sample_classifier/tests/test_estimators.py
-@@ -135,7 +135,7 @@ class EstimatorsTests(SampleClassifierTe
- dv = DictVectorizer()
- dv.fit(dicts)
- features = table.ids('observation')
-- self.assertEqual(set(dv.get_feature_names()), set(features))
-+ self.assertEqual(set(dv.get_feature_names_out()), set(features))
- self.assertEqual(len(dicts), len(table.ids()))
- for dict_row, (table_row, _, _) in zip(dicts, table.iter()):
- for feature, count in zip(features, table_row):
---- a/q2_sample_classifier/utilities.py
-+++ b/q2_sample_classifier/utilities.py
-@@ -239,7 +239,7 @@ def _rfecv_feature_selection(feature_dat
- # Describe top features
- n_opt = rfecv.named_steps.est.n_features_
- importance = _extract_important_features(
-- rfecv.named_steps.dv.get_feature_names(),
-+ rfecv.named_steps.dv.get_feature_names_out(),
- rfecv.named_steps.est.ranking_)
- importance = sort_importances(importance, ascending=True)[:n_opt]
-
-@@ -253,9 +253,10 @@ def _extract_rfe_scores(rfecv):
- # If using fractional step, step = integer of fraction * n_features
- if rfecv.step < 1:
- rfecv.step = int(rfecv.step * n_features)
-- # Need to manually calculate x-axis, as rfecv.grid_scores_ are a 1-d array
-+ # Need to manually calculate x-axis, as
-+ # rfecv.cv_results_['mean_test_score'] are a 1-d array
- x = [n_features - (n * rfecv.step)
-- for n in range(len(rfecv.grid_scores_)-1, -1, -1)]
-+ for n in range(len(rfecv.cv_results_['mean_test_score'])-1, -1, -1)]
- if x[0] < 1:
- x[0] = 1
- return pd.Series(rfecv.cv_results_['mean_test_score'], index=x, name='Accuracy')
-@@ -411,12 +412,12 @@ def _calculate_feature_importances(estim
- # feature_importances_ or coef_ to report feature importance/weights
- try:
- importances = _extract_important_features(
-- estimator.named_steps.dv.get_feature_names(),
-+ estimator.named_steps.dv.get_feature_names_out(),
- estimator.named_steps.est.feature_importances_)
- # is there a better way to determine whether estimator has coef_ ?
- except AttributeError:
- importances = _extract_important_features(
-- estimator.named_steps.dv.get_feature_names(),
-+ estimator.named_steps.dv.get_feature_names_out(),
- estimator.named_steps.est.coef_)
- return importances
-
-@@ -718,7 +719,7 @@ def _mean_feature_importance(importances
- def _null_feature_importance(table):
- feature_extractor = DictVectorizer()
- feature_extractor.fit(table)
-- imp = pd.DataFrame(index=feature_extractor.get_feature_names())
-+ imp = pd.DataFrame(index=feature_extractor.get_feature_names_out())
- imp.index.name = "feature"
- imp["importance"] = 1
- return imp
=====================================
debian/rules
=====================================
@@ -6,6 +6,8 @@ export LC_ALL=C.UTF-8
include /usr/share/dpkg/default.mk
VERSION_UPSTREAM=$(shell echo $(DEB_VERSION_UPSTREAM) | sed -e 's/\(20[0-9][0-9]\.[0-9]\+\)\..*/\1/')
+export PYBUILD_DISABLE=python3.12
+
debian/control: debian/control.in
echo "# This file is autogenerated from control.in to update versioned dependencies" > $@
sed -e"s/@DEB_VERSION_UPSTREAM@/$(VERSION_UPSTREAM)/g" $< >> $@
=====================================
debian/tests/run-unit-test
=====================================
@@ -17,7 +17,9 @@ if [ ! -f /usr/lib/python3/dist-packages/pytest_cov/__init__.py ] ; then
fi
# Run build-time tests
-for py in $(py3versions -s 2> /dev/null)
-do
- ${py} -m pytest -v --cov=${pkg}
-done
+# for py in $(py3versions -s 2> /dev/null)
+# do
+# ${py} -m pytest -v --cov=${pkg}
+# done
+#
+python3.11 -m pytest -v --cov=${pkg}
=====================================
q2_sample_classifier/_version.py
=====================================
@@ -23,9 +23,9 @@ def get_keywords():
# setup.py/versioneer.py will grep for the variable names, so they must
# each be defined on a line of their own. _version.py will just call
# get_keywords().
- git_refnames = " (tag: 2024.2.0, Release-2024.2)"
- git_full = "e32969bfe9c0e177ca0d5cfba270216c98bbbd9e"
- git_date = "2024-02-16 21:57:23 +0000"
+ git_refnames = " (tag: 2024.5.0, Release-2024.5)"
+ git_full = "8fa3c948c14a8ff6668d92fa7cb05364679efc8f"
+ git_date = "2024-05-29 04:18:14 +0000"
keywords = {"refnames": git_refnames, "full": git_full, "date": git_date}
return keywords
=====================================
q2_sample_classifier/classify.py
=====================================
@@ -83,7 +83,7 @@ def metatable(ctx,
raise ValueError('Missing samples in metadata: %r' %
table_ids.difference(metadata_ids))
else:
- metadata = metadata.loc[sample_ids]
+ metadata = metadata.loc[list(sample_ids)]
if len(sample_ids) < len(table_ids):
tab = tab.filter(
ids_to_keep=sample_ids, axis='sample', inplace=False)
=====================================
q2_sample_classifier/tests/test_actions.py
=====================================
@@ -59,7 +59,7 @@ class NowLetsTestTheActions(SampleClassifierTestPluginBase):
self.assertEqual(y_train.name, 'bugs')
# test if complete target column is covered
- y_all = y_train.append(y_test).sort_index()
+ y_all = pd.concat([y_train, y_test]).sort_index()
y_all.index.name = 'SampleID'
pdt.assert_series_equal(y_all, self.md._series)
=====================================
q2_sample_classifier/tests/test_estimators.py
=====================================
@@ -117,7 +117,7 @@ class EstimatorsTests(SampleClassifierTestPluginBase):
index_col=0, names=['feature', 'importance'])
self.exp_pred = pd.read_csv(
self.get_data_path('predictions.tsv'), sep='\t', header=0,
- index_col=0, squeeze=True)
+ index_col=0).squeeze('columns')
index = pd.Index(['A', 'B', 'C', 'D'], name='id')
self.table_percnorm = qiime2.Artifact.import_data(
FeatureTable[PercentileNormalized], pd.DataFrame(
@@ -135,7 +135,7 @@ class EstimatorsTests(SampleClassifierTestPluginBase):
dv = DictVectorizer()
dv.fit(dicts)
features = table.ids('observation')
- self.assertEqual(set(dv.get_feature_names()), set(features))
+ self.assertEqual(set(dv.get_feature_names_out()), set(features))
self.assertEqual(len(dicts), len(table.ids()))
for dict_row, (table_row, _, _) in zip(dicts, table.iter()):
for feature, count in zip(features, table_row):
@@ -398,7 +398,7 @@ class EstimatorsTests(SampleClassifierTestPluginBase):
parameter_tuning=True, classification=True,
missing_samples='ignore', base_estimator="DecisionTree")
self.assertEqual(type(abe.named_steps.est), AdaBoostClassifier)
- self.assertEqual(type(abe.named_steps.est.base_estimator),
+ self.assertEqual(type(abe.named_steps.est.estimator),
DecisionTreeClassifier)
def test_train_adaboost_extra_trees(self):
@@ -408,7 +408,7 @@ class EstimatorsTests(SampleClassifierTestPluginBase):
parameter_tuning=True, classification=True,
missing_samples='ignore', base_estimator="ExtraTrees")
self.assertEqual(type(abe.named_steps.est), AdaBoostClassifier)
- self.assertEqual(type(abe.named_steps.est.base_estimator),
+ self.assertEqual(type(abe.named_steps.est.estimator),
ExtraTreeClassifier)
# test some invalid inputs/edge cases
@@ -504,7 +504,7 @@ class EstimatorsTests(SampleClassifierTestPluginBase):
ls_pred_classes = prob.columns.tolist()
ls_correct_range = [col for col in ls_pred_classes if
prob[col].between(
- 0, 1, inclusive=True).all()]
+ 0, 1, inclusive="both").all()]
self.assertEqual(len(ls_correct_range), prob.shape[1],
msg='Predicted probabilities of class {}'
'are not in range [0,1]'.format(
=====================================
q2_sample_classifier/tests/test_types_formats_transformers.py
=====================================
@@ -85,7 +85,7 @@ class TestSemanticTypes(SampleClassifierTestPluginBase):
name='outlier', index=exp_index)
obs = transformer(exp)
obs = pd.read_csv(str(obs), sep='\t', header=0, index_col=0,
- squeeze=True)
+ ).squeeze('columns')
self.assertEqual(sorted(exp), sorted(obs))
def test_boolean_format_to_pd_series(self):
@@ -152,7 +152,7 @@ class TestSemanticTypes(SampleClassifierTestPluginBase):
name='prediction', index=['a', 'b', 'c', 'd'])
obs = transformer(exp)
obs = pd.read_csv(str(obs), sep='\t', header=0, index_col=0,
- squeeze=True)
+ ).squeeze('columns')
pdt.assert_series_equal(obs, exp)
def test_pd_series_to_Predictions_format_allow_nans(self):
@@ -161,7 +161,7 @@ class TestSemanticTypes(SampleClassifierTestPluginBase):
name='prediction', index=['a', 'b', 'c', 'd'])
obs = transformer(exp)
obs = pd.read_csv(str(obs), sep='\t', header=0, index_col=0,
- squeeze=True)
+ ).squeeze('columns')
pdt.assert_series_equal(obs, exp)
def test_Predictions_format_to_pd_series(self):
=====================================
q2_sample_classifier/utilities.py
=====================================
@@ -239,7 +239,7 @@ def _rfecv_feature_selection(feature_data, targets, estimator,
# Describe top features
n_opt = rfecv.named_steps.est.n_features_
importance = _extract_important_features(
- rfecv.named_steps.dv.get_feature_names(),
+ rfecv.named_steps.dv.get_feature_names_out(),
rfecv.named_steps.est.ranking_)
importance = sort_importances(importance, ascending=True)[:n_opt]
@@ -249,16 +249,17 @@ def _rfecv_feature_selection(feature_data, targets, estimator,
def _extract_rfe_scores(rfecv):
+ grid_scores_ = rfecv.cv_results_['mean_test_score']
n_features = len(rfecv.ranking_)
# If using fractional step, step = integer of fraction * n_features
if rfecv.step < 1:
rfecv.step = int(rfecv.step * n_features)
- # Need to manually calculate x-axis, as rfecv.grid_scores_ are a 1-d array
+ # Need to manually calculate x-axis, grid_scores_ is a 1-d array
x = [n_features - (n * rfecv.step)
- for n in range(len(rfecv.grid_scores_)-1, -1, -1)]
+ for n in range(len(grid_scores_)-1, -1, -1)]
if x[0] < 1:
x[0] = 1
- return pd.Series(rfecv.grid_scores_, index=x, name='Accuracy')
+ return pd.Series(grid_scores_, index=x, name='Accuracy')
def nested_cross_validation(table, metadata, cv, random_state, n_jobs,
@@ -411,12 +412,12 @@ def _calculate_feature_importances(estimator):
# feature_importances_ or coef_ to report feature importance/weights
try:
importances = _extract_important_features(
- estimator.named_steps.dv.get_feature_names(),
+ estimator.named_steps.dv.get_feature_names_out(),
estimator.named_steps.est.feature_importances_)
# is there a better way to determine whether estimator has coef_ ?
except AttributeError:
importances = _extract_important_features(
- estimator.named_steps.dv.get_feature_names(),
+ estimator.named_steps.dv.get_feature_names_out(),
estimator.named_steps.est.coef_)
return importances
@@ -718,7 +719,7 @@ def _mean_feature_importance(importances):
def _null_feature_importance(table):
feature_extractor = DictVectorizer()
feature_extractor.fit(table)
- imp = pd.DataFrame(index=feature_extractor.get_feature_names())
+ imp = pd.DataFrame(index=feature_extractor.get_feature_names_out())
imp.index.name = "feature"
imp["importance"] = 1
return imp
@@ -827,8 +828,9 @@ def _train_adaboost_base_estimator(table, metadata, column, base_estimator,
return Pipeline(
[('dv', estimator.named_steps.dv),
- ('est', adaboost_estimator(estimator.named_steps.est,
- n_estimators, random_state=random_state))])
+ ('est', adaboost_estimator(estimator=estimator.named_steps.est,
+ n_estimators=n_estimators,
+ random_state=random_state))])
def _disable_feature_selection(estimator, optimize_feature_selection):
=====================================
q2_sample_classifier/visuals.py
=====================================
@@ -167,9 +167,9 @@ def _plot_confusion_matrix(y_test, y_pred, classes, normalize, palette,
predictions.loc["Overall Accuracy"] = ""
predictions.loc["Baseline Accuracy"] = ""
predictions.loc["Accuracy Ratio"] = ""
- predictions.loc["Overall Accuracy"]["Overall Accuracy"] = accuracy
- predictions.loc["Baseline Accuracy"]["Overall Accuracy"] = basline_accuracy
- predictions.loc["Accuracy Ratio"]["Overall Accuracy"] = accuracy_ratio
+ predictions.loc["Overall Accuracy", "Overall Accuracy"] = accuracy
+ predictions.loc["Baseline Accuracy", "Overall Accuracy"] = basline_accuracy
+ predictions.loc["Accuracy Ratio", "Overall Accuracy"] = accuracy_ratio
return predictions, confusion
View it on GitLab: https://salsa.debian.org/med-team/q2-sample-classifier/-/compare/11dcb446806e7c9a4050806410a2dcad3e9e2b81...fb5206a7488d6ddbdfb9ff05252f9f1c2d2a688d
--
This project does not include diff previews in email notifications.
View it on GitLab: https://salsa.debian.org/med-team/q2-sample-classifier/-/compare/11dcb446806e7c9a4050806410a2dcad3e9e2b81...fb5206a7488d6ddbdfb9ff05252f9f1c2d2a688d
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-med-commit/attachments/20240625/ca472e48/attachment-0001.htm>
More information about the debian-med-commit
mailing list