微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我得到了一个使用 DNA 条形码的开放集昆虫分类问题。目标是为训练集中表示的测试样本预测物种标签,并为训练集中未表示的测试样本预测标签。给定的数据变量是这样的:

gtrain这是一个大小为 16128 的列向量。该变量包含训练集中每个昆虫实例的属级标签。您可以将它们视为树中叶节点的父节点,其中叶节点是物种,父节点是属。具有相同 gtrain 值的所有实例共享相同的属。
ytrain这是一个大小为 16128 的列向量。该变量包含训练集中每个昆虫实例的物种级别标签。具有相同 ytrain 值的所有昆虫实例都属于同一物种。
emb_train:这是一个大小为 16128x1000 的二维矩阵。该矩阵中的每一行都是训练集中相应核苷酸序列的高维编码(或嵌入)。
emb_test:这是一个大小为 5989x1000 的二维矩阵。该矩阵中的每一行都是测试集中相应核苷酸序列的高维编码(或嵌入)。

我可以使用下面的代码通过将其替换为 gtrainytrain 来预测 genusspecies 标签变量:

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 上的预测。我无法这样做。

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

解决方法

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

假设您的属空间为 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 中选择最高的预测。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。