统计学/机器学习入门(三): 朴素贝叶斯Naïve Bayes及其决策边界,交叉验证

本文主要是介绍统计学/机器学习入门(三): 朴素贝叶斯Naïve Bayes及其决策边界,交叉验证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一)理论基础
不做过多介绍,NB(Naïve Bayes) 可用来分类,直接上公式:
P(H|E) = P(E|H) * P(H) / P(E)

在这里插入图片描述

二)举例说明
a)文本数据:
直接来个例子比较直观, 现在有这样一堆数据:

在这里插入图片描述

我们将通过过去的天气数据来判断 今天是否适合出去玩耍,然后今天的天气是这样:

在这里插入图片描述

这就是个很简单的0 1问题,play到底可不可以呢,于是我们就需要计算P(yes|E)和P(no|E)的概率,进行比较即可完成分类:

在这里插入图片描述
在这里插入图片描述

由于分母都是P(E) ,所以只需要比较分子的大小即可, 由于机器学习是基于过去数据对未来的预测,所以以上所有的概率都是从过去这几天的观测数据中获得,可以得知:
P(E1|yes) = (yes中outlook=sunny的次数) / 所有yes = 2/9
同理:
P(E2|yes) = 3/9 = 1/3
P(E3|yes) = 3/9 = 1/3
P(E4|yes) = 3/9 = 1/3
P(yes) = 9/14
P(E1|no) = 3/5
P(E2|no) = 1/5
P(E3|no) = 4/5
P(E4|no) = 3/5
P(no) = 5/14
经过计算可得P(yes|E)的分子部分为1/189=0.0053, 而P(no|E)的分子部分为18/875=0.0206, 很明显后者概率更大,应该归位no。如果遇到某一项的概率为0,则会导致分子永远为0,为了避免这种情况,使用smoothing平滑处理或者叫Laplace correction拉普拉斯平滑处理, 这里不细究.
b)数字数据:
以上是对文本型(catagorical)的数据进行贝叶斯归类,但如果是数字型(numerical)的数据,则需要用到其他辅助手段,比如默认数据的分布是按照高斯(正态)分布的,则有了我们的GaussianNB(高斯贝叶斯)。当然数据并不一定是按照正态分布的,应对这种情况则需要选择使用其他的概率密度函数比如Poisson柏松,Gamma,binomial二项式。
如果是正态分布,则通过观测数据计算出均值mean和方差standard deviation然后代入正态分布的概率密度函数即可获得该特征的概率值,然后代入贝叶斯公式计算.
三)基于sklearn的代码实现:
由于所有的概率计算是基于过去的数据,所以对过去的数据(train set)的划分则会对未来的预判(predict)产生影响, 数据划分的好坏将会影响机器学习模型的各项性能指标。
以下是代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
from scipy import signal
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
#for accuracy_score, classification_report and confusion_matrix
from sklearn import metrics
from sklearn.metrics import accuracy_score
# to make this notebook's output stable across runs
np.random.seed(42)# load the iris dataset
from sklearn.datasets import load_iris
iris = load_iris()
导入了必要的包并且获得所有数据后,将会划分数据:
X_train, X_test, y_train, y_test = train_test_split(
iris.data, iris.target, stratify=iris.target, random_state=42)
这个stratify的作用是按照该标签中的各类所占比例来划分,比如y中的三种结果,0 1 2分别表示iris这些数据集中一共有三种花,加了这个之后train_test_split函数就会根据这个比例来划分,使得train set和test set中尽量都是这个比例。
这个random_state也是让每次划分固定的,甚至换了其他电脑也会参照同样的方式划分,使得结果一致。而如果不加这个,划分将每次都不同。如果是其他值,则也是按另一种比例固定划分.
接下来就是引入GaussianNB模型并用train set数据让它学习:
from sklearn.naive_bayes import GaussianNB
clf=GaussianNB() 
clf.fit(X_train, y_train)
学习好之后利用测试集test set的数据来进行预测, 并且打印预测数据和真实的测试集数据进行对比:
y_predict = clf.predict(X_test)
print("predicted data:\n", y_predict)
print("actual data\n", y_test) #actual
可得结果如下,并且每次运行都是一样的结果,因为我们设置了random_state=42, 如果设置成其他值则会发生变化,这里不做过多测试:

在这里插入图片描述

可以发现大部分都预测的非常准确(准确率达92%),可以通过计算得知:
accuracy = ((y_predict-y_test)==0).sum()/len(y_test)
四) 性能分析perfomance evaluation
当然,准确率并不是唯一评价ML模型好坏的标准,还有准确率precision,召回率recall,f1等指标。接下来将手动计算这几个值。在计算之前先要知道混淆矩阵confusion matrix:

在这里插入图片描述

其中实际类别就是y_test, 而预测类别就是y_predict.
accuracy = (TP+TN)/all,即所有预测正确的/所有。
precision = TP/(TP+FP)
recall = TP/(TP+FN)
F1=2P*R /(P+R)
对于0这一类而言,TP = 12 , TN =26, FP = 0, FN = 0, 他们分别的意思是TP(y_test是0,y_predict也是0),TN(y_test不是0,y_predict也不是0,例如,1被预测成2,2被预测成1,1被预测成1,2被预测成2都属于这一类,只要不和0沾边的),FP(本来不是0,被预测成0,这里一个都没有),FN(本来是0,被预测成不是0,这里一个没有).
所以关于0的precision,recall,f1都为0
同理,对于1而言,TP=12, TN=23, FP=2, FN=1 (在上方测试结果中可以看到本来actual不是1,被预测成1的有2个,本应该actual是1的被预测成其他的,有1个)
所以accuracy=25/28=0.92, precision = 12/14=0.86, recall=12/13=0.92, f1=2* 0.86 *0.92/(0.86+0.92) = 0.889
对于2,TP=11, TN=24, FP=1, FN=2
accuracy=35/38=0.92, precision = 11/12=0.92, recall = 11/13=0.85, f1=0.883
接下来调用函数进行验证:
print(metrics.classification_report(y_test, y_predict))
print(metrics.confusion_matrix(y_test, y_predict))
得到结果如下:

在这里插入图片描述

最后这个三维的混淆矩阵,左边栏是指实际值(test set),上方是指预测值(predict),由图可知,0全部划分正确,本身为1类,却被划分到2类的有1个(下图蓝框),本身为2类,却被划分到1类的有2个(下图红框)。

在这里插入图片描述

并且它虽然是三维的,但仍然能用来判断TP,TN,FP,FN
先看最简单的0:

在这里插入图片描述

再是相对简单的2:

在这里插入图片描述

最后一丢丢复杂的1:

在这里插入图片描述

五)绘制决策边界Decision Boundary
代码如下:
from matplotlib.colors import ListedColormap
def plot_decision_boundary(clf ,axes):xp=np.linspace(axes[0], axes[1], 200)yp=np.linspace(axes[2], axes[3], 200)x1, y1=np.meshgrid(xp, yp)xy=np.c_[x1.ravel(), y1.ravel()]y_pred = clf.predict(xy).reshape(x1.shape)custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])plt.contourf(x1, y1, y_pred, alpha=0.3, cmap=custom_cmap)plot_decision_boundary(clf , axes=[4, 8, 1.5, 5])
p1 = plt.scatter(X[y==0,0], X[y==0, 1], color='blue')
p2 = plt.scatter(X[y==1,0], X[y==1, 1], color='green')
p3 = plt.scatter(X[y==2,0], X[y==2, 1], color='red')
#设置注释
plt.legend([p1, p2, p3], iris['target_names'], loc='upper right')
plt.show()
绘制结果如图:

在这里插入图片描述

六)交叉验证cross validation
a)k-fold cv k折交叉验证
10折的交叉验证10-fold cross-validation, cv这个参数默认为3,这里改成10层:
from sklearn.model_selection import cross_val_score
scores = cross_val_score(clf, iris.data, iris.target, cv=10)
查看结果:
print("Cross-validation scores: {}".format(scores)) 
#accuracy for each fold
print("Average cross-validation score: {:.2f}".format(scores.mean()))
#average accuracy over all folds

在这里插入图片描述

b)leave-one-out cross validation(LOOCV) 留一验证
LOOCV的好处是他不受数据集划分的影响,缺点是计算量太大,因为他会把每一个数据都用来当一次预测集,所有n-1个数据都用来做训练集, 代码如下:
from sklearn.model_selection import LeaveOneOut
one_out = LeaveOneOut()
scores = cross_val_score(clf, iris.data, iris.target, cv=one_out)
print("Number of evaluations: ", len(scores))
print("Mean accuracy: {:.2f}".format(scores.mean()))
可得结果分别是len = 150和accuracy = 0.95

这篇关于统计学/机器学习入门(三): 朴素贝叶斯Naïve Bayes及其决策边界,交叉验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/846524

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学