首页 > 解决方案 > 如何解决 Python 中的开放集分类问题?

问题描述

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

gtrain这是一个大小为 16128 的列向量。这个变量包含训练集中每个昆虫实例的属级标签。您可以将这些视为树中叶节点的父节点,其中叶节点是物种,父节点是属。具有相同 gtrain 值的所有实例共享相同的属。
火车这是一个大小为 16128 的列向量。该变量包含训练集中每个昆虫实例的物种级别标签。具有相同 ytrain 值的所有昆虫实例都属于同一物种。
emb_train:这是一个大小为 16128x1000 的 2D 矩阵。该矩阵中的每一行都是训练集中相应核苷酸序列的高维编码(或嵌入)。
emb_test:这是一个大小为 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_test 做出最终准确的预测。我不能这样做。

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

标签: pythonclassificationdata-mining

解决方案


如果gtrain是 y_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)

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

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

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

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


推荐阅读