朴素贝叶斯实战
2023-02-12·Machine Learning, Naive Bayes, sklearn
sklearn 中的三种朴素贝叶斯算法
- 高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布,比如人的身高、物体的长度
- 多项式朴素贝叶斯:特征变量是离散变量,符合多项式,在文档分类中特征变量体现在一个单词出现的次数,或者是单词的 TF-IDF 值
- 伯努利朴素贝叶斯:特征变量是布尔变量,符合 0-1 分布,在文档分类中特征是单词是否出现
TF-IDF
- TF(Term Frequency,词频):计算一个单词在文档中出现的次数,认为一个单词的重要和它在文档中出现的次数呈正比
- IDF(Inverse Document Frequency,逆向文档频率):一个单词在文档中的区分度,认为一个单词出现在文档数越少,就越能通过该单词把该文档和其他文档区分开。IDF 越大,表明该单词的区分度越大
- TF-IDF:词频和逆向文档的乘积,该值表示这个单词在一个文档中出现的次数多,同时又很少出现在其他文档中,这样的单词适合用于分类
文档分类流程
- 基于分词的数据准备:分词、单词权重计算、去掉停用词
- 应用朴素贝叶斯分类器:通过训练集得到分类器,应用于测试集,与实际情况对比得到准确率
模块1:对文档进行分词
# English
import nltk
word_list = nltk.word_tokenize(text)
nltk.pos_tag(word_list)
# Chinese
import jieba
word_list = jieba.cut(word)
模块2:加载停用词表
stop_words = [line.strip() for line in io.open('stop_words.txt').readlines()]
模块3:计算单词权重(TF-IDF)
tf = TfidfVectorizer(stop_words=stop_words, max_df=0.5)
features = tf.fit_transform(train_contents)
max_df=0.5 代表一个单词在 50% 的文档都出现过,则携带信息非常少,不作为分词统计。
模块4:生成朴素贝叶斯分类器
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB(alpha=0.001).fit(train_features, train_labels)
- alpha=1:Laplace 平滑,通过 +1 方式统计没有出现过的单词概率
- 0 < alpha < 1:Lidstone 平滑,alpha 越小,迭代次数越多,精度越高
模块5:使用分类器做预测
test_features = tf.transform(test_words_list)
predicted_labels = clf.predict(test_features)
模块6:计算准确率
from sklearn import metrics
print(metrics.accuracy_score(test_labels, predicted_labels))
#Machine Learning#Naive Bayes#sklearn