朴素贝叶斯算法是采用每个属性归属于哪个类的概率来进行预测。我们采用监督性学习方法,对某个预测性建模的问题采用概率建模。
下面利用“皮马印第安人糖尿病数据集”。该数据集由美国国立糖尿病、消化和肾脏疾病研究所(United States National Institute of Diabetes and Digestive and Kidney Diseases,简称NIDDK)提供。
数据集
可从 https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv 下载,具体方法是打开此链接后,会看到数据展现在网页中,右击save as,保存类型选为“Microsoft Excel Comman Separated Values File“,即CSV格式,文件名按默认为pima-indians-diabetes.data.csv。
数据里包行了768行 X 9列数据。每一行表示一个超过21岁的皮马女性糖尿病患者的信息。
前8列表示属性特征
1.怀孕次数。
2.2小时口服葡萄糖耐量测试中得到的血糖浓度。
3.舒张期血压(mm Hg)。
4.三头肌皮脂厚度(mm)。
5.2小时血清胰岛素(mu U/ml)。
6.身体质量指数(体重kg/(身高in m)^2)。
7.糖尿病家族遗传作用值。
8.年龄。
第9列表示分类结果,这个类指明以测量时间为止,患者是否是在5年之内感染的糖尿病。如果是,则为1,否则为0。
算法的实现过程分为如下几步:
(一)处理数据:从CSV文件中载入数据,然后划分为训练集和测试集。
(二)提取数据特征:提取训练数据集的属性特征,以便我们计算概率并做出预测。
(三)单一预测:使用数据集的特征生成单个预测。
(四)多重预测:基于给定测试数据集和一个已提取特征的训练数据集生成预测。
(五)评估精度:评估对于测试数据集的预测精度作为预测正确率。
(六)合并代码:使用所有代码呈现一个完整的、独立的朴素贝叶斯算法的实现。
import csv
def loadCsv(filename):
lines = csv.reader(open(filename, "r"))
dataset = list(lines)
for i in range(len(dataset)):
dataset[i] = [float(x) for x in dataset[i]] #为何要把每个数都转为浮点数
return dataset
#测试
filename = './data/pima-indians-diabetes.data.csv'
dataset = loadCsv(filename)
print('Loaded data file {0} with {1} rows'.format(filename, len(dataset)))
import random
def splitDataset(dataset, splitRatio):
trainSize = int(len(dataset) * splitRatio)
trainSet = []
copy = list(dataset)
while len(trainSet) < trainSize:
index = random.randrange(len(copy))
trainSet.append(copy.pop(index))
return [trainSet, copy]
#测试
dataset = [[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]