我目前正在研究一个项目,一个 简单的情感分析器,* 这样在 单独的情况下 将有 2和3个类 。我使用的 语料库 在
唯一词方面 非常 丰富 (大约200.000)。我用 袋的词 方法用于 特征选择 和以减少的数量 独特特征
,进行消除由于一个进行 阈值 的 出现频率 。在 最后一组的功能 包括围绕20.000的功能,这实际上是一个 90%的下降
,但 还不够
用于预期
的测试预测 *准确性 。我依次使用 LibSVM 和 SVM-light 进行训练和预测( 线性 和 RBF内核
),以及一般的 Python 和 Bash 。
到目前为止,观察到的 最高准确度 约为75%, 而我 至少需要90% 。 二进制分类 就是这种情况。对于 多班训练
,准确性下降到 〜60% 。在这两种情况下,我 至少需要90% ,并且无法弄清楚如何增加它:通过 优化训练参数 或
通过优化特征选择 ?
我阅读了有关文本分类中的 特征选择 的文章,发现使用了三种不同的方法,它们之间确实具有明显的相关性。这些方法如下:
第一种方法已经是我使用的方法,但是我非常简单地使用它,并且需要指导以更好地使用它,以获得足够高的精度。我也缺乏有关 IG 和 CHI的
实际实现的知识,并且正在寻找任何帮助以这种方式指导我的知识。
非常感谢,如果您需要其他任何信息以寻求帮助,请告诉我。
@larsmans: 频率阈值 :我正在寻找示例中唯一单词的出现,因此,如果一个单词在不同示例中出现的频率足够高,它将作为唯一功能包含在功能集中。
@TheManWithNoName:首先,感谢您为解释文档分类的一般问题所做的努力。我检查并试验了您提出的所有方法以及其他方法。我发现 比例差分 (PD)的方法最好的特征选择,这里的特点是单克和 长期驻留 (TP)的加权你为什么标签(我不明白 期限频-反比文档频 (TF- IDF)作为索引方法,我宁愿将其视为 功能加权 方法)。 如前所述, 预处理 也是此任务的重要方面。我使用了某些类型的字符串消除功能来精炼数据以及进行 形态分析 和 发芽 。另请注意,我正在研究 土耳其语 ,该语言与英语相比具有 不同的特征 。最后,我设法达到 〜88%的准确度 (F值)为 二进制 分类和 〜84% 为 多类 。这些值是我使用的模型成功的可靠证明。到目前为止,这是我所做的。现在正在研究聚类 和约 简模型,尝试了 LDA 和 LSI, 然后转向 moVMF 甚至 球形模型 (LDA + moVMF),这似乎对具有客观性质的语料库(例如新闻语料库)更有效。如果您对这些问题有任何信息和指导,我将不胜感激。我特别需要信息来设置 特征空间尺寸缩减 方法(LDA,LSI,moVMF等)与 聚类方法 (k均值,分层等)之间的接口(面向python,开源)。
这可能有点晚了,但是…
正如Bee指出的那样,您已经知道,如果在分类之前的阶段中已经丢失了信息,则将SVM用作分类器是浪费的。但是,文本分类的过程所需要的不仅是几个阶段,而且每个阶段都会对结果产生重大影响。因此,在研究更复杂的特征选择措施之前,有许多更简单的可能性,通常将需要更低的资源消耗。
在执行标记/表示为词袋格式之前,您是否要对文档进行预处理?只需删除停用词或标点符号即可大大提高准确性。
您是否考虑过改用词袋表示法,例如改为使用词对或n-gram?您可能会发现开始时有更多维度,但它们会进一步缩小并包含更多有用信息。
还值得注意的是,降维 是
特征选择/特征提取。区别在于特征选择以单变量的方式减小维数,即,它按当前出现的条件逐个删除术语,而不会改变它们,而特征提取(我认为Ben
Allison指的是)是多变量的,结合了一个或多个单个项共同产生更高的正交项(希望)包含更多信息并减少特征空间。
关于文档使用频率,您只是在使用包含术语的文档的概率/百分比,还是在文档中使用术语密度?如果类别1只有10个重复项,并且每个都包含一个词,那么类别1实际上与文档相关联。但是,如果类别2仅包含10个文档,每个文档包含相同的术语,则每个术语都包含一百次,那么显然类别2与该术语的关系要比类别1高得多。如果不考虑术语密度,则会丢失此信息,并且您拥有的类别越少,损失对您的影响就越大。类似地,仅保留频率较高的术语并不总是明智的,因为它们可能实际上并未提供任何有用的信息。
另外,您如何索引数据?您是通过简单的布尔索引还是更复杂的度量(例如TF-
IDF)使用向量空间模型?考虑到场景中类别的数量较少,一种更复杂的度量将是有益的,因为它们可以将每个类别的术语重要性与整个数据集中的重要性联系起来。
就个人而言,我将首先尝试上述几种可能性,然后在需要进一步提高性能的情况下,考虑使用(或组合)复杂方程式来调整特征选择/提取。
额外
根据新信息,听起来您似乎走对了,对大多数数据集来说,84%+的准确性(F1或BEP-
基于多类问题的精度和召回率)通常被认为非常好。可能是您已经从数据中成功获取了所有信息丰富的功能,或者其中一些仍在修剪中。
话虽如此,“离群值”分析可以用作预测特定数据集的主动降维效果的好坏因素,它利用信息增益在外围特征中的下降来确定信息将有多大的可能性在功能选择过程中丢失。您可以将其用于原始数据和/或处理后的数据,以估算您应以多大程度地修剪功能(或视情况取消修剪)。可以在这里找到描述它的论文:
包含异常值计数信息的纸张
关于将TF-
IDF描述为索引方法,您将其作为特征权重度量是正确的,但我认为它主要用作索引过程的一部分(尽管它也可以用于降维)。这样做的理由是,某些措施更好地针对了特征选择/提取,而另一些措施则更适合专门用于文档向量(即索引数据)中的特征加权。这通常是由于基于每个类别确定的降维措施,而索引加权措施往往更面向文档,以提供更好的矢量表示。
关于LDA,LSI和moVMF,恐怕我对它们的经验不足,无法提供任何指导。不幸的是,我也没有使用土耳其语数据集或python语言。
特征选择在于选取对训练集有分类能力的特征,这样可以提高决策树学习的效率。 通常特征选择的准则是信息增益或信息增益比。 信息增益 信息增益(information gain)表示得知特征$$X$$的信息而使得类$$Y$$的信息不确定性减少称。 特征$$A$$对训练数据集$$D$$的信息增益$$g(D,A)$$,定义为集合$$D$$的经验熵$$H(D)$$与特征$$A$$在给定条件下$$D$$的经验条
这个例子展示了如何使用 scikit-learn 中的单词包方法,根据主题对文档进行分类。本例使用scipy.sparse中的矩阵来存储特征,并演示各种能够有效处理稀疏矩阵的分类器。 本例中使用的数据集是20条新闻组数据集。通过scikit-learn可以自动下载该数据集,并进行缓存。 下述条形图展示了各个不同分类器,其信息包括精度、训练时间(已归一化)和测试时间(已归一化)。 import lo
VectorSlicer是一个转换器,输入一个特征向量输出一个特征向量,它是原特征的一个子集。这在从向量列中抽取特征非常有用。 VectorSlicer接收一个拥有特定索引的特征列,它的输出是一个新的特征列,它的值通过输入的索引来选择。有两种类型的索引: 1、整数索引表示进入向量的索引,调用setIndices() 2、字符串索引表示进入向量的特征列的名称,调用setNames()。这种情况需
RFormula通过一个R model formula选择一个特定的列。 目前我们支持R算子的一个受限的子集,包括~,.,:,+,-。这些基本的算子是: ~ 分开target和terms + 连接term,+ 0表示删除截距(intercept) - 删除term,- 1表示删除截距 : 交集 . 除了target之外的所有列 假设a和b是double列,我们用下面简单的例子来证明RFor
基于SparkML的特征选择(Feature Selectors)三个算法(VectorSlicer、RFormula以及ChiSqSelector)结合Demo进行一下理解 VectorSlicer算法介绍: VectorSlicer是一个转换器输入特征向量,输出原始特征向量子集。VectorSlicer接收带有特定索引的向量列,通过对这些索引的值进行筛选得到新的向量集。可接受如下两种索引: 1