赞
踩
目录
tips:标题前有“***”的内容为补充内容,是给好奇心重的宝宝看的,可自行跳过。文章内容被“
文章内容”删除线标记的,也可以自行跳过。“!!!”一般需要特别注意或者容易出错的地方。
本系列文章是作者边学习边总结的,内容有不对的地方还请多多指正,同时本系列文章会不断完善,每篇文章不定时会有修改。
朴素贝叶斯是一种分类算法,经常被用于文本分类,它的输出结果是某个样本属于某个类别的概率。
朴素:之所以朴素,就在于假定了特征与特征相互独立。(这样有些概率才有可计算性)
贝叶斯:数学中的贝叶斯公式。
通过贝叶斯公式计算样本属于某个类别的概率。从而确定其分类。
通过求得先验概率得到所求概率。
正向概率:假设袋子里面有N个白球,M个黑球,你伸手进去摸出黑球的概率是多大?
逆向概率:事先不知道袋子里面黑白球的比例,闭着眼睛摸出一个或者好几个球,观察取出来的球的颜色后,我们可以对袋子里面的黑白球的比例作出什么样的预测?
---
边缘概率(先验概率):某个事件发生的概率。(边缘分布命名原因是因为它出现在概率分布表格的边缘)在联合概率中,把最终结果中那些不需要的事件通过合并成它们的全概率,而消去它们,这称为边缘化(marginalization)。
联合概率:含多个条件,且所有条件同时成立的概率。
条件概率(后验概率):事件A在另一个事件B已经发生条件下的发生概率。
相互独立:两事件联合概率等于两事件边缘概率之积,则他们相互独立。
通过案例 “ 判断女神对你的喜欢情况 ”理解:
问题:
- 被女神喜欢的概率? P(喜欢)=4/7
- 职业是程序员并且体型匀称的概率? P(程序员,匀称)=1/7
- 在女神喜欢的条件下,职业是程序员的概率? P(程序员|喜欢)=2/4=1/2
- 在女神喜欢的条件下,职业是程序员、体重超重的概率? P(程序员,超重|喜欢)=1/4
-
- 小明被女神喜欢的概率? P(喜欢|产品,超重)=?
这里就需要用到贝叶斯公式:
P(喜欢|产品, 超重) = P(产品,超重|喜欢)P(喜欢) / P(产品,超重)
计算可以发现:
P(产品,超重|喜欢) 和 P(产品,超重) 的结果均为0,导致无法计算结果。这是因为我们的样本量太少了,不具有代表性。
本来现实生活中,肯定是存在职业是产品经理并且体重超重的人的,P(产品,超重)不可能为0;
而且事件职业是产品经理和事件体重超重通常被认为是相互独立的事件,但是,根据我们有限的7个样本计算 P(产品,超重) = P(产品)P(超重) 不成立。
而朴素贝叶斯可以帮助我们解决这个问题:
简单理解,就是假定了特征与特征之间相互独立的贝叶斯公式。
所以小明被女神喜欢的概率可以这样算:
- P(产品, 超重) = P(产品) * P(超重) = 2/7 * 3/7 = 6/49
- p(产品, 超重|喜欢) = P(产品|喜欢) * P(超重|喜欢) = 1/2 * 1/4 = 1/8
- P(喜欢|产品, 超重) = P(产品, 超重|喜欢)P(喜欢)/P(产品, 超重) = 1/8 * 4/7 / 6/49 = 7/12
拉普拉斯平滑是为了解决零概率的问题。假定训练样本很大时,每个分量x的计数加1造成的估计概率变化可以忽略不计,但可以方便有效的避免零概率问题。
贝叶斯公式应用在文章分类中,可以这样看:
案例理解:
需求:通过前四个训练样本(文章),判断第五篇文章,是否属于China类
应用贝叶斯公式计算测试集,简化后应该是如下结果:
当是China类的概率为3/4,和不是china类的概率1/4。
,,当是China类和不是china类的概率是不变的,分别是6/11,1/11,1/11。
所以我们需要计算的就是,,。且需要分别计算是China类和不是china类的概率。
- # 计算是China类的概率:
- P(Chinese|C) = 5/8 # 是china类,共8词,5个Chinese
- P(Tokyo|C) = 0/8
- P(Japan|C) = 0/8
- # 计算不是China类的概率:
- P(Chinese|C) = 1/3
- P(Tokyo|C) = 1/3
- P(Japan|C) = 1/3
从上面我们可以得到, ,都是0,这是不合理的。如果词频列表里面有很多次数都为0,很可能计算结果都为0。所以需要用到拉普拉斯平滑系数。
利用拉普拉斯平滑系数 解决后:
- # m=6(训练集中特征词的个数,重复不计)
-
- 是China类的概率:
- P(Chinese|C) = 5/8 --> 6/14
- P(Tokyo|C) = 0/8 --> 1/14
- P(Japan|C) = 0/8 --> 1/14
-
- 不是China类的概率:
- P(Chinese|C) = 1/3 --> 2/9
- P(Tokyo|C) = 1/3 --> 2/9
- P(Japan|C) = 1/3 --> 2/9
代入公式得到:
- [P(Chinese|C)^3 * P(Tokyo|C) * P(Japan|C) * P(C)] / [P(Chinese)^3 * P(Tokyo) * P(Japan)]
-
- # 是china类
- =[(6/14)^3 * (1/14) * (1/14) * (3/4)] / [(6/11)^3 * (1/11) * (1/11)]
- =(3*11^5)/(4*14^5)
-
- # 不是china类
- =[(2/9)^3 * (2/9) * (2/9) * (3/4)] / [(6/11)^3 * (1/11) * (1/11)]
- =(22^5)/(4*6^3*3^9)
sklearn20类新闻分类,20个新闻组数据集包含20个主题的18000个新闻组帖子。
- from sklearn.datasets import fetch_20newsgroups
-
- # 获取数据
- news = fetch_20newsgroups(subset='all',data_home='data')
-
-
-
- print("新闻数据集的键:",news.keys())
-
- print(len(news.data))
- print(len(news.target))
- print(len(news.target_names))
-
- print(news.target_names)
- sklearn.naive_bayes.MultinormalNB(alpha=1.0)
-
- 导入:
- from sklearn.naive_bayes import MultinormalNB
-
- 语法:
- mlt=MultinormalNB(alpha=1.0)
- alpha:拉普拉斯平滑系数
-
-
- mlt.fit( x_train,y_train ):接收训练集特征和训练集目标
- mlt.predict( x_test ):接收测试集特征,返回数据的类标签
- mlt.score(x_test, y_test):接收测试集特征 和 测试集目标,返回准确率。
- mlt.get_params():获取接收的参数(alpha、fit_prior这种参数)
- mlt.set_params():设置参数
- mlt.partial_fit():增量测试,用于数据量太大不能一次装入内存的情况,
- from sklearn.datasets import fetch_20newsgroups
- from sklearn.model_selection import train_test_split
- from sklearn.feature_extraction.text import TfidfVectorizer
-
- from sklearn.naive_bayes import MultinomialNB
- # 获取数据
- news = fetch_20newsgroups(subset='all',data_home='data')
- # 划分数据集
- x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25, random_state=1473)
- # 对数据集进行特征抽取
- tf = TfidfVectorizer()
-
- # 以训练集当中的词的列表进行每篇文章重要性统计['a','b','c','d']
- x_train = tf.fit_transform(x_train)
-
- x_test = tf.transform(x_test)
- # 进行朴素贝叶斯算法的预测,alpha是拉普拉斯平滑系数
- mlt = MultinomialNB(alpha=1.0)
-
- print(x_train.toarray())
- # 训练
- mlt.fit(x_train, y_train)
- y_predict = mlt.predict(x_test)
-
- print("预测的文章类别为:", y_predict)
-
- # 得出准确率
- print("准确率为:", mlt.score(x_test, y_test))
用分类报告【详情请看机器学习(四) -- 模型评估(2)-分类报告】
- from sklearn.metrics import classification_report
- print(classification_report(y_test, y_predict, target_names=news.target_names))
精确率(precision)、召回率(recall)、F1 值(F1-score)和样本数目(support)
用ROC曲线和AUC
- from sklearn.metrics import roc_curve
-
- fpr,tpr,thresholds=roc_curve(y_test,y_predict)
-
- plt.plot(fpr, tpr)
- plt.axis("square")
- plt.xlabel("假正例率/False positive rate")
- plt.ylabel("正正例率/True positive rate")
- plt.title("ROC curve")
- plt.show()
- from sklearn.metrics import roc_auc_score
-
- # 把0-19总计20个分类,变为0和1
- y_test = np.where(y_test == 0, 1, 0)
- y_predict = np.where(y_predict == 0, 1, 0)
- # roc_auc_score的y_test只能是二分类,针对多分类如何计算AUC
- print("AUC指标:", roc_auc_score(y_test, y_predict))
经过模型评估后通过的模型可以代入真实值进行预测。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。