如何解决 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 矩阵。该矩阵中的每一行都是测试集中相应核苷酸序列的高维编码(或嵌入)。
我可以使用以下代码预测 genus 或 species 标签,将其替换为 gtrain 或 ytrain变量:
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)
但我认为这些预测是不准确的,因为如上所述,我需要能够同时使用 gtrain 和 ytrain 以某种方式训练我的模型并使最终准确emb_test 上的预测。我不能这样做。
有人可以就如何解决此类问题提供一些指导/资源/想法吗?如果问题不清楚,我可以提供更多信息。
【问题讨论】:
您的训练数据集是否包含任何没有物种标签但只有属标签的示例?否则,您的模型将如何学习预测 genus 标签? @greeness 是的,emb_train 由物种和属标签组成。 ytrain 标签是 gtrain 的子类。对于 emb_test 我必须确定一个序列是否来自 ytrain 并确定其标签,否则如果不是,则确定其 gtrain 标签。这有意义吗? 【参考方案1】:如果 gtrain 是 y_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 中一次一小部分