




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、关于朴素贝叶斯朴素贝叶斯算法是一个直观的方法,使用每个属性归属于某个类的概率来做预测。你可以使用这种监督性学习方法,对一个预测性建模问题进行概率建模。给定一个类,朴素贝叶斯假设每个属性归属于此类的概率独立于其余所有属性,从而简化了概率的计算。这种强假定产生了一个快速、有效的方法。给定一个属性值,其属于某个类的概率叫做条件概率。对于一个给定的类值,将每个属性的条件概率相乘,便得到一个数据样本属于某个类的概率。我们可以通过计算样本归属于每个类的概率,然后选择具有最高概率的类来做预测。通常,我们使用分类数据来描述朴素贝叶斯,因为这样容易通过比率来描述、计算。一个符合我们目的、比较有用的算法需要支持数
2、值属性,同时假设每一个数值属性服从正态分布(分布在一个钟形曲线上),这又是一个强假设,但是依然能够给出一个健壮的结果。预测糖尿病的发生本文使用的测试问题是“皮马印第安人糖尿病问题”。这个问题包括768个对于皮马印第安患者的医疗观测细节,记录所描述的瞬时测量取自诸如患者的年纪,怀孕和血液检查的次数。所有患者都是21岁以上(含21岁)的女性,所有属性都是数值型,而且属性的单位各不相同。每一个记录归属于一个类,这个类指明以测量时间为止,患者是否是在5年之内感染的糖尿病。如果是,则为1,否则为0。机器学习文献中已经多次研究了这个标准数据集,好的预测精度为70%-76%。下面是pima-indians.
3、data.csv文件中的一个样本,了解一下我们将要使用的数据。注意:下载文件,然后以.csv扩展名保存(如:pima-indians-diabetes.data.csv)。查看文件中所有属性的描述。Python123456,148,72,35,0,33.6,0.627,50,11,85,66,29,0,26.6,0.351,31,08,183,64,0,0,23.3,0.672,32,11,89,66,23,94,28.1,0.167,21,00,137,40,35,168,43.1,2.288,33,1朴素贝叶斯算法教程教程分为如下几步:1.处理数据:从CSV文件中载入数据,然后划分为训练集
4、和测试集。2.提取数据特征:提取训练数据集的属性特征,以便我们计算概率并做出预测。3.单一预测:使用数据集的特征生成单个预测。4.多重预测:基于给定测试数据集和一个已提取特征的训练数据集生成预测。5.评估精度:评估对于测试数据集的预测精度作为预测正确率。6.合并代码:使用所有代码呈现一个完整的、独立的朴素贝叶斯算法的实现。1.处理数据首先加载数据文件。CSV格式的数据没有标题行和任何引号。我们可以使用csv模块中的open函数打开文件,使用reader函数读取行数据。我们也需要将以字符串类型加载进来属性转换为我们可以使用的数字。下面是用来加载匹马印第安人数据集(Pima indians dat
5、aset)的loadCsv()函数。Python1234567import csvdef loadCsv(filename):lines = csv.reader(open(filename, "rb")dataset = list(lines)for i in range(len(dataset):dataseti = float(x) for x in datasetireturn dataset我们可以通过加载皮马印第安人数据集,然后打印出数据样本的个数,以此测试这个函数。Python123filename = 'pima-indians-diabetes.d
6、ata.csv'dataset = loadCsv(filename)print('Loaded data file 0 with 1 rows').format(filename, len(dataset)运行测试,你会看到如下结果:Python1Loaded data file iris.data.csv with 150 rows下一步,我们将数据分为用于朴素贝叶斯预测的训练数据集,以及用来评估模型精度的测试数据集。我们需要将数据集随机分为包含67%的训练集合和包含33%的测试集(这是在此数据集上测试算法的通常比率)。下面是splitDataset()函数,它以给
7、定的划分比例将数据集进行划分。Python123456789import randomdef 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我们可以定义一个具有5个样例的数据集来进行测试,首
8、先它分为训练数据集和测试数据集,然后打印出来,看看每个数据样本最终落在哪个数据集。Python1234dataset = 1, 2, 3, 4, 5splitRatio = 0.67train, test = splitDataset(dataset, splitRatio)print('Split 0 rows into train with 1 and test with 2').format(len(dataset), train, test)运行测试,你会看到如下结果:Python1Split 5 rows into train with 4, 3, 5 and tes
9、t with 1, 2提取数据特征朴素贝叶斯模型包含训练数据集中数据的特征,然后使用这个数据特征来做预测。所收集的训练数据的特征,包含相对于每个类的每个属性的均值和标准差。举例来说,如果如果有2个类和7个数值属性,然后我们需要每一个属性(7)和类(2)的组合的均值和标准差,也就是14个属性特征。在对特定的属性归属于每个类的概率做计算、预测时,将用到这些特征。我们将数据特征的获取划分为以下的子任务:1. 按类别划分数据2. 计算均值3. 计算标准差4. 提取数据集特征5. 按类别提取属性特征按类别划分数据首先将训练数据集中的样本按照类别进行划分,然后计算出每个类的统计数据。我们可以创建一个类别到
10、属于此类别的样本列表的的映射,并将整个数据集中的样本分类到相应的列表。下面的SeparateByClass()函数可以完成这个任务:Python12345678def separateByClass(dataset):separated = for i in range(len(dataset):vector = datasetiif (vector-1 not in separated):separatedvector-1 = separatedvector-1.append(vector)return separated可以看出,函数假设样本中最后一个属性(-1)为类别值,返回一个类别值到
11、数据样本列表的映射。我们可以用一些样本数据测试如下:Python123dataset = 1,20,1, 2,21,0, 3,22,1separated = separateByClass(dataset)print('Separated instances: 0').format(separated)运行测试,你会看到如下结果:Python1Separated instances: 0: 2, 21, 0, 1: 1, 20, 1, 3, 22, 1计算均值我们需要计算在每个类中每个属性的均值。均值是数据的中点或者集中趋势,在计算概率时,我们用它作为高斯分布的中值。我们也需要
12、计算每个类中每个属性的标准差。标准差描述了数据散布的偏差,在计算概率时,我们用它来刻画高斯分布中,每个属性所期望的散布。标准差是方差的平方根。方差是每个属性值与均值的离差平方的平均数。注意我们使用N-1的方法(译者注:参见无偏估计),也就是在在计算方差时,属性值的个数减1。Python12345678import mathdef mean(numbers):return sum(numbers)/float(len(numbers) def stdev(numbers):avg = mean(numbers)variance = sum(pow(x-avg,2) for x in n
13、umbers)/float(len(numbers)-1)return math.sqrt(variance)通过计算从1到5这5个数的均值来测试函数。Python12numbers = 1,2,3,4,5print('Summary of 0: mean=1, stdev=2').format(numbers, mean(numbers), stdev(numbers)运行测试,你会看到如下结果:Python1Summary of 1, 2, 3, 4, 5: mean=3.0, stdev=1.58113883008提取数据集的特征现在我们可以提取数据集特征。对于一个给定的
14、样本列表(对应于某个类),我们可以计算每个属性的均值和标准差。zip函数将数据样本按照属性分组为一个个列表,然后可以对每个属性计算均值和标准差。Python1234def summarize(dataset):summaries = (mean(attribute), stdev(attribute) for attribute in zip(*dataset)del summaries-1return summaries我们可以使用一些测试数据来测试这个summarize()函数,测试数据对于第一个和第二个数据属性的均值和标准差显示出显著的不同。Python123dataset = 1,20
15、,0, 2,21,1, 3,22,0summary = summarize(dataset)print('Attribute summaries: 0').format(summary)运行测试,你会看到如下结果:Python1Attribute summaries: (2.0, 1.0), (21.0, 1.0)按类别提取属性特征合并代码,我们首先将训练数据集按照类别进行划分,然后计算每个属性的摘要。Python123456def summarizeByClass(dataset):separated = separateByClass(dataset)summaries =
16、 for classValue, instances in separated.iteritems():summariesclassValue = summarize(instances)return summaries使用小的测试数据集来测试summarizeByClass()函数。Python123dataset = 1,20,1, 2,21,0, 3,22,1, 4,22,0summary = summarizeByClass(dataset)print('Summary by class value: 0').format(summary)运行测试,你会看到如下结果:P
17、ython123Summary by class value: 0: (3.0, 1.4142135623730951), (21.5, 0.7071067811865476), 1: (2.0, 1.4142135623730951), (21.0, 1.4142135623730951)预测我们现在可以使用从训练数据中得到的摘要来做预测。做预测涉及到对于给定的数据样本,计算其归属于每个类的概率,然后选择具有最大概率的类作为预测结果。我们可以将这部分划分成以下任务:1. 计算高斯概率密度函数2. 计算对应类的概率3. 单一预测4. 评估精度计算高斯概率密度函数给定来自训练数据中已知属性的均值
18、和标准差,我们可以使用高斯函数来评估一个给定的属性值的概率。已知每个属性和类值的属性特征,在给定类值的条件下,可以得到给定属性值的条件概率。关于高斯概率密度函数,可以查看参考文献。总之,我们要把已知的细节融入到高斯函数(属性值,均值,标准差),并得到属性值归属于某个类的似然(译者注:即可能性)。在calculateProbability()函数中,我们首先计算指数部分,然后计算等式的主干。这样可以将其很好地组织成2行。Python1234import mathdef calculateProbability(x, mean, stdev):exponent = math.exp(-(math.
19、pow(x-mean,2)/(2*math.pow(stdev,2)return (1 / (math.sqrt(2*math.pi) * stdev) * exponent使用一些简单的数据测试如下:Python12345x = 71.5mean = 73stdev = 6.2probability = calculateProbability(x, mean, stdev)print('Probability of belonging to this class: 0').format(probability)运行测试,你会看到如下结果:Python1Probability
20、 of belonging to this class: 0.0624896575937计算所属类的概率既然我们可以计算一个属性属于某个类的概率,那么合并一个数据样本中所有属性的概率,最后便得到整个数据样本属于某个类的概率。使用乘法合并概率,在下面的calculClassProbilities()函数中,给定一个数据样本,它所属每个类别的概率,可以通过将其属性概率相乘得到。结果是一个类值到概率的映射。Python123456789def calculateClassProbabilities(summaries, inputVector):probabilities = for classVa
21、lue, classSummaries in summaries.iteritems():probabilitiesclassValue = 1for i in range(len(classSummaries):mean, stdev = classSummariesix = inputVectoriprobabilitiesclassValue *= calculateProbability(x, mean, stdev)return probabilities测试calculateClassProbabilities()函数。Python1234summaries = 0:(1, 0.5
22、), 1:(20, 5.0)inputVector = 1.1, '?'probabilities = calculateClassProbabilities(summaries, inputVector)print('Probabilities for each class: 0').format(probabilities)运行测试,你会看到如下结果:Python1Probabilities for each class: 0: 0.7820853879509118, 1: 6.298736258150442e-05单一预测既然可以计算一个数据样本属于每个类
23、的概率,那么我们可以找到最大的概率值,并返回关联的类。下面的predict()函数可以完成以上任务。Python12345678def predict(summaries, inputVector):probabilities = calculateClassProbabilities(summaries, inputVector)bestLabel, bestProb = None, -1for classValue, probability in probabilities.iteritems():if bestLabel is None or probability > bestP
24、rob:bestProb = probabilitybestLabel = classValuereturn bestLabel测试predict()函数如下:Python1234summaries = 'A':(1, 0.5), 'B':(20, 5.0)inputVector = 1.1, '?'result = predict(summaries, inputVector)print('Prediction: 0').format(result)运行测试,你会得到如下结果:Python1Prediction: A多重预测最后
25、,通过对测试数据集中每个数据样本的预测,我们可以评估模型精度。getPredictions()函数可以实现这个功能,并返回每个测试样本的预测列表。Python123456def getPredictions(summaries, testSet):predictions = for i in range(len(testSet):result = predict(summaries, testSeti)predictions.append(result)return predictions测试getPredictions()函数如下。Python1234summaries = 'A
26、39;:(1, 0.5), 'B':(20, 5.0)testSet = 1.1, '?', 19.1, '?'predictions = getPredictions(summaries, testSet)print('Predictions: 0').format(predictions)运行测试,你会看到如下结果:Python1Predictions: 'A', 'B'计算精度预测值和测试数据集中的类别值进行比较,可以计算得到一个介于0%100%精确率作为分类的精确度。getAccuracy(
27、)函数可以计算出这个精确率。Python123456def getAccuracy(testSet, predictions):correct = 0for x in range(len(testSet):if testSetx-1 = predictionsx:correct += 1return (correct/float(len(testSet) * 100.0我们可以使用如下简单的代码来测试getAccuracy()函数。Python1234testSet = 1,1,1,'a', 2,2,2,'a', 3,3,3,'b'predict
28、ions = 'a', 'a', 'a'accuracy = getAccuracy(testSet, predictions)print('Accuracy: 0').format(accuracy)运行测试,你会得到如下结果:Python1Accuracy: 66.6666666667合并代码最后,我们需要将代码连贯起来。下面是朴素贝叶斯Python版的逐步实现的全部代码。Python123456789101112131415161718192021222324252627282930313233343536373839404
29、142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101# Example of Naive Bayes implemented from Scratch in Pythonimport csvimport randomimport math def loadCsv(filename):lines = csv.reader(open(filename, "rb")dataset
30、 = list(lines)for i in range(len(dataset):dataseti = float(x) for x in datasetireturn dataset 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.
31、pop(index)return trainSet, copy def separateByClass(dataset):separated = for i in range(len(dataset):vector = datasetiif (vector-1 not in separated):separatedvector-1 = separatedvector-1.append(vector)return separated def mean(numbers):return sum(numbers)/float(len(numbers) def stdev(
32、numbers):avg = mean(numbers)variance = sum(pow(x-avg,2) for x in numbers)/float(len(numbers)-1)return math.sqrt(variance) def summarize(dataset):summaries = (mean(attribute), stdev(attribute) for attribute in zip(*dataset)del summaries-1return summaries def summarizeByClass(dataset):separa
33、ted = separateByClass(dataset)summaries = for classValue, instances in separated.iteritems():summariesclassValue = summarize(instances)return summaries def calculateProbability(x, mean, stdev):exponent = math.exp(-(math.pow(x-mean,2)/(2*math.pow(stdev,2)return (1 / (math.sqrt(2*math.pi) * stdev
34、) * exponent def calculateClassProbabilities(summaries, inputVector):probabilities = for classValue, classSummaries in summaries.iteritems():probabilitiesclassValue = 1for i in range(len(classSummaries):mean, stdev = classSummariesix = inputVectoriprobabilitiesclassValue *= calculateProbability(x, mean, stdev)return probabilities def predict(summaries, inputVector):probabilities = calculateClassProbabili
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 歌曲版权合同范本
- 防盗报警合同范本
- 租学校合同范本
- 产品技术合同范本
- 中国工商银行委托贷款委托合同范本
- 弱电智能化系统合同范本
- 满诗深浅色惟歌生民病-《卖炭翁》教学设计
- 个人劳动合同格式
- 第6章 跨学科实践活动5 调查日常生活中金属废弃物的种类及回收利用教学设计-2024-2025学年九年级化学沪教版(全国)(2024)上册
- Unit 3 My School Section A 2a~2f 教学设计 2024-2025学年人教版(2024)七年级英语上册
- 全国大全身份证前六位、区号、邮编-编码
- 种植林业可行性研究报告
- 金和物业公司简介
- 广东省五年一贯制考试英语真题
- 2023年中央广播电视总台校园招聘笔试参考题库附带答案详解
- 项目部岗位廉洁风险情景教育案例
- 小学英语-What a dream教学设计学情分析教材分析课后反思
- 消防栓定期检查记录表
- 员工面试登记表通用模板
- 单位(个人或集体)约谈表
- 水质检测实验室仪器配置
评论
0/150
提交评论