3

这是我的任务:

我有一组分层类(例如“对象/建筑/建筑/住宅建筑/房屋/农舍”)——我写了两种分类方法:

  1. 独立处理每个类别(整体使用一个模型/分类器)

  2. 使用一棵树,其中每个节点代表一个决策(根代表“object/”,每个级别都会降低通用性),以及每个节点的特定模型/分类器(这里,我考虑 c(通常为 3)出现的最高概率每个节点的概率,并将概率向下传播(对日志概率求和)到叶子),并选择最高的。

    我还必须引入一种方法来激励更深入的树(因为它可以停在说对象/架构/建筑(如果有相应的训练数据)),并使用任意试错过程来具体决定如何(我对此感到不舒服)。:

        if numcategories == 4:
            tempscore +=1
        elif numcategories ==5:
            tempscore +=1.3
        elif numcategories ==6:
            tempscore +=1.5
        elif numcategories >6:
            tempscore +=2
    

同样重要的是要注意我有大约 290k 训练样本和 ~150k(当前/大部分)布尔特征(用 1.0 或 0.0 表示)——尽管它非常稀疏,所以我使用 scipy 的稀疏矩阵。此外,还有大约 6500 个独立的类(尽管方法 2 中每个节点的数量要少得多)

使用方法 1,使用 scikit's sgdclassifier(loss=hinge),我得到大约 75-76% 的准确率,使用 linearsvc,我得到大约 76-77%(虽然它慢了 8-9 倍)。

然而,对于第二种方法(我认为可以/应该最终表现更好),这些分类器都不会产生真实的概率,虽然我试图衡量它们产生的置信度分数.decision_functions(),但效果不佳(准确度为 10 -25%)。因此,我切换到logisticregression(),这让我获得了 ~62-63% 的准确率。此外,基于 NB 的分类器似乎表现得不太好。

最终,我有两个问题:

  1. 是否有更好的分类器(比 scikit 的logisticregression())在 python 中实现(可以是 scikit 或 mlpy/nltk/orange/etc),它可以(i)处理稀疏矩阵,(ii)产生(接近)概率,以及(iii)使用多类分类?
  2. 有没有办法更好地处理方法二?2.a. 具体来说,有没有办法更好地激励分类器在树的下方产生结果?
4

1 回答 1

0

您可以尝试一些想法:

  1. 对您的特征应用一些嵌入技术,以避免大的稀疏矩阵。但是,它并不适合所有情况,也需要大量工作
  2. 将 XGBoost 与自定义损失函数一起使用。在这个损失函数中,您基本上可以应用您所描述的关于预测类的深度的逻辑,并为模型提供更频繁地预测更深的类的动力。此外,考虑到特征之间的相关性,基于树的模型将使您受益
于 2019-04-24T13:17:39.907 回答