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

2024-06-28 19:16:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我可以使用以下代码预测标签,将其替换为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\U测试中做出最终准确的预测。我不能这样做

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


Tags: 实例test节点物种尺寸矩阵标签向量
1条回答
网友
1楼 · 发布于 2024-06-28 19:16:00

如果gtrainy_train的父标签(IIUC,为了可视化所有标签,我们可以将属标签的节点与其对应的物种子标签连接到一个深度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)

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

  • 基于物种产量的置信度。如果来自物种输出节点的所有Logit都较低(阈值可以通过验证数据集确定),则您可能无法在物种级别预测任何内容,但可以从属Logit中选择顶部预测

  • 考虑在属级逻辑和种级逻辑预测上的相互一致性。IIUC,假设一个属标签具有非常高的logit,但所有相应的物种logit都较低(反之亦然),这可被视为“不一致”,从而触发不预测物种标签而仅预测属级标签的逻辑

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

相关问题 更多 >