“ 分类算法的核心就是在于经验不断积累,不断迭代自己的规则,从而得到最好的答案。”

01
—
贝叶斯推理、贝叶斯分类器、朴素贝叶斯
02
—
工作流程
朴素贝叶斯常用于文本分类,特别英文,实际应用在垃圾文本过滤、情感预测、推荐系统等,主要是自然语言处理 NLP。
准备阶段:人工确定特征属性,分类器质量很大程度上由特征属性、特征属性划分及训练样本质量决定。
训练阶段:生成分类器,输入是特征属性和训练样本,输出是分类器。计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率
应用阶段:输入是分类器和新数据,输出是新数据的分类结果。
03
—
Python sklearn 文档分类步骤
由于近期主要以理解算法原理为先,暂无过多实操所以并没有深入进行代码练习,只是浅尝辄止。
1、库调用
朴素贝叶斯分类算法分为:
高斯朴素贝叶斯(GaussianNB):连续特征变量,符合高斯分布(比如说人的身高,物体的长度这种自然界的现象)
from sklearn.naive_bayes import GaussianNB
多项式朴素贝叶斯(MultinomialNB):离散特征变量,符合多项分布,以单词为粒度计算在某个文件中的具体次数或单词的TF-IDF 值等。
from sklearn.naive_bayes import MultinomialNB
伯努利朴素贝叶斯(BernoulliNB):布尔特征变量,符合 0/1 分布,以文件为粒度单词在某文件中出现为 1,否为 0
from sklearn.naive_bayes import BernoulliNB
后两种主要用于文档分类。
2、TF-IDF 解析
TF-IDF=TF*IDF(乘积):评估某个词语对于一个文件集或文档库中的其中一份文件的重要程度
from sklearn.feature_extraction.text import TfidVectorizer
词频 TF 计算了一个单词在文档中出现的次数

逆向文档频率 IDF,是指一个单词在文档中的区分度。它认为一个单词出现在的文档数越少,就越能通过这个单词把该文档和其他文档区分开。IDF 越大就代表该单词的区分度越大。

3、对文档分词
英文NTLK
import nltkword_list = nltk.word_tokenize(text) #分词nltk.pos_tag(word_list) #标注单词的词性
中文jieba(之前学过,请回顾:Python 38 之六 PyInstaller库和jieba库)
import jiebaword_list = jieba.cut (text) #中文分词
4、加载停用词
从网上可以找到中文常用的停用词保存在 stop_words.txt,然后利用 Python 的文件读取函数读取文件,保存在 stop_words 数组中
stop_words = [line.strip().decode('utf-8') for line in io.open('stop_words.txt').readlines()]
5、计算单词权重
创建 TfidfVectorizer→fit_transform拟合→TF*IDF空间 features
tf = TfidfVectorizer(stop_words=stop_words, token_pattern=token_pattern,max_df=0.5)features = tf.fit_transform(train_contents)



6、生成分类器
# 多项式贝叶斯分类器from sklearn.naive_bayes import MultinomialNBclf = MultinomialNB(alpha=0.001).fit(train_features, train_labels)
其中alpha为平滑参数,如果一个单词在训练样本中没有出现,这个单词的概率就会被计算为 0。但训练集样本只是整体的抽样情况,我们不能因为一个事件没有观察到,就认为整个事件的概率为 0。为了解决这个问题,我们需要做平滑处理。
alpha=1 时,使用的是 Laplace 平滑。Laplace 平滑就是采用加 1 的方式
当 0<alpha<1 时,使用的是 Lidstone 平滑,可以设置 alpha 为 0.001。
这里留个疑问,什么时候用Laplace 平滑,什么时候用 Lidstone 平滑?
7、分类器做预测
获取测试集特征矩阵 test_features
test_tf = TfidfVectorizer(stop_words=stop_words, max_df=0.5, vocabulary=train_vocabulary)test_features=test_tf.fit_transform(test_contents)
对新数据预测
predicted_labels=clf.predict(test_features)
8、计算准确率
from sklearn import metricsprint metrics.accuracy_score(test_labels, predicted_labels)
——以上参考数据分析实战-陈旸





