python中适合稀疏高维特征的理想分类器(带有分层分类)
Posted
技术标签:
【中文标题】python中适合稀疏高维特征的理想分类器(带有分层分类)【英文标题】:Ideal classifiers in python to fit sparse high dimensional features (with hierarchical classification) 【发布时间】:2013-07-17 12:30:59 【问题描述】:这是我的任务:
我有一组分层类(例如“对象/建筑/建筑/住宅建筑/房屋/农舍”)——并且我编写了两种分类方式:
独立处理每个类别(整体使用一个模型/分类器)
使用每个节点代表一个决策的树(根代表“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
还需要注意的是,我有大约 29 万个训练样本和约 15 万个(当前/大部分)布尔特征(用 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 的分类器似乎表现不佳。
最后,我有两个问题:
-
是否有更好的分类器(比 scikit 的
logisticregression()
)在 python 中实现(可以是 scikit 或 mlpy/nltk/orange/etc),可以(i)处理稀疏矩阵,(ii)产生(接近)概率,以及 (iii) 使用多类分类?
有什么方法可以更好地处理方法二吗?
2.a.具体来说,是否有一些方法可以更好地激励分类器在树的下方产生结果?
【问题讨论】:
(1) 有没有更好的分类器——你试过优化 scikit-learn 的参数吗?标准化特征、标准化样本和惩罚参数可以对分类准确性产生很大影响。至于(2),也许一些自定义结构化学习器会做得更好。 嗨 larsmans-- (1) 是的,但我想使用比逻辑回归更好的东西(在我意识到我需要一些接近的东西之前,我对 linearsvc 很幸运(比 logit 好得多)到“真实”的概率)(2)同意 【参考方案1】:您可以尝试一些想法:
-
对特征应用一些嵌入技术,以避免出现大的稀疏矩阵。但是,它并不适合所有情况,也需要大量工作
使用带有自定义损失函数的 XGBoost。在这个损失函数中,您基本上可以应用您所描述的关于预测类的深度的逻辑,并为模型提供更频繁地预测更深类的动力。此外,考虑到特征之间的相关性,基于树的模型将使您受益
【讨论】:
以上是关于python中适合稀疏高维特征的理想分类器(带有分层分类)的主要内容,如果未能解决你的问题,请参考以下文章
在 python 中使用带有 LinearSVC 的特征选择
机器学习特征表达——日期与时间特征做离散处理(数字到分类的映射),稀疏类分组(相似特征归档),创建虚拟变量(提取新特征) 本质就是要么多变少,或少变多