python机器学习---监督学习---朴素贝叶斯(用于分类)

本文深入探讨了朴素贝叶斯算法的基本原理,包括思想基础、简单应用案例和不同方法。通过贝叶斯定理,解释了如何在特征独立的情况下进行分类,并介绍了在二项分布、正态分布和多项分布数据上的适用算法。同时,文章还简要提到了朴素贝叶斯算法的实战应用及优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、朴素贝叶斯算法基本原理

1.1 思想基础

1.2 简单应用案例

1.3 朴素贝叶斯的不同方法

2、朴素贝叶斯算法实战

3、朴素贝叶斯算法优缺点


备注:本文主要来自于对《深入浅出python机器学习》书籍的学习总结笔记,感兴趣的同学可以购买本书学习,学习的本质就是形成自己的逻辑。

1、朴素贝叶斯算法基本原理

1.1 思想基础

对于给出的待分类项x={a1,a2....an},有类别集合y={y1,y2...yn},通过训练数据样本求解当x出现的情况下给类别出现的概率,即P(y1|x),P(y2|x)...P(yn|x),哪个概率最大就认为分类项x数据哪个类别。如发现P(y2|x)最大,就认为x的类别是y2。

如果各个特征a1...an独立,则根据贝叶斯定理,,即P(y1|x)=P(x|y1)*P(y1)/P(x)

由于分母都是P(x),只看分子即可,当各特征独立时有

1.2 简单应用案例

我们通过一个简单的案例来理解朴素贝叶斯算法,我们已知下面信息,0代表不发生,1代表发生:

##1-数据准备
#导入训练数据
import numpy as np
#将x,y赋值为np数组
x = np.array([[0, 1, 0, 1], 
              [1, 1, 1, 0], 
              [0, 1, 1, 0], 
              [0, 0, 0, 1], 
              [0, 1, 1, 0], 
              [0, 1, 0, 1], 
              [1, 0, 0, 1]])
y = np.array( [0, 1, 1, 0, 1, 0, 0])
#对不同分类y统计每个特征的数量
counts = {}
for label in np.unique(y):
    counts[label] = x[y == label].sum(axis=0)
print("feature counts:\n{}".format(counts))

输出结果说明

##2-模型训练---.fit()
#导入贝努利贝叶斯模型
from sklearn.naive_bayes import BernoulliNB
#使用模型拟合训练集数据
clf = BernoulliNB()
clf.fit(x, y)

##3-模型预测---.predict()
#要进行预测的这一天,没有刮北风,也不闷热,但是多云,天气预报没有说有雨
Next_Day = [[0, 0, 1, 0]]
pre = clf.predict(Next_Day)
if pre == [1]:
    print("要下雨啦,快收衣服啊!")
else:
    print("放心,又是一个艳阳天")

##4-打印预测概率---.predict_proba()
clf.predict_proba(Next_Day)

1.3 朴素贝叶斯的不同方法

数据的分布不同,适合用不同的朴素贝叶斯算法:

1)如果数据集符合二项分布,适合用贝努利贝叶斯,需要导入from sklearn.datasets import make_blobs

2)如果数据符合正态分布,则高斯贝叶斯算法的得分更高,需要导入from sklearn.naive_bayes import GaussianNB

3)如果数据符合多项式分布(抛硬币是二项分布,只有0和1;而掷骰子是多项分布,有0-6),且是非负、离散的数据集,则需要用多项式贝叶斯算法,需要导入from sklearn.naive_bayes import MultinomialNB

2、朴素贝叶斯算法实战

##1-数据准备
#导入sklearn.datasets自带乳腺肿瘤数据
from sklearn.datasets import load_breast_cancer
#导入的肿瘤数据集是一种Bunch对象,它包括键keys和数值values,它有点类似字典,可用类似字段的方法查看信息
#获取字典的信息-获取字典的键dict.keys(),获取字典的值-dict.values(),获取字典的键值-dict.items(),获取特定键的值dict['键名']
cancer = load_breast_cancer()
#获取字典的键dict.keys()
print(cancer.keys())    #肿瘤数据集跟之前的酒数据集一样,包含数据,目标分类、分类名,详细信息,数据的特征名,文件位置
print('\n')
#获取特定键的值dict['键名']
print('data的分类:',cancer['target_names'])
print('\n')
print('data的特征:',cancer['feature_names'])

##2-数据建模---模型训练/测试/应用
#2.1将数据拆分为训练集和测试集---要用train_test_split模块中的train_test_split()函数,随机将75%数据化道训练集,25%数据到测试集
#导入数据集拆分工具
from sklearn.model_selection import train_test_split
#将数据集的数值和分类目标赋值给x,y
x,y=cancer['data'],cancer['target']
#拆分数据集---x,y都要拆分,rain_test_split(x,y,random_state=0),random_state=0使得每次生成的伪随机数不同
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=0)
#查看拆分后的数据集大小情况
print('x_train_shape:{}'.format(x_train.shape))
print('x_test_shape:{}'.format(x_test.shape))
print('y_train_shape:{}'.format(y_train.shape))
print('y_test_shape:{}'.format(y_test.shape))

#2、数据建模---模型训练/测试/应用
#2.2 模型训练---算法.fit(x_train,y_train)
#导入算法包---数据集是对肿瘤患者恶性和良性判断,按我们直觉当然不属于二项分布和多项式分布,故选择高斯分布
from sklearn.naive_bayes import GaussianNB
#使用算法
gnb = GaussianNB()
#算法.fit(x,y)对训练数据进行拟合
gnb.fit(x_train, y_train)

#2、数据建模---模型训练/测试/应用
#2.3 模型测试---算法.score(x_test,y_test)
score_test=gnb.score(x_test,y_test)
score_train=gnb.score(x_train,y_train)
print('test_score:{:.2%}'.format(score_test))
print('train_score:{:.2%}'.format(score_train))

#2、数据建模---模型训练/测试/应用
#2.4 模型应用---算法.predict(x_new)
#导入要预测数据--可以输入新的数据点,也可以随便取原数据集中某一数据点,但是注意要与原数据结构相同
x_new=[x[312]]     #x[312]表示取第312行数据,外面再加[]表示把这个数据整成列表赋值给x_new
prediction=gnb.predict(x_new)
print('预测数据:{}'.format(x_new))
print('预测结果:{}'.format(prediction))
print('预测结果正确分类:{}'.format([y[312]]))

3、朴素贝叶斯算法优缺点

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值