赞
踩
学习目标
在讲这两个概率之前我们通过⼀个例子,来计算⼀些结果:
问题如下:
计算结果为:
P(喜欢) = 4/7
P(程序员, 匀称) = 1/7(联合概率)
P(程序员|喜欢) = 2/4 = 1/2(条件概率)
P(程序员, 超重|喜欢) = 1/4
思考题:在小明是产品经理并且体重超重的情况下,如何计算小明被女神喜欢的概率?
即P(喜欢|产品, 超重) = ?
此时我们需要用到朴素贝叶斯进行求解,在讲解贝叶斯公式之前,首先复习⼀下联合概率、条件概率和相互独立的概念。
那么思考题就可以套用贝叶斯公式这样来解决:
P(喜欢|产品, 超重) = 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
那么这个公式如果应用在文章分类的场景当中,我们可以这样看:
公式分为三个部分:
如果计算两个类别概率比较:
所以我们只要比较前⾯的大小就可以,得出谁的概率大
需求:通过前四个训练样本(文章),判断第五篇文章,是否属于China类
P(C|Chinese, Chinese, Chinese, Tokyo, Japan) --> P(Chinese, Chinese, Chinese, Tokyo, Japan|C) * P(C) / P(Chinese, Chinese, Chinese, Tokyo, Japan) = P(Chinese|C)^3 * P(Tokyo|C) * P(Japan|C) * P(C) / [P(Chinese)^3 * P(Tokyo) * P(Japan)] # 这个⽂章是需要计算是不是China类,是或者不是最后的分⺟值都相同: # ⾸先计算是China类的概率: P(Chinese|C) = 5/8 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
# 这个⽂章是需要计算是不是China类:
⾸先计算是China类的概率: 0.0003
P(Chinese|C) = 5/8 --> 6/14
P(Tokyo|C) = 0/8 --> 1/14
P(Japan|C) = 0/8 --> 1/14
接着计算不是China类的概率: 0.0001
P(Chinese|C) = 1/3 -->(经过拉普拉斯平滑系数处理) 2/9
P(Tokyo|C) = 1/3 --> 2/9
P(Japan|C) = 1/3 --> 2/9
学习目标
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
import jieba
# 加载数据
data = pd.read_csv('./data/书籍评价.csv', encoding='gbk')
# 2.1) 取出内容列,对数据进⾏分析
content = data['内容']
content
data.loc[:, '评价'] == '好评'
# 2.2) 判定评判标准 -- 1好评;0差评
data.loc[data.loc[:, '评价'] == '好评', '评论编号'] = 1
data.loc[data.loc[:, '评价'] == '差评', '评论编号'] = 0
# data.head()
good_or_bad = data['评价'].values # 获取数据
print(good_or_bad)
# ['好评' '好评' '好评' '好评' '差评' '差评' '差评' '差评' '差评' '好评' '差评' '差评' '差评']
# 加载停⽤词
stopwords = []
with open('./data/stopwords.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
print(lines)
# stopwords # 查看新产⽣列表
stopwords = []
with open('./data/stopwords.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
# print(lines)
for tmp in lines:
line = tmp.strip()
stopwords.append(line)
#对停⽤词表进⾏去重
stopwords = list(set(stopwords)) #去重 列表形式
# 2.4) 把“内容”处理,转化成标准格式
comment_list = []
for tmp in content:
print(tmp)
# 把一句话变成一个个词
# 对⽂本数据进⾏切割 # cut_all 参数默认为 False,所有使⽤ cut ⽅法时默认为精确模式
seg_list = jieba.cut(tmp, cut_all=False)
# print(seg_list) # <generator object Tokenizer.cut at 0x0000000007CF7DB0>
seg_str = ','.join(seg_list)
# print(seg_str)
comment_list.append(seg_str) # ⽬的是转化成列表形式
# print(comment_list) # 查看comment_list列表。
comment_list
# 进⾏统计词个数
# 实例化对象
# CountVectorizer 类会将⽂本中的词语转换为词频矩阵
con = CountVectorizer(stop_words=stopwords)
x = con.fit_transform(comment_list) # 它通过 fit_transform 函数计算各个词语出现的次数
con.get_feature_names() # 通过 get_feature_names()可获取词袋中所有⽂本的关键字
# 通过 toarray()可看到词频矩阵的结果
# 准备训练集 这⾥将⽂本前10⾏当做训练集 后3⾏当做测试集
x_train = x.toarray()[:10, :] # 前十作为测试集
y_train = data['评价'][: 10]
# 准备测试集
x_test = x.toarray()[10:, :]
y_test = data['评价'][10:]
# 构建⻉叶斯算法分类器
mb = MultinomialNB(alpha=1) # alpha 为可选项,默认 1.0,添加拉普拉修/Lidstone 平滑参数
# 训练数据
mb.fit(x_train, y_train)
# 预测数据
y_pre = mb.predict(x_test)
#预测值与真实值展示
print('预测值:', y_pre)
print('真实值:', y_test)
mb.score(x_test, y_test)
应用说明:百度AI情感倾向分析
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。
在计算条件概率分布P(X=x∣Y=c_k)时,NB引入了⼀个很强的条件独立假设,即,当Y确定时,X的各个特征分量取值之间相互独立。
为了避免贝叶斯定理求解时面临的组合爆炸、样本稀疏问题。
假设条件概率分为:
解决这⼀问题的方法是采用贝叶斯估计。
简单来说,引入 λ,
1)简单来说:
从概率框架的⻆度来理解机器学习;主要有两种策略:
第⼀种:给定 x, 可通过直接建模 P(c |x) 来预测 c,这样得到的是"判别式模型" (discriminative models);
第⼆种:也可先对联合概率分布 P(x,c) 建模,然后再由此获得 P(c |x), 这样得到的是"生成式模型" (generative models) ;
显然,前⾯介绍的逻辑回归、决策树、都可归⼊判别式模型的范畴,还有后⾯学到的BP神经网络⽀持向量机等;
对生成式模型来说,必然需要考虑
区别二:
区别三:
2)进一步说明:
前者是生成式模型,后者是判别式模型,⼆者的区别就是⽣成式模型与判别式模型的区别。
首先,Navie Bayes通过已知样本求得先验概率P(Y), 及条件概率P(X|Y), 对于给定的实例,计算联合概率,进而求出后验概率。也就是说,它尝试去找到底这个数据是怎么生成的(产⽣的),然后再进行分类。哪个类别最有可能产生这个信号,就属于那个类别。
相比之下,Logistic回归不关心样本中类别的比例及类别下出现特征的概率,它直接给出预测模型的式⼦。设每个 特征都有⼀个权重,训练样本数据更新权重w,得出最终表达式。
加油!
感谢!
努力!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。