繁体   English   中英

文本分类的特征选择和减少

[英]Feature Selection and Reduction for Text Classification

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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


额外的

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

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

包含离群计数信息的论文

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

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

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

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

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

那些了解机器学习中的特征选择方法的人,它基于过滤方法,并为 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/

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM