贝叶斯定理:
P(A, B) = P(B, A) A, B都发生的概率
P(A|B) * P(B) = P(B|A) * P(A)
===> P(A|B) = P(B|A) * P(A)/P(B)
运用吸毒者检测:
1. 常规的检测结果的敏感度和可靠度为0.99
2. 公司全体体检
已知吸毒者为0.005
求 检测为阳性真吸毒的概率: P(吸毒|阳性) ?
P(吸毒|阳性) = P(阳性|吸毒)*P(吸毒)/P(阳性)
= 0.99*0.005/(0.995*0.01+0.005*0.99)
= 0.00495/0.0149
= 0.33
朴素贝叶斯(NB):
朴素在于假设每个特征都是相互独立的。
运用场景:
1. 文档的自动分类如邮件,评论.......等
现在我们为评论做分类:
label:
侮辱性 1
非侮辱性 0
1. 怎么来写朴素贝叶斯代码
1. 建立总词向量(python set):
eg: wordlsit = ["a", "b","c", "d"]
2. 根据训练数据建立侮辱性词向量概率:
2.1 pb1 j计算整个训练数据 label == 1 的 比例值(除以整个数据大小)
2.2 numwords 训练数据集中label == 1的总的词条个数
2.3 计算侮辱词向量:
统计的词数值是: p1={"a":10,"b":24, "c":20,"d":0}
计算词向量概率(使用log避免小数过多, 以下不是真正的代码):
p1_data = log(p1/numwords)
最终返回 p1_data, pb1
3. 建立非侮辱性词向量(由于pb0可以由pb1计算出来,所以可以不返回):
返回 p0_data
4 预测:
input 输入词向量(已经处理好了)
input 属于1类的概率: sum(input* p1_data) + log(pb1)
input 属于0类的概率: sum(input* p0_data) + log(1 - pb1)
比较哪个概率大属于哪个类
pyspark中编程:
from pyspark.mllib.classification import NaiveBayes, NaiveBayesModel
from pyspark.mllib.util import MLUtils
sc = SparkContext(appName="NBModel")
data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt")
train, test = data.randomSplit([0.8,0.2])
model = NaiveBayes.train(train, 1.0)
#预测
predictionAndLabel = test.map(lambda p: (model.predict(p.features), p.label))
accuracy = 1.0 * predictionAndLabel.filter(lambda pl: pl[0] == pl[1]).count() / test.count()
#保存模型
model.save(sc, "nb/model_data")
#导入模型并预测
smodel = NaiveBayesModel.load(sc, "nb/model_data")
predictionAndLabel = test.map(lambda p: (model.predict(p.features), p.label))
accuracy = 1.0 * predictionAndLabel.filter(lambda pl: pl[0] == pl[1]).count() / test.count()
在sklearn中naive_bayes 有4种:
from sklearn.naive_bayes import BernoulliNB
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.naive_bayes import ComplementNB
MultinomialNB 运用:
from sklearn.naive_bayes import MultinomialNB
import numpy as np
X = np.random.randint(5, size=(6, 100))
y = np.array([1, 2, 3, 4, 5, 6])
clf = MultinomialNB(alpha=1.0)
clf.fit(X, y)
data = np.random.randint(5, size=(1, 100))
clf.predict(data)
GaussianNB运用:
import numpy as np
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
Y = np.array([1, 1, 1, 2, 2, 2])
from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
clf.fit(X, Y)
print(clf.predict([[-0.8, -1]]))