如何解决 Python 中的开放集分类问题?

Posted

技术标签:

【中文标题】如何解决 Python 中的开放集分类问题?【英文标题】:How to tackle open set classification problem in Python? 【发布时间】:2021-07-24 04:57:00 【问题描述】:

我遇到了一个使用 DNA 条形码的开放集昆虫分类问题。目标是为训练集中表示的测试样本预测 species 标签,并为训练集中未表示的测试样本预测 genus 标签。给定的数据变量是这样的:gtrain: 这是一个大小为 16128 的列向量。这个变量包含每个昆虫实例的属级标签训练集。您可以将这些视为树中叶节点的父节点,其中叶节点是物种,父节点是属。具有相同 gtrain 值的所有实例共享相同的属。 ytrain这是一个大小为 16128 的列向量。此变量包含训练集中每个昆虫实例的物种级别标签。具有相同 ytrain 值的所有昆虫实例都属于同一物种。 emb_train:这是一个 16128x1000 大小的二维矩阵。该矩阵中的每一行都是训练集中相应核苷酸序列的高维编码(或嵌入)。 emb_test:这是一个大小为 5989x1000 的 2D 矩阵。该矩阵中的每一行都是测试集中相应核苷酸序列的高维编码(或嵌入)。

我可以使用以下代码预测 genusspecies 标签,将其替换为 gtrainytrain变量:

xtrain, xtest, ytrain, ytest = train_test_split(emb_train, gtrain *or* ytrain, test_size=0.3)
classifier=RandomForestClassifier(n_estimators=5)
classifier.fit(xtrain, ytrain.ravel())
ypred=classifier.predict(emb_test)

但我认为这些预测是不准确的,因为如上所述,我需要能够同时使用 gtrainytrain 以某种方式训练我的模型并使最终准确emb_test 上的预测。我不能这样做。

有人可以就如何解决此类问题提供一些指导/资源/想法吗?如果问题不清楚,我可以提供更多信息。

【问题讨论】:

您的训练数据集是否包含任何没有物种标签但只有属标签的示例?否则,您的模型将如何学习预测 genus 标签? @greeness 是的,emb_train 由物种和属标签组成。 ytrain 标签是 gtrain 的子类。对于 emb_test 我必须确定一个序列是否来自 ytrain 并确定其标签,否则如果不是,则确定其 gtrain 标签。这有意义吗? 【参考方案1】:

如果 gtrainy_train 的父标签(IIUC,为了可视化所有标签,我们可以将属标签的节点与其对应的物种子标签连接成一个depth-2 树),我们可以学习在训练时预测属标签和物种标签。如果我这样做,我将简单地使用属标签空间和物种标签空间连接标签输出。

假设您的属空间为 100(您有 100 个独特的属类别),您的物种空间为 1000(您在所有属中拥有 1000 个独特的物种)。

Your gtrain is 1x16128, this could be transformed to 100x16128 one hot-vector per row.
Your ytrain is 1x16128, this could be transformed to 1000x16128 one hot-vector per row.
After concatenation, you have a label with shape [1100, 16128].

您可以构建一个使用 1000 维输入嵌入的模型,连接到几个隐藏的全连接神经网络层,最后连接到 1100 维输出。

在训练时,在每个步骤中,挑选一小批示例(总共 16128 个示例中的 64 个)。

input: 64 x 1000 (batch size x embedding dimension)
output: 64 x 1100 (batch size x output label dimension)

简单地减少输出的交叉熵损失。 在预测时,您可以使用一些启发式方法。例如,

基于物种输出的置信度。如果来自物种输出节点的所有 logits 都很低(阈值可以通过验证数据集确定),那么您可能无法在物种级别预测任何内容,但然后从属 logits 中选择最高预测。

考虑从属级 logits 和物种级 logits 预测的相互一致。 IIUC,假设一个属标签具有很高的logit,但所有相应的物种logit都很低(反之亦然),这可以被认为是“分歧”,从而触发不预测物种标签而只预测属级别的逻辑标签。

编辑:我还查看了您使用随机森林的代码。在这种情况下,您可以使用相同的嵌入特征作为输入构建两个分类器,一个预测为属标签,另一个预测为物种标签。在推理时,您并行运行两个分类器,并获得属级预测和物种级预测。然后你可以使用上面类似的启发式方法来决定最终的预测。

【讨论】:

以上是关于如何解决 Python 中的开放集分类问题?的主要内容,如果未能解决你的问题,请参考以下文章

在分类中,如何在数据集不平衡的情况下验证模型?

如何在 python 的朴素贝叶斯分类器中对用户输入测试集进行分类?

问题的分类以及计算机如何解决这些问题

如何将随机森林分类器应用于所有数据集,在 python 中一次一小部分

如何将randomforest分类器应用于所有数据集,一次在python中使用一小部分

如何启动visual studio + 开放解决方案+ 启动项目