python中适合稀疏高维特征的理想分类器(具有分层分类)



这是我的任务:

我有一组分层类(例如"对象/建筑/建筑/住宅楼/房子/农舍"),我已经写了两种分类方法:

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

  2. 使用一个树,其中每个节点代表一个决策(根代表"对象/",每个级别降低通用性),以及每个节点的特定模型/分类器(在这里,我考虑每个节点产生的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的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等),它可以(i)处理稀疏矩阵,(ii)产生(接近)概率,以及(iii)处理多类分类
  2. 有没有办法更好地处理方法二?2.a.具体来说,是否有一些方法可以更好地激励分类器在树的下游产生结果

您可以尝试的一些想法:

  1. 在你的特征上应用一些嵌入技术,以避免出现大的稀疏矩阵。然而,它并不适合所有的情况,而且还需要大量的工作
  2. 将XGBoost与自定义损失功能结合使用。在这个损失函数中,您基本上可以应用您所描述的关于预测类的深度的逻辑,并为模型提供更频繁地预测更深类的激励。此外,基于树的模型将通过考虑特性之间的相关性而使您受益

最新更新