朴素贝叶斯算法
概率
概率定义为一件事情发生的可能性。
下面我们来看一个小例子:
1 显然等于4/7.因为一共有7个样本,而“喜欢”的样本占4个。
2 显然等于1/7.因为一共有7个样本,而“是程序员并且匀称”的样本占1个。
3 为1/2.因为在喜欢的条件下是程序员,这加了条件,缩小了分母范围,“喜欢”占4个,其中有程序员2个,即为2/4=1/2。
4 同3的分析,为1/4。
联合概率,条件概率与相互独立
联合概率:包含多个条件,且所有条件同时成立的概率。
条件概率:事件A在事件B已经发生条件下的发生概率。
相互独立:若p(A,B) = p(A)*p(B),则称事件A与事件B相互独立。
贝叶斯公式
w为给定文档的特征值,c为文档类别。
所谓“朴素”,就是指特征与特征之间是相互独立的。
应用场景:单词作为特征的文本分类。
在实际应用中,贝叶斯公式可变为以下公式:
那么接下来,我们看一个公式应用的小例子:
代入公式,我们发现利用贝叶斯求C与非C的概率时,分母是一样的,所以我们只计算分子即可。
概率出现0的根本原因就是样本量太少了,避免0概率的出现,要引入拉普拉斯平滑系数α(不只是概率为0的加入平滑系数,概率不为0的也要加)
这样,最后的结果是
代码实现朴素贝叶斯对文本分类
#导入新闻数据集 from sklearn.datasets import fetch_20newsgroups #导入文本的特征抽取模块 from sklearn.feature_extraction.text import TfidfVectorizer #导入贝叶斯算法模块 from sklearn.naive_bayes import MultinomialNB
#朴素贝叶斯算法 def nb_news(): ''' 用朴素贝叶斯算法对新闻进行分类 :return: ''' #1 获取数据,第一个参数是数据集的下载位置,第二个是你需要什么,模式是只有训练集,这里选择所有 news = fetch_20newsgroups('F:/BaiduNetdiskDownload',subset="all") #2 划分数据集,参数:数据集的特征值,数据集的目标值。返回值: x_train,x_test,y_train,y_test = train_test_split(news.data,news.target) #3 特征工程:文本特征抽取——TfIdf transfer = TfidfVectorizer() #对训练集和测试集进行特征抽取 x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) #4 朴素贝叶斯算法预估器流程 estimator = MultinomialNB() #将训练集的特征值和目标值传入 estimator.fit(x_train,y_train) #5 模型评估 # 方法1:直接比对真实值和预测值 y_predict = estimator.predict(x_test) print("y_predict:\n", y_predict) print("直接比对真实值和预测值:\n", y_test == y_predict) # 方法2:计算准确率 score = estimator.score(x_test, y_test) print("准确率为:\n", score) return None
结果:
朴素贝叶斯算法的总结
优点:
贝叶斯模型发源于古典数学理论,有稳定的分类效率。
对缺失数据不太敏感,算法也比较简单,常用于分本分类。
分类的准确度高,数度快。
缺点:
由于使用了样本属性独立性的假设,所以当特征属性有关联时其效果不好。