实现带有拉普拉斯修正的朴素贝叶斯_机器学习入门—朴素?叶斯

一、朴素⻉叶斯定义

适合简单的文本分析、病例分类、新闻分类等

贝叶斯定理(极大似然估计):

其中,X和Y分别是两个非独立事件,P(X)表示X事件发生的概率,P(Y)表示Y事件发生的概率,P(X|Y)表示在Y事件发生的情况下,X事件发生的概率,同理,P(Y|X)表示在X事件发生的情况下,Y事件发生的概率。

案例:

f9d741f19b74a95ac4ddce9f326edd06.png

8fb29dd75db7fc903ef504bd18cd1edc.png

aaee72b42b9e1e89f2322719a424a541.png

二、朴素贝叶斯实现过程中需要注意的事项

1、拉普拉斯修正(避免因某个单词没有出现,导致整个概率计算为0)

在计算某个单词出现的概率时,例如P("购买"|正常) ,如果"购买"一次没有出现,该概率为0 ,从而会导致P("购买"|正常) *P("物品"|正常) *P("不是"|正常) * P("广告"|正常) 计算为0,为避免这种情况,采用平滑法修正概率的计算,例如:

其中,v为建立的词库中总的单词数量(可以保证最终某一类邮件中各个单词出现的概率和为1 )。

2、如果需要分类的新样本中出现了未在训练样本中出现的单词,在计算概率时将其忽略而非给一个概率0 。

3、避免多个较小的概率值连乘导致最终的概率值趋于0值的情况,对连乘的概率取对数处理,转化为多个取对数概率值相加。

P("购买"|正常) *P("物品"|正常) *P("不是"|正常) * P("广告"|正常)转化为:

log(P("购买"|正常) *P("物品"|正常) *P("不是"|正常) * P("广告"|正常)) =

log(P("购买"|正常))+log(P("物品"|正常))+log(P("不是"|正常))+log(P("广告"|正常))

4、将文本转化为数值

三、分析过程

案例:使用scikit-learn包的朴素贝叶斯模型识别垃圾邮件(python 3)

1、建立已知邮件内容中出现的单词词库;

2、计算词库中每个单词分别在正常邮件和垃圾邮件中出现的概率,例如P("购买"|正常),为正常邮件中"购买"一次出现的次数占总单词数量的比例;

3、分别计算正常邮件和垃圾邮件出现的概率;

4、已知新邮件的邮件内容,计算新邮件为正常邮件和垃圾邮件的概率,即P(正常|邮件内容) 和 P(垃圾|邮件内容) ,比较两者的大小,作为新邮件的分类判断(P(邮件内容)的概率比较难计算,只对比分子即可)。

import pandas as pd
df = pd.read_csv("C:/chris/data/spam.csv", encoding='latin')
df.rename(columns={'v1':'Label', 'v2':'Text'}, inplace=True)
df['numLabel'] = df['Label'].map({'ham':0, 'spam':1})

# 导入英文的停用词库
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer
stopset = set(stopwords.words("english"))

# 构建文本的向量 (基于词频的表示)
#vectorizer = CountVectorizer(stop_words=stopset,binary=True)
vectorizer = CountVectorizer()

# sparse matrix 
X = vectorizer.fit_transform(df.Text)
y = df.numLabel

# 把数据分成训练数据和测试数据
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=50)
print ("训练数据中的样本个数: ", X_train.shape[0], "测试数据中的样本个数: ", X_test.shape[0])

# 利用朴素贝叶斯做训练
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score

clf = MultinomialNB(alpha=1.0, fit_prior=True)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print("accuracy on test data: ", accuracy_score(y_test, y_pred))

# accuracy on test data:  0.97847533632287

# 打印混淆矩阵(alpha 和 beta 错误)三分类以上很有用。可以看看什么分类被混淆,用于debug
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_pred, labels=[0, 1])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值