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

时间:2013-07-18 13:54:30

标签: machine-learning scipy classification sparse-matrix scikit-learn

这是我的任务:

我有一套等级类(例如“对象/建筑/建筑/住宅楼/住宅/农舍”) - 我写了两种分类方法:

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

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

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

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

  3. 同样重要的是要注意我有大约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 / etc),它们可以(i)处理稀疏矩阵,(ii)生成(关闭的东西) to)概率,以及(iii)使用多类分类?
    2. 有没有办法更好地处理方法二? 2.A.具体来说,有没有办法更好地处理激励分类器在树下进一步产生结果?

1 个答案:

答案 0 :(得分:0)

您可以尝试的一些想法:

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