logo资料库

朴素贝叶斯分类器(wine红酒数据集).pdf

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
作业说明
解题思路
数据预处理
理论准备
训练集和验证集划分
求取分类准确率
ROC曲线绘制
朴素贝叶斯分类器 2019 年 4 月 28 日 目录 1 作业说明 2 解题思路 2.1 数据预处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 理论准备 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 训练集和验证集划分 . . . . . . . . . . . . . . . . . . . . . . . 2.4 求取分类准确率 . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5 ROC 曲线绘制 . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 2 4 5 6 1
1 作业说明 给定 wine 数据集,包含 178 个样本,分为三个类别,第一类 59 个样 本,第二类 71 个样本,第三类 48 个样本,每个样本包含 13 个属性(酒的 成分)和样本类别的标识(数字表示)。要求分别使用朴素贝叶斯方法学习 样本,构建模型,并最终实现对新样本类别进行识别。 已知样本数据 Xn = (x1 别 y = cn; n = f1; 2; 3g 我们的模型为: n; x2 n; : : : ; x13 n), n = 1; : : : ; 178 和样本所输类 y = f (Xn) (1) 我们的目标就是找到合适的 y, 让模型不仅和已知训练集样本适配,完 整的体现训练集样本的特征,还能在实践中很好地预测测试集样本特征,也 就是所谓的分类问题(监督学习)。已知样本的各维特征均属于连续型数据, 所以在实际中我们可以用正态分布类型对单维度数据进行模拟。 2 解题思路 2.1 数据预处理 通过观察得知,所有数据量纲虽有不一致的情况,但是使用正态分布 进行模拟的时候会屏蔽掉量纲的问题,所以此处就不进行数据归一化处理。 2.2 理论准备 贝叶斯分类方法是统计学中的一种经典分类方法,其分类原理就是利 用贝叶斯公式根据某对象的先验概率计算出其后验概率,然后选择具有最 大后验概率的类作为该对象所属的类别。之所以称之为“朴素”,是因为贝 叶斯分类只做最原始、最简单的假设(所有特征之间是统计独立的)。 首先,先看贝叶斯定理,P (AjB) 称之为后验,P (BjA) 称之为先验,可 以从已知类别中提取,是人们对这一类别所掌握的知识,P (A) 称之为似然 值,P (B) 称之为证据:
P (AjB) = P (BjA)P (A) P (B) 在本题中,可以具体化为: P (Y = ckjX = x) = ∑ P (X = xjY = ck) P (Y = ck) k P (X = xjY = ck) P (Y = ck) (2) (3) 因为朴素贝叶斯法对条件概率分布做了条件独立性假设,所以我们的 似然值可以做进一步的转化: P (X = xjY = ck) = P (X1 = x1; ; X13 = x13jY = ck) = 13∏ j=1 P (Xj = xjjY = ck) (4) 将公式4代入公式3可得出: P (Y = ckjX = x) = ∑ P (Y = ck) k P (Y = ck) ∏ ∏ j P (Xj = xjjY = ck) j P (Xj = xjjY = ck) ; k = 1; 2; 3 (5) 于是我们的目标就变为在所有的类别中最大化函数值: y = f (x) = arg max ck P (Y = ck) k P (Y = ck) ∑ ∏ ∏ j P (Xj = xjjY = ck) j P (Xj = xjjY = ck) (6) 因为在三个类别中,同一样本计算过程中上述公式6的分母相同,所以 在比较过程之中不需要进行该项的计算,最终我们只需要最大化如下计算 式即可: y = arg max ck P (Y = ck) ∏ j P (Xj = xjjY = ck) (7) 另一个问题就是如何计算类别下某属性的条件概率值呢? 当特征属性是离散值时,可以很方便地在特征样本中进行直接统计数 值,最终得出结果。不过需要注意的是当某特征出现次数为 0 是应该如何 处理,我们比较典型的方法就是取次数为 1,以防使最终的概率值为 0,这 种校正方法在实际中经常用到。
当特征属性是非离散值时,我们最好的方法就是使用现有模型去拟合 数据,并使用样本值在拟合模型之中求取条件概率数值,最常见的方法就 是假定其数值服从高斯分布,似然概率值计算方法如下( 代表样本标准差 代表样本均值): 1p 2 (x)2 22 e g(x; ; ) = P (xkjci) = g (xk; ci; ci) (8) (9) 2.3 训练集和验证集划分 分层随机抽样,每类样本中随机划分三分之一的样本为测试集,其他 为训练集。划分代码如下: for i in set(train_result_lists): # 遍 历 三 种 类 别 count_of_one = train_result_lists.count(i) # 某 种 类 型 对 应 的 频 # 随 机 数 , 采 取 前 十 个 样 本 作 为 测 试 机 样 本 shuffled_num = list(range(0, count_of_one)) 合 的 划 分 顺 序 数 # 确 定 交 叉 验 证 集 random.shuffle(shuffled_num) shuffled_num = shuffled_num[0:int((1/3)*count_of_one)] shuffled_num.sort(reverse=True) # 直 接 获 取 测 试 集 样 本 # print([train_matrix_lists.pop(temp_count + num) for num in # 逆 序 排 列 shuffled_num]) test_matrix_lists.extend([train_matrix_lists.pop(temp_count + num) for num in shuffled_num]) test_result_lists.extend([train_result_lists.pop(temp_count + num) for num in shuffled_num]) # print([shuffled_num[num] + temp_count for num in range(0, 10 temp_count += count_of_one - int((1/3)*count_of_one) )])
2.4 求取分类准确率 准确率的求取方式,我使用的是十次循环迭代,求取平均值,为保证随 机性,每一次训练集和测试集的划分都保证其随机性,并在最终的过程之 中得到体现,另外为了防止迭代下溢,我使用自然对数函数将乘法转化为 了加法进行相似度比较,以下展示用样本到类型样本集合中计算相似的所 使用的函数: def get_mean(attributes): # 获 取 均 值 向 量 return np.mean(attributes , axis=0) def get_std(attributes): # 获 取 方 差 向 量 average = get_mean(attributes) variance = np.sum((attributes - average)**2, axis=0)/float(len (attributes)) return np.sqrt(variance) def get_prior(x_list): prior_list = [] for num in set(x_list): prior_list.append(list(x_list).count(num)/len(x_list)) return prior_list def get_Likelihood(x, mean , std): # 获 取 似 然 概 率 密 度 exponent = np.exp(-(x-mean)**2/(2*std**2)) return (1/(np.sqrt(2*math.pi)*std))*exponent def get_jointLikelihood(x_list , mean_list , std_list): # 运 用 拉 likelihood = 0 for x in range(0, len(x_list)): 普 拉 斯 方 法 likelihood += math.log(get_Likelihood(x_list[x], mean_list[x ], std_list[x])) return likelihood def get_hypothesis(prior_list , x_list , mean_lists , std_lists): grade_list = [] for k in range(0, 3):
grade_list.append(math.log(prior_list[k]) + get_jointLikelihood(x_list , mean_lists[k], std_lists[k])) return grade_list.index(max(grade_list))+1 分类准确率为:0.9810344827586207 然后使用最后一次迭代的参数计算混淆矩阵等相关数值: 类型 类型一 类型 2 类型三 类型一 18 类型二 0 类型三 0 1 22 0 0 1 16 表 1: 混淆矩阵 运算数值: 类型 正确率 类型一 1.0 类型二 0.9565217391304348 类型三 0.9411764705882353 召回率 0.9473684210526315 0.9565217391304348 1.0 F 值(调和平均值) 0.972972972972973 0.9565217391304348 0.9696969696969697 表 2: 计算数值 2.5 ROC 曲线绘制 ROC 曲线指受试者工作特征曲线 / 接收器操作特性曲线, 是反映敏感 性和特异性连续变量的综合指标, 是用构图法揭示敏感性和特异性的相互 关系,它通过将连续变量设定出多个不同的临界值,从而计算出一系列敏感 性和特异性,再以敏感性为纵坐标、(1-特异性)为横坐标绘制成曲线,曲 线下面积越大,诊断准确性越高。在 ROC 曲线上,最靠近坐标图左上方的 点为敏感性和特异性均较高的临界值。 本题目中比较难选择的是阈值,因为相似度在度量过程之中量级相差 超过 50,进行非线性变换后,依然相差较大,所以我在此题中绘制的思路
就是,使用所有的相似度来作为阈值,进行曲线的绘制,最终结果如下,参 数值变化较大,因为第二个样本较多,所以选用第二个样本的最优参数值 作为参考值,结论如下。 图 1: ROC 曲线 最优参数值:0.2489098039076317。该值随样本变化幅度较大。
分享到:
收藏