关于朴素贝叶斯算法
在本教程中,您将学习Naive Bayes算法,包括它的工作原理以及如何在Python中从头开始实现它。
朴素贝叶斯算法是一种直观的方法,它使用属于每个类的每个属性的概率来进行预测。 如果您想要概率性地建模预测建模问题,那么您将提出监督学习方法。
朴素贝叶斯通过假设属于给定类值的每个属性的概率独立于所有其他属性来简化概率的计算。 这是一个强有力的假设,但会产生一种快速有效的方法。(朴素贝叶斯法对条件概率分布作了条件独立性的假设。由于这是一个较强的假设,朴素贝叶斯法也由此得名)
给定属性值的类值的概率称为条件概率。 通过将条件概率乘以给定类值的每个属性,我们得到属于该类的数据实例的概率。
为了进行预测,我们可以计算属于每个类的实例的概率,并选择具有最高概率的类值。
朴素贝叶斯通常使用分类数据来描述,因为它易于使用比率进行描述和计算。 用于我们目的的更有用的算法版本支持数字属性并假设每个数字属性的值是正态分布的(落在钟形曲线上的某处)。 同样,这是一个强有力的假设,但仍然提供了可靠的结果。
预测糖尿病的发病
这个问题包括对Pima印第安人专利的医疗细节的768次观察。 记录描述了从患者身上获取的瞬时测量值,例如他们的年龄,怀孕次数和血液检查次数。 所有患者均为21岁或以上的女性。 所有属性都是数字,其单位因属性而异。
每个记录具有类别值,该类别值指示患者在进行测量(1)或不进行测量(0)的5年内是否患有糖尿病。
这是一个标准的数据集,已在机器学习文献中进行了大量研究。 良好的预测准确率为70%-76%。
朴素贝叶斯算法教程
本教程分为以下几个步骤:
处理数据:从CSV文件加载数据并将其拆分为训练和测试数据集。
汇总数据:总结训练数据集中的属性,以便我们可以计算概率并进行预测。
进行预测:使用数据集的摘要生成单个预测。
制作预测:根据测试数据集和汇总的训练数据集生成预测。
评估准确度:评估为测试数据集做出的预测的准确性,作为所有预测中的正确百分比。将它绑定在一起:使用所有代码元素来呈现Naive Bayes算法的完整且独立的实现。
1.处理数据
import pandas as pd
from sklearn.model_selection import train_test_split
import numpy as np
import math
from collections import Counter
import matplotlib.pyplot as plt
%matplotlib inline
def loadCsv(url):
data = pd.read_csv(url, sep=',')
data.columns = ['one', 'two', 'three', 'four', 'five','six','seven','eight','target']
data = np.array(data.iloc[:700, :])
return data,data[:,:-1],data[:,-1]
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv'
data,X,y = loadCsv(url)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=3, stratify=y)
GaussianNB 高斯朴素贝叶斯
特征的可能性被假设为高斯
概率密度函数:
数学期望(mean):,方差:
在给定从训练数据估计的属性的已知平均值和标准偏差的情况下,我们可以使用高斯函数来估计给定属性值的概率。
假定为每个属性和类值准备的属性汇总,结果是给定类值的给定属性值的条件概率。
有关高斯概率密度函数的详细信息,请参阅参考资料。 总之,我们将已知细节插入高斯(属性值,平均值和标准偏差)并读取属性值属于类的可能性。
在calculateProbability()函数中,我们首先计算指数,然后计算主要的除法。 这让我们可以在两条线上很好地拟合方程。
class NaiveBayes:
def __init__(self):
self.model = None
#数学期望(均值是数据的中心中心或中心趋势,我们将在计算概率时将其用作高斯分布的中间。)
@staticmethod
def mean(X):
return sum(X) / float(len(X))
# 标准差( 标准偏差描述了数据传播的变化,我们将用它来表征计算概率时高斯分布中每个属性的预期传播。)
def stdev(self,X):
avg = self.mean(X)
return math.sqrt(sum([pow(x-avg,2) for x in X]) / float(len(X)))
# 概率密度函数
def gaussian_probality(self,x,mean,stdev):
exponent = math.exp(-(math.pow(x-mean,2)/(2*math.pow(stdev,2))))
return (1 / (math.sqrt(2*math.pi) * stdev)) * exponent
# zip函数将数据实例中每个属性的值分组到它们自己的列表中,以便我们可以计算属性的均值和标准差值。
def summarize(self,train_data):
summaries = [(self.mean(i), self.stdev(i)) for i in zip(*train_data)]
return summaries
# 分类别求出数学期望和标准差
def fit(self, X, y):
labels = list(set(y))
data = {label:[] for label in labels}
for f, label in zip(X, y):
data[label].append(f)
self.model = {label: self.summarize(value) for label, value in data.items()}
return 'gaussianNB train done!'
# 现在我们可以计算出属于某个类的属性的概率,我们可以组合数据实例的所有属性值的概率,并得出整个数据实例属于该类的概率。
def calculate_probalities(self,input_data):
probalities = {}
for label, value in self.model.items():
probalities[label] = 1
for i in range(len(value)):
mean,stdev = value[i]
probalities[label] *= self.gaussian_probality(input_data[i], mean, stdev)
return probalities
# 可以计算属于每个类值的数据实例的概率,我们可以查找最大概率并返回关联类。
def predict(self, X_test):
label = sorted(self.calculate_probalities(X_test).items(), key=lambda x: x[-1])[-1][0]
return label
#可以将预测与测试数据集中的类值进行比较,并且可以将分类精度计算为0和100%之间的准确度。 getAccuracy()将计算此准确率。
def score(self, X_test, y_test):
right = 0
for X, y in zip(X_test, y_test):
label = self.predict(X)
if label == y:
right += 1
return right / float(len(X_test))
model = NaiveBayes()
model.fit(X_train, y_train)
'gaussianNB train done!'
print(model.predict([4.4, 3.2, 1.3, 0.2,0.6,5.7,4.7,6,5]))
1.0
model.score(X_test, y_test)
0.7285714285714285