文本分类 特征选取之CHI开方检验

开方检验最基本的思想:

通过观察实际值与理论值的偏差来确定理论的正确与否。

具体实现:

具体做的时候常常先
(1)假设两个变量确实是独立的(行话就叫做“原假设”),
(2)然后观察实际值(也可以叫做观察值)与理论值(这个理论值是指“如果两者确实独立”的情况下应该有的值)的偏差程度。

  • 如果偏差足够小,我们就认为误差是很自然的样本误差,是测量手段不够精确导致或者偶然发生的,两者确确实实是独立的,此时就接受原假设;如果偏差大到一定程度,使得这样的误差不太可能是偶然产生或者测量不精确所致,我们就认为两者实际上是相关的,即否定原假设,而接受备择假设。
  • 那么用什么来衡量偏差程度呢?
    假设理论值为E(这也是数学期望的符号哦),实际值为x,如果仅仅使用所有样本的观察值与理论值的差值x-E之和:
    在这里插入图片描述
  • 来衡量,单个的观察值还好说,当有多个观察值x1,x2,x3的时候,很可能x1-E,x2-E,x3-E的值有正有负,因而互相抵消,使得最终的结果看上好像偏差为0,但实际上每个都有偏差,而且都还不小!此时很直接的想法便是使用方差代替均值,这样就解决了正负抵消的问题,即使用:

在这里插入图片描述

  • 这时又引来了新的问题,对于500的均值来说,相差5其实是很小的(相差1%),而对20的均值来说,5相当于25%的差异,这是使用方差也无法体现的。因此应该考虑改进上面的式子,让均值的大小不影响我们对差异程度的判断:

在这里插入图片描述 式(1)

  • 上面这个式子已经相当好了。实际上这个式子就是开方检验使用的差值衡量公式。当提供了数个样本的观察值x1,x2,……xi ,……xn之后,代入到式(1)中就可以求得开方值,用这个值与事先设定的阈值比较,如果大于阈值(即偏差很大),就认为原假设不成立,反之则认为原假设成立。

在文本分类问题的特征选择阶段,我们主要关心一个词t(一个随机变量)与一个类别c(另一个随机变量)之间是否相互独立?

  • 如果独立,就可以说词t对类别c完全没有表征作用,即我们根本无法根据t出现与否来判断一篇文档是否属于c这个分类。但与最普通的开方检验不同,我们不需要设定阈值,因为很难说词t和类别c关联到什么程度才算是有表征作用,我们只想借用这个方法来选出一些最最相关的即可。

  • 此时我们仍然需要明白对特征选择来说原假设是什么,因为计算出的开方值越大,说明对原假设的偏离越大,我们越倾向于认为原假设的反面情况是正确的。 我们能不能把原假设定为“词t与类别c相关“?

  • 原则上说当然可以,但此时你会发现根本不知道此时的理论值该是多少!你会把自己绕进死胡同。选择的过所以我们一般都使用**”词t与类别c不相关**“来做原假设。计算过程也变成了为每个词计算它与类别c的开方值,从大到小排个序(此时开方值越大越相关),取前k个就可以。

  • 好,原理有了,该来个例子说说到底怎么算了。

参考:https://blog.csdn.net/wangran51/article/details/8446234

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Python中进行文本分类特征选择,可以使用朴素贝叶斯分类器。具体步骤如下: 1.准备数据集,将数据集分为训练集和测试集。 2.对文本进行预处理,包括分词、去除停用词、词干提取等。 3.将文本转换为特征向量,可以使用词袋模型或TF-IDF模型。 4.使用朴素贝叶斯分类器进行训练,可以使用nltk库中的NaiveBayesClassifier类。 5.评估分类器的性能,可以使用nltk库中的accuracy()函数计算准确率。 6.观察分类特征的贡献,可以使用show_most_informative_features()函数查看分类器中最具有区分性的特征。 下面是一个示例代码: ```python import nltk from nltk.corpus import stopwords from nltk.tokenize import word_tokenize from nltk.stem import SnowballStemmer from sklearn.feature_extraction.text import TfidfVectorizer # 准备数据集 documents = [("This is a sample sentence.", "positive"), ("This is another example sentence.", "positive"), ("This sentence is not good.", "negative"), ("I don't like this product.", "negative")] # 分词、去除停用词、词干提取 stop_words = set(stopwords.words('english')) stemmer = SnowballStemmer('english') all_words = [] for doc in documents: words = [stemmer.stem(word.lower()) for word in word_tokenize(doc[0]) if word.lower() not in stop_words] all_words.extend(words) all_words = nltk.FreqDist(all_words) # 将文本转换为特征向量 word_features = list(all_words.keys())[:100] def document_features(document): document_words = set([stemmer.stem(word.lower()) for word in word_tokenize(document) if word.lower() not in stop_words]) features = {} for word in word_features: features['contains({})'.format(word)] = (word in document_words) return features featuresets = [(document_features(d), c) for (d,c) in documents] train_set, test_set = featuresets[:3], featuresets[3:] vectorizer = TfidfVectorizer() train_vectors = vectorizer.fit_transform([d[0] for d in documents[:3]]) test_vectors = vectorizer.transform([d[0] for d in documents[3:]]) # 使用朴素贝叶斯分类器进行训练 classifier = nltk.NaiveBayesClassifier.train(train_set) # 评估分类器的性能 print(nltk.classify.accuracy(classifier, test_set)) # 观察分类特征的贡献 classifier.show_most_informative_features(5) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九霄王

我们一起为这个世界努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值