53

我目前正在做一个项目,一个简单的情绪分析器,这样在不同的情况下会有2 个和 3 个类。我正在使用一个包含非常丰富独特单词(大约 200.000)的语料库。我使用词袋方法进行特征选择并减少独特特征的数量,由于出现频率的阈值而进行了消除。最终的特征集包括大约 20.000 个特征,实际上减少了 90%,但还不够用于测试预测的预期准确性。我依次使用LibSVMSVM-light进行训练和预测(包括线性RBF 内核)以及一般的PythonBash

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

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

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

第一种方法我已经在用了,但是我用的很简单,需要指导才能更好地使用它,以获得足够高的精度。我也缺乏关于IGCHI实际实施的知识,并寻求任何帮助来指导我。

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


  • @larsmans:频率阈值:我正在寻找示例中唯一单词的出现,这样如果一个单词在不同示例中出现的频率足够高,它就会作为唯一特征包含在特征集中。

  • @TheManWithNoName:首先感谢您为解释文档分类的一般问题所做的努力。我检查并试验了你提出的所有方法和其他方法。我发现比例差(PD) 方法最适合特征选择,其中特征是 uni-grams 和用于加权的术语存在(TP ) IDF)作为一种索引方法,我宁愿将其视为一种特征加权方法)。 正如您所提到的,预处理也是此任务的一个重要方面。我使用某些类型的字符串消除来优化数据以及形态解析词干。另请注意,我正在研究土耳其语,与英语相比,它具有不同的特征。最后,对于二元分类,我设法达到了~88% 的准确度(f-measure),对于多类,我达到了~84%。这些值是我使用的模型成功的有力证明。这是我到目前为止所做的。现在致力于聚类和缩减模型,已经尝试过LDALSI,并转向moVMF球形模型(LDA + moVMF),这似乎更适用于具有客观性质的语料库,如新闻语料库。如果您对这些问题有任何信息和指导,我将不胜感激。我特别需要信息来设置特征空间降维方法(LDA、LSI、moVMF 等)和聚类方法(k-means、分层等)之间的接口(面向 python、开源)。

4

5 回答 5

39

这可能有点晚了,但是......

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

在将标记化/表示为词袋格式之前,您是否对文档进行了预处理?简单地删除停用词或标点符号可能会大大提高准确性。

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

还值得注意的是,降维特征选择/特征提取。不同之处在于特征选择以单变量方式减少维度,即它在不改变当前出现的情况下逐个删除术语,而特征提取(我认为 Ben Allison 指的是)是多变量的,结合一个或多个单个术语一起产生更高的正交术语,(希望)包含更多信息并减少特征空间。

关于您对文档频率的使用,您是仅使用包含术语的文档的概率/百分比,还是使用在文档中找到的术语密度?如果类别一只有 10 个文档,并且每个文档包含一个术语,那么类别一确实与文档相关联。但是,如果类别二只有 10 个文档,每个文档都包含相同的词一百次,那么显然类别二与该词的关系比类别一高得多。如果不考虑术语密度,则此信息将丢失,并且您拥有的类别越少,此损失的影响就越大。同样,只保留高频词并不总是谨慎的,因为它们实际上可能没有提供任何有用的信息。

另外,您如何索引数据,您是使用具有简单布尔索引的向量空间模型还是使用更复杂的度量(例如 TF-IDF)?考虑到场景中的类别数量较少,更复杂的度量将是有益的,因为它们可以说明每个类别相对于整个数据集的重要性的术语重要性。

就个人而言,我会先尝试上述一些可能性,然后如果您需要额外的性能提升,则考虑使用(或组合)复杂方程来调整特征选择/提取。


额外的

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

话虽如此,可以用作预测特定数据集的积极降维效果的指标是“离群值计数”分析,它使用离群特征中信息增益的下降来确定该信息的可能性有多大。在特征选择过程中丢失。您可以在原始和/或处理后的数据上使用它来估计您应该多积极地修剪特征(或视情况取消修剪)。可以在此处找到描述它的论文:

具有异常计数信息的纸张

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

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

于 2013-03-17T14:02:27.393 回答
5

我会推荐降维而不是特征选择。考虑奇异值分解主成分分析,甚至更好地考虑它是​​为词袋表示量身定制的,潜在狄利克雷分配。这将允许您在概念上保留包含所有单词的表示,但通过利用它们之间的相似性(甚至同义词类型)关系将它们折叠到更少的维度。

所有这些方法都有相当标准的实现,您可以访问并运行它们——如果您让我们知道您使用的是哪种语言,我或其他人将能够为您指明正确的方向。

于 2012-11-30T11:30:07.343 回答
4

有一个python用于特征选择的库 TextFeatureSelection。该库以分数的形式为每个单词令牌、二元组、三元组等提供区分能力。

那些了解机器学习中的特征选择方法的人,它基于过滤器方法,并为 ML 工程师提供了提高其 NLP 和深度学习模型中的分类精度所需的工具。它有 4 种方法,即卡方互信息比例差 和信息增益,以帮助在输入机器学习分类器之前选择单词作为特征。

from TextFeatureSelection import TextFeatureSelection

#Multiclass classification problem
input_doc_list=['i am very happy','i just had an awesome weekend','this is a very difficult terrain to trek. i wish i stayed back at home.','i just had lunch','Do you want chips?']
target=['Positive','Positive','Negative','Neutral','Neutral']
fsOBJ=TextFeatureSelection(target=target,input_doc_list=input_doc_list)
result_df=fsOBJ.getScore()
print(result_df)

#Binary classification
input_doc_list=['i am content with this location','i am having the time of my life','you cannot learn machine learning without linear algebra','i want to go to mars']
target=[1,1,0,1]
fsOBJ=TextFeatureSelection(target=target,input_doc_list=input_doc_list)
result_df=fsOBJ.getScore()
print(result_df)

编辑:

它现在也具有用于特征选择的遗传算法。

from TextFeatureSelection import TextFeatureSelectionGA
#Input documents: doc_list
#Input labels: label_list
getGAobj=TextFeatureSelectionGA(percentage_of_token=60)
best_vocabulary=getGAobj.getGeneticFeatures(doc_list=doc_list,label_list=label_list)

编辑2

现在有另一种方法TextFeatureSelectionEnsemble,它在集成时结合特征选择。它通过文档频率阈值对基本模型进行特征选择。在集成层,它使用遗传算法来识别基本模型的最佳组合并仅保留这些组合。

from TextFeatureSelection import TextFeatureSelectionEnsemble 

imdb_data=pd.read_csv('../input/IMDB Dataset.csv')
le = LabelEncoder()
imdb_data['labels'] = le.fit_transform(imdb_data['sentiment'].values)

#convert raw text and labels to python list
doc_list=imdb_data['review'].tolist()
label_list=imdb_data['labels'].tolist()

#Initialize parameter for TextFeatureSelectionEnsemble and start training
gaObj=TextFeatureSelectionEnsemble(doc_list,label_list,n_crossvalidation=2,pickle_path='/home/user/folder/',average='micro',base_model_list=['LogisticRegression','RandomForestClassifier','ExtraTreesClassifier','KNeighborsClassifier'])
best_columns=gaObj.doTFSE()`

检查项目以获取详细信息:https ://pypi.org/project/TextFeatureSelection/

于 2020-05-27T12:47:01.347 回答
1

线性 svm 推荐用于高维特征。根据我的经验,SVM 准确性的最终限制取决于正面和负面的“特征”。您可以进行网格搜索(或者在线性 svm 的情况下,您可以只搜索最佳成本值)以找到最大精度的最佳参数,但最终您会受到特征集可分离性的限制。你没有得到 90% 的事实意味着你仍然需要做一些工作来寻找更好的特性来描述你的类成员。

于 2012-11-28T22:37:45.333 回答
1

我敢肯定这对于海报来说已经太晚了,但也许它对其他人有用。减少特征的卡方方法很容易实现。假设 BoW 二进制分类为 C1 和 C2 类,对于候选特征中的每个特征 f 计算 C1 中 f 的频率;计算总字数 C1;对 C2 重复计算;根据 p 值是否低于某个阈值(例如 p < 0.05)计算卡方确定过滤器候选特征。可以在这里看到使用 Python 和 nltk 的教程:http ://streamhacker.com/2010/06/16/text-classification-sentiment-analysis-eliminate-low-information-features/ (如果我没记错的话,我相信作者错误地将这种技术应用于他的测试数据,从而使报告的结果产生偏差)。

于 2014-06-10T21:02:09.557 回答