朴素贝叶斯算法(下)

算法篇

朴素贝叶斯

**多项式朴素贝叶斯

多项式朴素贝叶斯多用于出现次数作为特征的数据,特征数据值必须是非负的。对于文本数据的处理,就非常适合用多项式朴素贝叶斯
计算原理:

  • 比如有一个预测好坏评论的数据集,在第一个样本中good出现了2次,bad出现了0次,是好评;在第二个样本中good出现了0次,bad出现了2次,是差评。
    g b
    2 0 好评
    0 2 差评
  • 现在有一测试集 [ 5,0 ]
  • 利用朴素贝叶斯公式分别计算 P ( 好 评 ∣ 特 征 ) P( 好评 | 特征) P() P ( 差 评 ∣ 特 征 ) P( 差评 | 特征 ) P()
    P ( 好 评 ∣ 特 征 ) = P ( 好 评 ) ∗ P ( g o o d = 5 ∣ 好 评 ) ∗ P ( b a d = 0 ∣ 好 评 ) P( 好评 | 特征)=P( 好评 )*P(good=5|好评)*P(bad=0|好评) P()=P()P(good=5)P(bad=0)
    P ( 差 评 ∣ 特 征 ) = P ( 差 评 ) ∗ P ( g o o d = 5 ∣ 差 评 ) ∗ P ( b a d = 0 ∣ 差 评 ) P( 差评 | 特征)=P( 差评 )*P(good=5|差评)*P(bad=0|差评) P()=P()P(good=5)P(bad=0)
  • 真实结果为好评和差评的都有0,所以需要考虑拉普拉斯,分母等于此类别下特征条数+类别数,分子加1, P ( g o o d = 5 ∣ 好 评 ) = ( 2 + 1 1 + 2 ) 5 P(good=5|好评)=(\frac{2+1}{1+2})^5 P(good=5)=(1+22+1)5,需要在概率上增加测试集对应特征出现次数次方
    P ( 好 评 ∣ 特 征 ) = 1 2 ∗ ( 2 + 1 1 + 2 ) 5 ∗ ( 0 + 1 1 + 2 ) 0 = 1 2 P( 好评 | 特征)=\frac{1}{2}*(\frac{2+1}{1+2})^5*(\frac{0+1}{1+2})^0=\frac{1}{2} P()=21(1+22+1)5(1+20+1)0=21
    P ( 差 评 ∣ 特 征 ) = 1 2 ∗ ( 0 + 1 1 + 2 ) 5 ∗ ( 2 + 1 1 + 2 ) 0 = 1 486 P( 差评 | 特征)=\frac{1}{2}*(\frac{0+1}{1+2})^5*(\frac{2+1}{1+2})^0=\frac{1}{486} P()=21(1+20+1)5(1+22+1)0=4861
  • 所以最终得出结论,[ 5, 0 ]的测试结果是好评
代码实现
from sklearn.naive_bayes import MultionmialNB
# 实例化
alg = MultionmialNB()
# 拟合
alg.fit(X_train, y_train)

# 查看预测结果
y_pred = alg.predict(X_test)
print('预测结果:', y_pred)

# 查看预测概率
print('概率:', alg.predict_proba(X_test))

**文本数据的处理

以评论数据为例

import jieba  # 结巴分词
from sklearn.navie_state import MultionmialNB

# ------------------------------数据清洗----------------------------
# 去空、去重、去异常

# ------------------------------分词处理----------------------------
def get_word(val):
	return ' '.join(list(jieba.cut(val)))
X = X.transform(get_word)
# ------------------------------数据拆分----------------------------

# ------------------------------词频向量化--------------------------

# ------------------------------使用算法----------------------------
# 使用多项式朴素贝叶斯

**词频向量化

普通词频向量化

词频向量化,是对分词后的数据进行统计样本中出现的次数,分为普通词频向量化和 TF-IDF词频向量化
普通词频向量化是统计出现次数,下面是普通词频向量化的代码实现

import joblib  # 保存模型
from sklearn.feature_extraction.text import CountVectorizer
# 实例化
cv = CountVectorizer()
# 参数:stop_words:停用词,通常是读取一个停用词文本文件作为停用词词典

# 查看处理后的数据词典
print('词典:', cv.get_feature_names())
# 查看词典字典,词作为键,对应词典的索引作为值
print('词典字典:', cv.vocabulary_)

# 拟合,一般都是在训练集上拟合
cv.fit(X_train) 
# 向量化处理
X_train = cv.transform(X_train).toarray()
X_test = cv.transform(X_test).toarray()

# ------------------------加入算法-------------------------------

# ------------------------保存模型-------------------------------
# joblib.dump(算法名, '文件名.model')
TF-IDF词频向量化

词频:TF,指的是某一个给定的词语在该文件中出现的频率
逆向文件频率:IDF,是一个词语普遍重要性的度量, i d f = l o g 1 + n 1 + d o c s ( w , D ) + 1 idf=log\frac{1+n}{1+docs(w,D)}+1 idf=log1+docs(w,D)1+n+1
TF-IDF = TF*IDF
TF-IDF词频向量化是统计的词的重要性,下面是代码实现

from sklearn.feature_extraction.text import TfidfVectorizer
# 实例化
tv = TfidfVectorizer()

# 拟合,一般都是在训练集上拟合
tv.fit(X_train) 
# 向量化处理
X_train = tv.transform(X_train).toarray()
X_test = tv.transform(X_test).toarray()

"""
TF-IDF返回的结果是概率的形式
如果一个词在当前语句中出现了多次,在其他语句中出现的次数少------重要的词
如果一个词在当前语句中出现了多次,在其他语句中出现的次数也多------重要的词
"""

TD-IDF的计算方法

  1. TF=这个词在该条语句中出现的次数
  2. I D F = l o g 1 + 总 语 句 条 数 1 + 词 在 整 个 数 据 集 中 出 现 的 次 数 + 1 IDF = log\frac{1+总语句条数}{1+词在整个数据集中出现的次数}+1 IDF=log1+1++1
  3. 计算出TF*IDF的值,比如该条语句中有三个在词典中出现的词,他们对应的TF-IDF为a、b、c
  4. 对这三个值进行归一化处理,分母为 a 2 + b 2 + c 2 a^2+b^2+c^2 a2+b2+c2再开方,分子是a、b、c,得出的三个值即为最终结果

**增量学习

增量学习:不断增加数据进行学习,分批加入训练样本进行训练,大多数情况下是数据量太大,需要分批训练时使用
只有朴素贝叶斯可以进行增量学习

import joblib
from sklearn.naive_bayes import GaussianNB  # 例如使用高斯朴素贝叶斯
# ----------拆分数据集----------------
# ----------划分出若干组数据-----------
X_train1, y_train1
X_train2, y_train2

# ---------使用算法-------------------
# 实例化
alg = GaussianNB()
# 这里就使用部分拟合,第一次使用部分拟合需要加classes
alg.partial_fit(X_train1, y_train1, classes=[0, 1])
# 参数:X_train, y_train, classes:标签去重后的值

# -----------保存模型-----------------
joblib.dump(算法名称, '文件名.model')

# 将第一拟合和保存模型注释掉,再来读取模型进行拟合
alg = joblib.load('文件名.model')
alg.partial_fit(X_train2, y_train2)
print('查看准确率:', alg.score(X_test, y_test))

总结

朴素贝叶斯算法的特点:

  1. 计算速度快【原因:假定特征相互独立】
  2. 少量数据仍然可以进行训练,适用于小数据集
  3. 特征不需要标准化
  4. 可以进行增量学习
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值