在分类问题情况下,在所有相关概率都已知的理想情形下,贝叶斯决策考虑如何基于这些概率和误判损失来选择最优的类> > 别标记
寻找一个判定准则 h:X → Y以最小化总体风险
贝叶斯判定准则:为最小化总体风险,只需在每个样本上选择那个能使条件风险R(c|x)最小的类别标记
被称为贝叶斯最优分类器,与之对应的总体风险R(h*)称为贝叶斯风险
1- R(h*)反映了分类起所能达到的最好性能,即通过机器学习所能产生的模型精度的理论上限
若目标是最小化分类错误率,则误判损失λij可写为
1. 贝叶斯决公式


- 在样本较多的时候,满足类条件概率的属性取值会非常多,比如:P(B1, B2, B3 | A) 条件下,B1取值为b1个, B2取值为b2个,B3取值为b3个,最终需要统计的样本为 ( x1 * x2 * x3 )个
- 条件概率属性取值过多, 会导致样本空间会非常大
- 在样本较少的情况下,同时满足多个的条件概率可能为0, 但并不能代表真正的概率值
2. 使用西瓜数据集

3. 朴素贝叶斯
-
基于属性条件独立性假设

-
由于对所有类别来说P(x)相同,因此贝叶斯判定准则有

- 朴素贝叶斯分类器采用了
属性条件独立性假设:每个属性独立地对分类结果发生影响 - 有个别属性相关也可以使用朴素贝叶斯分类器
- 但具有
强相关性的条件,朴素贝叶斯公式不成立 - 朴素贝叶斯,使得概率为0的条件大大减少,使其更接近于真实的值,在经过
拉普拉斯修正,其概率不会为0
3. 拉普拉斯修正
-
若某个属性值在训练集中没有而在测试集中出现,则直接计算会出现问题
-
比如“敲声=清脆”测试例,训练集中没有该样例,因此连乘式计算的概率值为0
-
无论其他属性上明显像好瓜,分类结果都是“好瓜=否”,这显然不合理
-
为了避免
其他属性携带的信息被训练集中未出现的属性值抹去,在估计概率值时通常要进行拉普拉斯修正
令N表示训练集D中可能的类别数,Ni表示第i个属性可能的取值数,则修正

因此:

4. 代码
import pandas as pd
import numpy as np
def gaussian_func(x, miu, rou):
"""
假设概率分布遵循正太分布(高斯分布)
:param x: 变量
:param miu: 高斯分布的均值
:param rou: 高斯分布的方差
:return: 返回x在高斯分步中, 概率的值
"""
return (1 / (np.sqrt(2 * np.pi) * rou)) * np.exp(-((x - miu) ** 2) / (2 * rou ** 2))
pass
# 将数据集根据标记划分为子集
def split_data(data_frame, feature, feature_value):
"""
1. 对每一行数据进行处理,将满足 data.iloc[i, :][feature] == feature 属性值满足的时候
2. 取出这一行, 转化为列表, 并添加到列表中, 形成二维数组
3. 对二维数组进行处理, 将其转化为DataFrame类型
:param data_frame:
:param feature:
:param feature_value:
:return:
"""
sub_list = []
data_len = len(data_frame)
# 对每一行进行处理
for i in range(data_len):
if data_frame.iloc[i, :][feature] == feature_value:
temp_list = (data_frame.iloc[i, :])
sub_list.append(temp_list)
# 形成DateFrame类型数据
sub_data_frame = pd.DataFrame(sub_list, columns=data_frame.columns)
return sub_data_frame
pass
def get_p_laplacian(data_frame):
"""
统计样本离散样本的属性以及 计算 连续属性的 均值方差
1. 取每一列的所有属性值,形成一个 列属性取值列表 字典 格式为{key: [v1, v2, ... ]} 不包括连续值属性, 连续值属性不缺失
2. 计算修正后的先验概率
3. 将属性集按照分类划分为子集
4. 对每一个子集进行处理, 分别计算 不同类中 下的 离散属性值概率, 和连续属性值参数
5. 对 列属性取值列表 在不同属性列下的取值进行遍历,计算修正后的概率 {"是": {"色泽": {"青绿": 0.112233, ... }, "触感": {... }, ...}
# , "否": {
{"色泽": {"青绿": 0.112233, ... }, "触感": {... }, ...}}}
6. 对连续属性值 计算均值和方差, 放到分类后的字典中 为 {"是": {"密度": {"miu": 0.1, "rou": 0.2}}, "否": {... }}
:param data_frame: DataFrame类型数据
:return: 返回离散字典 和 连续字典
"""
# 计算先验概率
priority_probability = {
}
# 数据集的长度
data_len = len(data_frame.iloc[:, 0])
# 分类的列名
class_column = data_frame[data_frame.columns[-1]]
# 统计类的个数
class_len = len(class_column.value_counts().keys())
# 拉普拉斯修正后的先验概率
for key, value in class_column.value_counts().items():
priority_probability[key] = (value + 1) / (data_len + class_len)
# 统计离散属性, 属性列名和离散属性的取值,格式为{key: [v1, v2, ... ]}
column_dict = {
}
for item in list(data_frame.columns)[0: -1]: # 不统计最后类那一列
column_dict[item

本文介绍了贝叶斯决策理论的基础知识,详细解释了朴素贝叶斯分类器的工作原理及其在西瓜数据集上的应用。文章涵盖了从理论到实践的全过程,包括属性条件独立性假设、拉普拉斯修正等内容。






2908

被折叠的 条评论
为什么被折叠?



