高斯朴素贝叶斯-python sklearn实现

介绍

高斯朴素贝叶斯,假设特征所属于某个类别的值符合高斯分布(正态分布)

有些特征可能是连续型变量,比如:人的身高,物体的长度。
这些特征可以 转换成离散型的值,比如:

  • 身高在160cm以下,特征值为1
  • 身高在160cm和170cm之间,特征值为2
  • 身高在170cm之上,特征值为3

也可以这样转换:

  • 如果身高是160cm以下,这三个特征的值分别是 1、0、0
  • 如果身高在160cm和170cm之间,特征值为 0、1、0
  • 若身高在170cm之上,特征值是 0、0、1

不过这些方式都不够细腻,高斯模型可以解决这个问题

声明

class sklearn.naive_bayes.GaussianNB (priors=None, var_smoothing=1e-09)

参数解释:

  • prior(先验概率):可输入任何类数组结构,形状为(n_classes,)
    表示类的先验概率。如果指定,则不根据数据调整先验,如果不指定,则自行根据数据计算先验概率。

  • var_smoothing:浮点数,可不填(默认值= 1e-9)
    在估计方差时,为了追求估计的稳定性,将所有特征的方差中最大的方差以某个比例添加到估计的方差中。这个比例,由var_smoothing参数控制。

例子

下面是一组人类身体特征的统计资料

性别 身高(英尺) 体重(磅) 脚掌(英寸)
6 180 12
5.92 190 11
5.58 170 12
5.92 165 10
5 100 6
5.5 150 8
5.42 130 7
5.75 150 9

问:已知某人身高6英尺、体重130磅,脚掌8英寸,请问该人是男是女?

分析

计算朴素贝叶斯的分子,如下:

P(身高|性别) x P(体重|性别) x P(脚掌|性别) x P(性别)

这里的困难在于,由于身高、体重、脚掌都是连续变量,不能采用离散变量的方法计算概率。而且由于样本太少,所以也无法分成区间计算。怎么办?

这时,可以假设男性和女性的身高、体重、脚掌都是正态分布,通过样本计算出均值和方差,也就是得到正态分布的密度函数。有了密度函数,就可以把值代入,算出某一点的密度函数的值

代码

import numpy as np
#导入朴素贝叶斯
from sklearn.naive_bayes import GaussianNB

'''
训练数据
第一列表示颜值,1表示帅,0表示不帅
第二列表示性格,1表示好,0表示不好
第三列表示身高,1表示高,0表示矮
第四列表示是否上进,1表示上进,0表示不上进
'''
x=np.array([[6,180,12],
            [5.92,190,11],
            [5.58,170,12],
            [5.92,165,10],
            [5,100,6],
            [5.5,150,8],
            [5.42,130,7],
            [5.75,150,9]
          ])
# 训练数据的标签,0表示女,1表示男
y=np.array([1,1,1,1,0,0,0,0])
nb=GaussianNB()
nb.fit(x,y)


# 预测
prd_x=np.array([
            [6,130,8],
        ])
pre=nb.predict(prd_x)
pre2=nb.predict_proba(prd_x)
# 输出模型预测结果
print("预测结果为:",pre)
#输出模型预测的分类概率
print("预测的概率为:",pre2)

执行结果:

预测结果为: [0] # 0表示女
预测的概率为: [[9.99999846e-01 1.54426632e-07]] #女性概率99.99%

参考:
https://blog.csdn.net/ac540101928/article/details/103941495
https://blog.csdn.net/qq_38163244/article/details/109154089


原文出处:https://malaoshi.top/show_1IX4lAuXKRdT.html