【机器学习⼊门】(3)朴素贝叶斯算法:多项式、⾼斯、伯努利,实例应⽤(⼼脏病预测)附pyt。。。
各位同学好,今天我和⼤家分享⼀下朴素贝叶斯算法中的三⼤模型。在上⼀篇⽂章中,我介绍了朴素贝叶斯算法的原理,并利⽤多项式模型进⾏了⽂本分类预测。
下⾯,我将对朴素贝叶斯算法进⾏补充,并通过案例⼼脏病预测向各位进⼀步说明。案例简介:有300多个⼼脏病样本数据,每个样本有13个特征(如:胆固醇、⼼跳率等),1个⽬标(即是否得了⼼脏病)。使⽤朴素贝叶斯⾼斯⽅法,建⽴⼼脏病预测模型。
1. 朴素贝叶斯模型
对于不同的数据,我们有不同的朴素贝叶斯模型进⾏分类。
1.1 多项式模型
(1)如果特征是离散型数据,⽐如⽂本这些,推荐使⽤多项式模型来实现。该模型常⽤于⽂本分类,特别是单词,统计单词出现的次数。调⽤⽅法:from sklearn.naive_bayes import MultinomialNB
1.2 ⾼斯模型
(2)如果特征是连续型数据,⽐如具体的数字,推荐使⽤⾼斯模型来实现,⾼斯模型即正态分布。当特征是连续变量的时候,运⽤多项式模型就会导致很多误差,此时即使做平滑,所得到的条件概率也难以描述真实情况。所以处理连续的特征变量,应该采⽤⾼斯模型。
调⽤⽅法:from sklearn.naive_bayes import GaussianNB
1.3 伯努利模型
(3)如果特征是离散性数据并且值只有0和1两种情况,推荐使⽤伯努利模型。在伯努利模型中,每个特征的取值是布尔型的,即True和False,或者1和0。在⽂本分类中,表⽰⼀个特征有没有在⼀个⽂档中出现。
调⽤⽅法: from sklearn.naive_bayes import BernoulliNB
2. ⼼脏病预测
2.1 数据获取
获取⼼脏病的病例数据,共13项特征值,300多条数据。⽂末提供数据链接。
#(1)导⼊⼼脏病数据
import pandas as pd
filepath = 'C:\\Users\\admin\\.spyder-py3\\test\\⽂件处理\\⼼脏病\\heart.csv'
data = pd.read_csv(filepath)
2.2 数据处理
⾸先将导⼊的数据重新洗牌,⾏数据之间随机交换。然后将原始数据拆分成特征值和⽬标值,特征参数是:胆固醇、年龄等13项数据,⽬标为target这⼀列,即是否得了⼼脏病。为了验证最后预测结果的正确性,取最后10⾏数据⽤于模型验证,验证集的特征值数据⽤于输⼊最终的预测函数.predict()中,验证集的⽬标值来检验预测结果是否正确。提取出验证集之后,将⽤于建模的特征值和⽬标值删除最后10⾏即可。
#(2)数据处理
122是什么电话号码?
# 重新洗牌,⾏互换后,让索引从0开始
data = data.sample(frac=1).reset_index(drop=True)
# 提取⽬标值target⼀列
data_target = data['target']
# 提取⽬标值
data_feature = data.drop('target',axis=1)
# 取出最后10⾏作为验证集
大连汽车违章查询
data_predict_feature = data_feature[-10:]  #作为最后预测函数的输⼊
data_predict_target = data_target[-10:]  #⽤来验证预测输出结果的正确性
# 建模⽤的特征值和⽬标值删去最后10⾏
大众中国
data_feature = data_feature[:-10]  #x数据
data_target = data_target[:-10]    #y数据
2.3 划分训练集和测试集
⼀般采⽤75%的数据⽤于训练,25%⽤于测试,因此把数据进⾏训练之前,先要对数据划分。
划分⽅式:
x_train,x_test,y_train,y_test = train_test_split(x数据,y数据,test_size=数据占⽐)
有关划分划分训练集和测试集的具体操作,包括参数、返回值等,点击下⽂链接的看第3.1⼩节:
#(3)划分训练集和测试集
del_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(data_feature,data_target,test_size=0.25)
2.4 使⽤朴素贝叶斯⾼斯模型
⼼脏病数据中⼤多是连续型数据,少数是0、1离散型数据,因此先采⽤⾼斯模型进⾏训练,然后再采⽤多项式模型训练,对⽐这两种⽅法的准确率。
#(4)⾼斯模型训练
# 导⼊朴素贝叶斯--⾼斯模型⽅法
from sklearn.naive_bayes import GaussianNB
# gauss_nb接收⾼斯⽅法
gauss_nb = GaussianNB()
# 模型训练,输⼊训练集
gauss_nb.fit(x_train,y_train)
# 计算准确率--评分法
gauss_accuracy = gauss_nb.score(x_test,y_test)
# 预测
gauss_result = gauss_nb.predict(data_predict_feature)
导⼊⾼斯模型⽅法,gauss_nb接收该⽅法;使⽤.fit()函数进模型训练;采⽤.score()函数⽤评分法查看模型准确率,根据x_test预测结果,把结果和真实的y_test⽐较,计算准确率;最终将验证集的特征值传⼊.predict()函数预测是否得了⼼脏病,将最终预测结果与真实值⽐较,发现有少许偏差,模型准确率在0.83左右。
2.5 使⽤朴素贝叶斯多项式模型
⼼脏病数据中存在少量的离散数据,实际操作中多项式模型不适⽤于该案例,我使⽤多项式模型和⾼斯模型进⾏⽐较,让⼤家优个直观感受。操作⽅法和⾼斯模型类似,在此不做过多叙述,有不明⽩的可以参考上⼀篇⽂章:
#(5)多项式模型训练
# 导⼊朴素贝叶斯--多项式⽅法
from sklearn.naive_bayes import MultinomialNB
# multi_nb接收多项式⽅法
multi_nb = MultinomialNB()
# 多项式⽅法进⾏训练,输⼊训练集
multi_nb.fit(x_train,y_train)
# 评分法计算准确率
multi_accuracy = multi_nb.score(x_test,y_test)
# 预测
multi_result = multi_nb.predict(data_predict_feature)
最终的结果为,多项式模型的准确率在0.75左右,预测结果和实际结果相⽐偏差较⼤,因此在使⽤朴素贝叶斯⽅法,对有较多连续型数据进⾏分类预测时,⾼斯模型的准确度明显⾼于多项式模型。
⼼脏病数据集⾃取:链接: 提取码:a9wl 完整代码展⽰:
# 朴素贝叶斯⾼斯模型⼼脏病预测
#(1)导⼊⼼脏病数据
import pandas as pd
filepath = 'C:\\Users\\admin\\.spyder-py3\\test\\⽂件处理\\⼼脏病\\heart.csv'
data = pd.read_csv(filepath)
#(2)数据处理
# 重新洗牌,⾏互换后,让索引从0开始
data = data.sample(frac=1).reset_index(drop=True)
# 提取⽬标值target⼀列
data_target = data['target']
# 提取⽬标值
data_feature = data.drop('target',axis=1)
# 取出最后10⾏作为验证集
data_predict_feature = data_feature[-10:]  #作为最后预测函数的输⼊
data_predict_target = data_target[-10:]  #⽤来验证预测输出结果的正确性
# 建模⽤的特征值和⽬标值删去最后10⾏
data_feature = data_feature[:-10]  #x数据
data_target = data_target[:-10]    #y数据
#(3)划分训练集和测试集
del_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(data_feature,data_target,test_size=0.25)
#(4)⾼斯模型训练
# 导⼊朴素贝叶斯--⾼斯模型⽅法
from sklearn.naive_bayes import GaussianNB
# gauss_nb接收⾼斯⽅法
gauss_nb = GaussianNB()
# 模型训练,输⼊训练集
gauss_nb.fit(x_train,y_train)
# 计算准确率--评分法
gauss_accuracy = gauss_nb.score(x_test,y_test)
# 预测
gauss_result = gauss_nb.predict(data_predict_feature)
#(5)多项式模型训练
# 导⼊朴素贝叶斯--多项式⽅法
连霍高速起点和终点分别是哪里
from sklearn.naive_bayes import MultinomialNB
# multi_nb接收多项式⽅法
multi_nb = MultinomialNB()
客车联盟网
# 多项式⽅法进⾏训练,输⼊训练集
multi_nb.fit(x_train,y_train)
# 评分法计算准确率
multi_accuracy = multi_nb.score(x_test,y_test)
交通警察手势图# 预测
multi_result = multi_nb.predict(data_predict_feature)