赞
踩
另一个例子,现分别有 A、B 两个容器,在容器 A 里分别有 7 个红球和 3 个白球,在容器 B 里有 1 个红球和 9 个白球,现已知从这两个容器里任意抽出了一个球,且是红球,问这个红球是来自容器 A 的概率是多少?
假设已经抽出红球为事件 B,选中容器 A 为事件 A,则有:P(B) = 8/20,P(A) = 1/2,P(B|A) = 7/10,按照公式,则有:P(A|B) = (7/10)*(1/2) / (8/20) = 0.875
朴素贝叶斯算法是一个典型的统计学习方法,主要理论基础就是一个贝叶斯公式,贝叶斯公式的基本定义如下:
这个公式虽然看上去简单,但它却能总结历史,预知未来:
优点:
缺点:
导包,导入数据
from sklearn.naive_bayes import GaussianNB, MultinomialNB, BernoulliNB
from sklearn.datasets import load_iris
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
iris = load_iris()
data = iris.data[:,0:2]
target = iris.target
ga_NB = GaussianNB()
ga_NB.fit(data, target)
ga_NB.score(data, target)
out[]:0.78
高斯分布就是正态分布
【用途】用于一般分类问题
使用自带的鸢尾花数据
xmin, xmax = data[:,0].min(),data[:,0].max()
ymin, ymax = data[:,1].min(), data[:,1].max()
x, y = np.linspace(xmin, xmax, 1000), np.linspace(ymin, ymax, 1000)
X,Y = np.meshgrid(x,y)
X_test = np.c_[X.ravel(), Y.ravel()]
# 预测
y_ = ga_NB.predict(X_test)
# 画出分类决策线
plt.pcolormesh(X, Y, y_.reshape(1000,1000))
# 画出原始点
plt.scatter(data[:,0], data[:,1],c=target, cmap='rainbow')
多项式分布:
【用途】适用于文本数据(特征表示的是次数,例如某个词语的出现次数)
mu_NB = MultinomialNB()
mu_NB.fit(data, target)
mu_NB.score(data, target)
out:0.6666666666666666
# 预测
y_ = mu_NB.predict(X_test)
# 画出分类决策线
plt.pcolormesh(X, Y, y_.reshape(1000,1000))
# 画出原始点
plt.scatter(data[:,0], data[:,1],c=target, cmap='rainbow')
伯努利分布:
【用途】适用于伯努利分布,也适用于文本数据(此时特征表示的是是否出现,例如某个词语的出现为1,不出现为0)
绝大多数情况下表现不如多项式分布,但有的时候伯努利分布表现得要比多项式分布要好,尤其是对于小数量级的文本数据
be_NB = BernoulliNB()
be_NB.fit(data, target)
be_NB.score(data, target)
out:0.3333333333333333
# 预测
y_ = be_NB.predict(X_test)
# 画出分类决策线
plt.pcolormesh(X, Y, y_.reshape(1000,1000))
# 画出原始点
plt.scatter(data[:,0], data[:,1],c=target, cmap='rainbow')
sms = pd.read_csv('../../data/SMSSpamCollection', header=None, sep='\t')
sms
data = sms[1].values
target = sms[0].values
data.shape
out:(5572,)
由于读取出来的data是字符串数据
导入sklearn.feature_extraction.text.TfidfVectorizer用于转换字符串
读取短信数据
from sklearn.feature_extraction.text import TfidfVectorizer
# 只转化data会变成sparse.csr.csr_matrix
# fit_transform
tf = TfidfVectorizer()
# 训练和转换一起做
data = tf.fit_transform(data).toarray()
ga_NB = GaussianNB()
ga_NB.fit(data, target)
ga_NB.score(data, target)
out:0.9414931801866475
# 自己生成预测数据
messages = [
"how are you.I'm fine thank you and you?",
"nice to meet you ,nice to meet you too.",
"fuck off",
"congratulation, you've won a prize, please call 0086131111111 to get the reward.",
"Big Surprise, goods are 50% off.",
"Mark six number is 34, have you won, if want to win ,please follow us",
"HanMeiMei ,I'm Lilei, I love you.would be my grilfriend.",
"OK, let's have a dinner together."
]
# 高斯分布预测
y_ = ga_NB.predict(X_test)
y_
out:array(['ham', 'ham', 'ham', 'spam', 'ham', 'ham', 'spam', 'ham'],
dtype='<U4')
# 多项式
mu_NB = MultinomialNB()
mu_NB.fit(data, target)
mu_NB.score(data, target)
out:0.9761306532663316
mu_NB.predict(X_test)
out:array(['ham', 'ham', 'ham', 'ham', 'ham', 'ham', 'ham', 'ham'],
dtype='<U4')
# 伯努利
be_NB = BernoulliNB()
be_NB.fit(data, target)
be_NB.score(data, target)
out:0.9881550610193827
be_NB.predict(X_test)
out:array(['ham', 'ham', 'ham', 'ham', 'ham', 'ham', 'ham', 'ham'],
dtype='<U4')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。