Task3 特征选择 (2 days)
1. TF-IDF原理。
2. 文本矩阵化,使用词袋模型,以TF-IDF特征值为权重。(可以使用Python中TfidfTransformer库)
3. 互信息的原理。
4. 使用第二步生成的特征矩阵,利用互信息进行特征筛选。
参考
- [文本挖掘预处理之TF-IDF:文本挖掘预处理之TF-IDF - 刘建平Pinard - 博客园]https://www.cnblogs.com/pinard/p/6693230.html
- [使用不同的方法计算TF-IDF值:使用不同的方法计算TF-IDF值 - 简书]https://www.jianshu.com/p/f3b92124cd2b
- [sklearn-点互信息和互信息:sklearn:点互信息和互信息 - 专注计算机体系结构 - CSDN博客]https://blog.csdn.net/u013710265/article/details/72848755
- [如何进行特征选择(理论篇)机器学习你会遇到的“坑”:如何进行特征选择(理论篇)机器学习你会遇到的“坑” ]https://baijiahao.baidu.com/s?id=1604074325918456186&wfr=spider&for=pc
一、TF-IDF原理
1.概念
TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。
TF-IDF的主要思想是:如果某个词在一篇文章中出现的频率高,并且在其他文章中很少出现,则认为此词具有很好的类别区分能力,适合用来分类。
词频 TF计算了一个单词在文档中出现的次数,它认为一个单词的重要性和它在文档中出现的次数呈正比。逆向文档频率 IDF,是指一个单词在文档中的区分度。它认为一个单词出现在的文档数越少,就越能通过这个单词把该文档和其他文档区分开。IDF 越大就代表该单词的区分度越大。
所以 TF-IDF 实际上是词频 TF 和逆向文档频率 IDF 的乘积。这样我们倾向于找到 TF 和 IDF 取值都高的单词作为区分,即这个单词在一个文档中出现的次数多,同时又很少出现在其他文档中。这样的单词适合用于分类。TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
2.计算步骤
为什么 IDF 的分母中,单词出现的文档数要加 1 呢?因为有些单词可能不会存在文档中,为了避免分母为 0,统一给单词出现的文档数都加 1。
TF-IDF=TF*IDF
3.使用 sklearn 计算 TF-IDF
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vec = TfidfVectorizer()
tfidf_vec.fit_transform(data)
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
def tf_idf(vectorizer, sentlist):
vectorizer = CountVectorizer(min_df=1)
transformer = TfidfTransformer(stop_words=stopwords)
tfidf = transformer.fit_transform(vectorizer.fit_transform(sentlist))
return tfidf
使用TfidfTransformer
除了考量某词汇在文本出现的频率,还关注包含这个词汇的所有文本的数量,能够削减高频没有意义的词汇出现带来的影响, 挖掘更有意义的特征,相比之下,文本条目越多,Tfidf的效果会越显著
使用CountVectorizer
只考虑词汇在文本中出现的频率
二、文本矩阵化
词集模型 DictVectorizer:单词构成的集合,集合中每个元素只有一个,即词集中的每个单词都只有一个(集合嘛,没有重复元素)。
词袋模型 CountVectorizer:在词集的基础上加入了频率这个维度,即统计单词在文档中出现的次数(令牌化和出现频数统计),通常我们在应用中都选用词袋模型。
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
import os
import numpy as np
import pandas as pd
data_path='midi/home/dataset/aclImdb/train/pos'
train_list=os.listdir(data_path)
data=[]
for i in train_list[:100]:
path=data_path+'/'+i
data.append(open(path).readlines()[0])
vectorizer=CountVectorizer()
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(vectorizer.fit_transform(data))
print (tfidf)
三、互信息的原理
其中H(X)和H(Y) 是边缘熵,H(X|Y)和H(Y|X)是条件熵,而H(X,Y)是X和Y的联合熵。
条件熵就是指,知道X后Y还剩多少信息量(H(Y|X))。或者知道Y后,X还剩多少信息量(H(X|Y))。
那么互信息就是知道X,给Y的信息量带来多少损失(或者知道Y,给X的信息量带来多少损失)。
举个例子,假设H(X)用一块糖来表示,Y代表一杯水,H(X|Y)也就是将这杯水倒在糖上,H(X)还剩多少,那么溶于水的那部分糖就是Y给H(X)带来的损失,即就是互信息,其定义为:
from sklearn import metrics as mr
mr.mutual_info_score(label,x)
互信息特征选择算法的步骤
①划分数据集
②利用互信息对特征进行排序
③选择前n个特征利用SVM进行训练
④在测试集上评价特征子集计算错误率
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import mutual_info_classif
iris=load_iris()
#选择K个最好的特征,返回选择特征后的数据
SelectKBest(mutual_info_classif, k=2).fit_transform(iris.data, iris.target)
参考博客:
1.https://blog.csdn.net/mxs1123/article/details/88090715
2.https://blog.csdn.net/Heitao5200/article/details/88242389#1__1
3.https://blog.csdn.net/qq_35175666/article/details/89162925
5.https://blog.csdn.net/nc514819873/article/details/89094687
6.https://blog.csdn.net/ljfwz153076024/article/details/89071850#PR_77