目录
备注:本文主要来自于对《深入浅出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、朴素贝叶斯算法优缺点