文本分类的特征选择和归约 - python

我目前正在研究一个项目,一个简单的情感分析器,因此在单独的情况下将有2个和3个类。我使用的语料库在独特词方面非常丰富(大约200.000)。我使用词袋法进行特征选择,并减少了唯一特征的数量,由于出现频率的阈值而将其消除。最后一组功能包括大约20.000个功能,实际上减少了90%,但不足以达到预期的测试预测准确性。我依次使用LibSVM和SVM-light进行训练和预测(线性和RBF内核),以及一般的Python和Bash。

到目前为止,观察到的最高准确度约为75%,而我至少需要90%。二进制分类就是这种情况。对于多班训练,准确性下降到〜60%。在这两种情况下,我至少都需要90%,并且不知道如何增加它:通过优化训练参数还是通过优化特征选择?

我阅读了有关文本分类中特征选择的文章,发现使用了三种不同的方法,它们之间确实存在明显的相关性。这些方法如下:

词袋频率法(BOW)
信息增益(IG)
X ^ 2统计(CHI)

第一种方法已经是我使用的方法,但是我非常简单地使用它,并且需要指导以更好地使用它,以获得足够高的精度。我也缺乏有关IG和CHI的实际实现的知识,并且正在寻求任何帮助以这种方式指导我的知识。

非常感谢,如果您需要其他任何信息以寻求帮助,请告诉我。

@larsmans:频率阈值:我正在寻找示例中唯一单词的出现,因此,如果一个单词在不同示例中出现的频率足够高,它将作为唯一功能包含在功能集中。
@TheManWithNoName:首先,感谢您为解释文档分类的一般问题所做的努力。我检查并试验了您提出的所有方法以及其他方法。我发现比例差异(PD)方法是特征选择的最佳方法,其中特征是单字组和权重(TP)权重(我不明白为什么标记了Term-Frequency-Inverse-Document-Frequency(TF- IDF)作为索引方法,我宁愿将其视为功能加权方法)。如前所述,预处理也是此任务的重要方面。我使用某些类型的字符串消除功能来精炼数据以及进行形态分析和词干分析。另请注意,我正在研究土耳其语,与英语相比,土耳其语具有不同的特征。最终,对于二进制分类,我设法达到了〜88%的准确性(f量度),对于多分类,我达到了〜84%的准确性。这些值是我使用的模型成功的可靠证明。到目前为止,这是我所做的。现在正在研究聚类和归约模型,已经尝试使用LDA和LSI,并转移到moVMF以及球形模型(LDA + moVMF),这似乎对具有客观性质的语料库(如新闻语料库)更有效。如果您对这些问题有任何信息和指导,我将不胜感激。我特别需要信息来设置特征空间尺寸缩减方法(LDA,LSI,moVMF等)和聚类方法(k均值,分层等)之间的接口(面向python,开源)。

python大神给出的解决方案

这可能要晚一些了,但是...

正如Bee所指出的那样,您已经知道,如果在分类之前的阶段中已经丢失了信息,则将SVM用作分类器是浪费的。但是,文本分类的过程所需要的不仅是几个阶段,而且每个阶段都会对结果产生重大影响。因此,在研究更复杂的特征选择措施之前,有许多更简单的可能性,通常将需要更低的资源消耗。

在进行标记/表示为词袋格式之前,您是否要对文档进行预处理?只需删除停用词或标点符号即可大大提高准确性。

您是否考虑过改用词袋表示法,例如改为使用词对或n-gram?您可能会发现开始时有更多维度,但它们会进一步缩小并包含更多有用信息。

还值得注意的是,降维是特征选择/特征提取。区别在于特征选择以单变量的方式减小维数,即,它按当前出现的条件逐个删除术语,而不会改变它们,而特征提取(我认为Ben Allison指的是)是多变量的,结合了一个或多个单个项共同产生更高的正交项(希望)包含更多信息并减少特征空间。

关于文档使用频率,您只是在使用包含术语的文档的概率/百分比,还是在文档中使用术语密度?如果类别1只有10个重复项,并且每个都包含一个术语,那么类别1实际上与文档相关联。但是,如果第二类只有10个文档,每个文档包含相同的术语,每一个都包含一百次,那么显然第二类与该术语的关系要比第一类高得多。如果不考虑术语密度,则会丢失此信息,并且您拥有的类别越少,损失对您的影响就越大。类似地,仅保留具有高频的术语并不总是明智的,因为它们可能实际上并未提供任何有用的信息。例如,如果一个术语在每个文档中出现一百次,则该术语被视为噪声术语,尽管看起来很重要,但将其保留在功能集中没有任何实际价值。

另外,如何为数据建立索引,是将Vector Space Model与简单的布尔索引一起使用,还是将更复杂的度量(例如TF-IDF)一起使用?考虑到场景中类别的数量较少,一种更复杂的度量将是有益的,因为它们可以将每个类别的术语重要性与整个数据集中的重要性联系起来。

就我个人而言,我将首先尝试上述几种可能性,然后在需要进一步提高性能的情况下,考虑使用(或组合)复杂方程式来调整特征选择/提取。

额外

根据新信息,听起来您似乎走对了,对大多数数据集而言,84%+的准确性(F1或BEP-基于多类问题的精度和召回率)通常被认为非常好。可能是您已经从数据中成功获取了所有信息丰富的功能,或者其中一些仍在修剪中。

话虽如此,“离群值”分析可以用作预测特定数据集的主动降维效果的好坏因素,它利用信息增益在外围特征中的下降来确定信息将有多大的可能性在功能选择过程中丢失。您可以将其用于原始数据和/或处理后的数据,以估算您应以多大程度地修剪功能(或视情况取消修剪)。可以在此处找到描述它的论文:

Paper with Outlier Count information

关于将TF-IDF描述为索引方法,您将其作为特征权重度量是正确的,但是我认为它主要用作索引过程的一部分(尽管它也可以用于降维)。这样做的原因是,某些措施更好地针对了特征选择/提取,而另一些措施则更适合专门用于文档向量(即索引数据)中的特征加权。这通常是由于基于每个类别确定的降维措施,而索引加权措施往往更倾向于文档导向以提供更好的矢量表示。

关于LDA,LSI和moVMF,恐怕我对它们的经验太少,无法提供任何指导。不幸的是,我也没有使用土耳其语数据集或python语言。

子条件的python条件覆盖 - python

我试图找到一个python代码覆盖率工具,该工具可以衡量语句中是否包含子表达式:例如,我想看看下面的示例是否涵盖了condition1 / condition2 / condtion3?if condition1 or condition2 or condition3: x = true_value python大神给出的解决方案 对此的唯一合理答案是:当前…

USB设备发行 - python

我目前正在使用PyUSB。由于我不熟悉USB,所以我不知道如何执行以下操作。我已经从Python PyUSB成功连接到我的USB设备硬件。在代码中,我需要重置USB设备硬件。通过向硬件发送命令来完成。现在,在硬件重置后,我想从Python PyUSB释放当前的USB设备。然后,我想在重置后将其重新连接到USB设备硬件。请让我知道,如何释放USB设备连接和接口…

Python-熊猫描述了抛出错误:无法散列的类型“ dict” - python

更新:我正在使用“ Socrata开源API”中的一些示例代码。我在代码中注意到以下注释:# First 2000 results, returned as JSON from API / converted to Python # list of dictionaries by sodapy. 我不熟悉JSON。我已经下载了一个数据集,并创建了一个包含大量…

在Pytorch中重复张量的特定列 - python

我有一个大小为X的pytorch张量m x n和一个长度为num_repeats的非负整数n列表(假定sum(num_repeats)> 0)。在forward()方法中,我想创建一个大小为X_dup的张量m x sum(num_repeats),其中i的列X重复num_repeats[i]次。张量X_dup将在forward()方法的下游使用,因此需…

PyCharm中Django的文档字符串中未解决的引用 - python

我在Django的专案中使用Google Style Python Docstrings like in this Example。当我创建一个类并在文档字符串中使用属性符号时,Pycharm总是说-“未解决的引用”。class Post(models.Model): """ Class for posts. Attribute…