当前位置: 首页 > news >正文

【机器学习可解释性】4.SHAP 值

机器学习可解释性

  • 1.模型洞察的价值
  • 2.特征重要性排列
  • 3.部分依赖图
  • 4.SHAP 值
  • 5.SHAP 值 高级使用

正文

理解各自特征的预测结果?

介绍

您已经看到(并使用)了从机器学习模型中提取一般解释技术。但是,如果你想要打破模型对单个预测的工作原理?

SHAP 值 (SHapley Additive exPlanations的首字母缩写)对预测进行分解,以显示每个特征的影响。你可以在哪里使用这个?

  • 一个模型说,银行不应该借钱给某人,法律要求银行解释每笔拒绝贷款的依据
  • 医疗保健提供者想要确定是什么因素导致每个病人患某种疾病的风险,这样他们就可以通过有针对性的健康干预措施直接解决这些风险因素

在本次课程中,您将使用SHAP 值 来解释单个预测。在下一次课中,您将看到如何将这些聚合为强大的模型级洞察力。

SHAP 值 最初来自博弈论中的一个核心问题:在由具有不同技能组合的多个玩家组成的联盟中,这会导致一些集体回报,什么是最公平的如何在玩家之间分配收益?

它们是如何工作的

SHAP 值解释了对给定特性具有特定值的影响,并将其与我们在该特性采用某个基线值时所做的预测进行了比较。

举一个有用的例子,我们将继续从排列重要性和部分依赖图中关于足球数据预测全场最佳球员的例子。
在这些教程中,我们预测了一支球队是否会有球员赢得全场最佳球员奖。

我们可以问:

  • 球队进了3个球这个事实对预测的影响有多大?
    但如果我们将其重述为:
  • 有多少预测是由球队进了3个球这一事实驱动的,而不是一些基线的进球数。
    当然,每个团队都有很多特点。因此,如果我们回答了目标数量的问题,我们就可以对所有其他功能重复这个过程。

SHAP 值 以一种保证良好属性的方式做到这一点。具体来说,你可以用下面的公式来分解预测:

sum(所有特征的SHAP值) = pred_for_team - pred_for_baseline_values

也就是说,所有特征的SHAP值加起来解释了为什么我的预测与基线不同。这允许我们将预测分解成如下图:

shap

你如何理解这一点?

我们预测的值是0.7,而base_value是0.4979。导致预测增加的特征值是粉红色的,它们的看上去的大小显示了特征影响的大小。减少预测的特征值用蓝色表示。最大的影响来自于进球2。而控球值对预测结果有显著的降低作用。

如果用粉色条的长度减去蓝色条的长度,它等于从基本值到输出的距离。

这项技术有一些复杂性,要确保基线加上个体影响的总和加起来就是预测(这并不像听起来那么简单)。我们不会在这里详细讨论,因为它对使用该技术并不重要。这篇博文有一个更详细的理论解释。

计算SHAP值的代码

我们使用很棒的SHAP库来计算SHAP 值。

对于本例,我们将重用您已经看到的带有Soccer数据的模型。

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifierdata = pd.read_csv('../input/fifa-2018-match-statistics/FIFA 2018 Statistics.csv')
y = (data['Man of the Match'] == "Yes")  # 将 "Yes"/"No" 转化为 2进制 0 或 1
feature_names = [i for i in data.columns if data[i].dtype in [np.int64, np.int64]]
X = data[feature_names]
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=1)
my_model = RandomForestClassifier(random_state=0).fit(train_X, train_y)

我们将查看数据集的单行(我们任意选择第5行)的SHAP值。对于上下文,我们将在查看SHAP值之前查看原始预测。

row_to_show = 5
data_for_prediction = val_X.iloc[row_to_show]  # 在这里使用1行数据。如果需要,可以使用多行吗
data_for_prediction_array = data_for_prediction.values.reshape(1, -1)my_model.predict_proba(data_for_prediction_array)

array([[0.29, 0.71]])

该队有70%的可能性有一名球员获得该奖项。
现在,我们将继续研究获取该预测的SHAP值的代码。

import shap  # Shap Values的 数据包#  创建可以计算SHAP 值的对象
explainer = shap.TreeExplainer(my_model)# 计算 SHAP 值
shap_values = explainer.shap_values(data_for_prediction)

上面的shap_values对象是一个包含两个数组的列表。第一个数组是消极结果(未获奖)的SHAP值,第二个数组是积极结果(获奖)的SHAP值列表。我们通常根据对积极结果的预测来考虑预测,因此我们将为积极结果提取SHAP值(提取shap_values[1])。

查看原始数组很麻烦,但是shap 包提供了一种很好的方式来可视化结果。

shap.initjs()
shap.force_plot(explainer.expected_value[1], shap_values[1], data_for_prediction)

shap

如果您仔细查看我们创建SHAP值的代码,您会注意到我们在SHAP.TreeexPlainer (my_model)中引用了Trees。但是SHAP包为每种类型的模型都提供了解释器。

  • shap.DeepExplainer 适用于深度学习模型。
  • shap.KernelExplainer 适用于所有模型,尽管它比其他解释器慢,并且它提供了近似值而不是精确的shap 值。
    下面是一个使用KernelExplainer获得类似结果的示例。结果并不相同,因为KernelExplainer给出了一个近似的结果。但结果都是一样的。
# 使用内核SHAP来解释测试集预测
k_explainer = shap.KernelExplainer(my_model.predict_proba, train_X)
k_shap_values = k_explainer.shap_values(data_for_prediction)
shap.force_plot(k_explainer.expected_value[1], k_shap_values[1], data_for_prediction)

这里会出现一堆的提示 这里就不一一展显。

shap

轮到你了

SHAP值是很棒的。将它们与您学过的其他工具一起应用,以解决完整的数据科学场景。


练习部分

设置

此时,您已经拥有了足够的工具,可以将令人信服的解决方案组合在一起,以解决实际问题。您需要为以下数据科学场景的每个部分选择正确的技术。在此过程中,您将使用SHAP值以及其他解释工具。

下面的问题通过使用一些检查代码来反馈您的工作。运行以下单元格来设置我们的反馈系统。

# Get most recent checking code
!pip install -U -t /kaggle/working/ git+https://github.com/Kaggle/learntools.git
from learntools.ml_explainability.ex4 import *
print("Setup Complete")

这里就一系列的安装信息,以及完成设置信息

场景

一家医院一直在与“再入院”作斗争,即他们在病人恢复得足够好之前就让病人出院,病人又带着健康并发症回来了。

医院希望你能帮助确定再次入院风险最高的病人。医生(而不是你的模型)将最终决定何时让每个病人出院;但他们希望你的模型能突出医生在让病人出院时应该考虑的问题。

医院已经给了你相关的病人医疗信息。以下是数据中的特征列列表:

import pandas as pd
data = pd.read_csv('../input/hospital-readmissions/train.csv')
data.columns

显示各列名称

Index(['time_in_hospital', 'num_lab_procedures', 'num_procedures','num_medications', 'number_outpatient', 'number_emergency','number_inpatient', 'number_diagnoses', 'race_Caucasian','race_AfricanAmerican', 'gender_Female', 'age_[70-80)', 'age_[60-70)','age_[50-60)', 'age_[80-90)', 'age_[40-50)', 'payer_code_?','payer_code_MC', 'payer_code_HM', 'payer_code_SP', 'payer_code_BC','medical_specialty_?', 'medical_specialty_InternalMedicine','medical_specialty_Emergency/Trauma','medical_specialty_Family/GeneralPractice','medical_specialty_Cardiology', 'diag_1_428', 'diag_1_414','diag_1_786', 'diag_2_276', 'diag_2_428', 'diag_2_250', 'diag_2_427','diag_3_250', 'diag_3_401', 'diag_3_276', 'diag_3_428','max_glu_serum_None', 'A1Cresult_None', 'metformin_No','repaglinide_No', 'nateglinide_No', 'chlorpropamide_No','glimepiride_No', 'acetohexamide_No', 'glipizide_No', 'glyburide_No','tolbutamide_No', 'pioglitazone_No', 'rosiglitazone_No', 'acarbose_No','miglitol_No', 'troglitazone_No', 'tolazamide_No', 'examide_No','citoglipton_No', 'insulin_No', 'glyburide-metformin_No','glipizide-metformin_No', 'glimepiride-pioglitazone_No','metformin-rosiglitazone_No', 'metformin-pioglitazone_No', 'change_No','diabetesMed_Yes', 'readmitted'],dtype='object')

下面是解释字段名的一些快速提示:

  • 你的预测目标是readmitted “再次接纳”
  • 带有diag一词的栏表示病人所患疾病的诊断代码。例如,diag_1_428表示医生说他们的第一次疾病诊断是428428对应什么疾病?你可以在编码本里查一下,但如果没有更多的医学背景,这对你来说也没什么意义。
  • 列名如glimepiride_No表示患者没有服用glimepiride药物。如果该特征值为False,则患者确实服用了 glimepiride(格列美脲)药。
  • medical_specialty开头的特征描述了为病人看病的医生的专业。这些字段中的值都是TrueFalse

你的代码库

在编写处理此场景的代码时,前面教程中的这些代码片段可能会很有用。您仍然需要修改它们,但我们已经将它们复制到这里,以便您不必查找它们。
参考代

参考码如下

计算并显示排列重要性:

import eli5
from eli5.sklearn import PermutationImportanceperm = PermutationImportance(my_model, random_state=1).fit(val_X, val_y)
eli5.show_weights(perm, feature_names = val_X.columns.tolist())

计算并显示部分依赖图:

from matplotlib import pyplot as plt
from sklearn.inspection import PartialDependenceDisplayfeature_name = 'Goal Scored'
PartialDependenceDisplay.from_estimator(my_model, val_X, [feature_name])
plt.show()

计算和显示Shap 值为一个预测:

import shap  # package used to calculate Shap valuesdata_for_prediction = val_X.iloc[0,:]  # use 1 row of data here. Could use multiple rows if desired# Create object that can calculate shap values
explainer = shap.TreeExplainer(my_model)
shap_values = explainer.shap_values(data_for_prediction)
shap.initjs()
shap.force_plot(explainer.expected_value[0], shap_values[0], data_for_prediction)

第一步

你已经建立了一个简单的模型,但医生说他们不知道如何评估一个模型,他们希望你向他们展示一些证据,证明这个模型正在做一些符合他们医学直觉的事情。创建任何图形或表格,向他们快速展示模型正在做什么?

他们很忙。所以他们希望你将你的模型概述浓缩成1或2个图形,而不是一长串图形。
我们将在您建立基本模型之后开始。只需运行以下单元格来构建名为“my_model”的模型。

import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_splitdata = pd.read_csv('../input/hospital-readmissions/train.csv')y = data.readmittedbase_features = [c for c in data.columns if c != "readmitted"]X = data[base_features]train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=1)
my_model = RandomForestClassifier(n_estimators=30, random_state=1).fit(train_X, train_y)

上述正常情况下,用随机森林分类建立模型并拟合,有了模型后,再有以下分析

现在使用下面的单元格创建医生的材料。

这里需要您 填写你的代码

# 填写你的代码
____

答案:

import eli5
from eli5.sklearn import PermutationImportance
perm = PermutationImportance(my_model, random_state=1).fit(val_X, val_y)
eli5.show_weights(perm, feature_names = val_X.columns.tolist())
运行结果如下:
eli5

要了解要显示什么,请运行下面的单元格。

# Run this code cell to receive credit!
q_1.solution()

第二步

看来number_inpatient是一个非常重要的特性。医生们想知道更多这方面的情况。为它们创建一个图表,显示num_inpatient如何影响模型的预测。

# 填写你的代码
____

答案 : 将上述的参数代码中的 Goal Scored 修改为 number_inpatient

from matplotlib import pyplot as plt from sklearn.inspection import
PartialDependenceDisplay

feature_name = ‘number_inpatient’
PartialDependenceDisplay.from_estimator(my_model, val_X, [feature_name])
plt.show()

p

# Check your answer (Run this code cell to receive credit!)
q_2.solution()

第三步

医生们认为,住院治疗次数的增加导致预测的增加是一个好兆头。但是他们不能从这个图中看出这个图的变化是大还是小。他们希望您为time_in_hospital创建类似的东西,以查看其比较效果。

# 填写你的代码
____

答案 : 因为需要查看 time_in_hospital 影响,因此特征修改为time_in_hospital

from matplotlib import pyplot as plt from sklearn.inspection import
PartialDependenceDisplay

feature_name = ‘time_in_hospital’
PartialDependenceDisplay.from_estimator(my_model, val_X, [feature_name])
plt.show()

d

第四步

哇!住院时间似乎一点也不重要。部分依赖性图上的最低值与最高值之间的差异约为5%。
如果这是你的模型得出的结论,医生会相信的。但它似乎很低。数据可能是错误的,或者你的模型比他们预期的更复杂?
他们希望您向他们展示time_in_hospital的每个值的原始再入院率,以便将其与部分依赖图进行比较。

  • 画出那个图。
  • 结果相似还是不同?
# Your Code Here
____

提示:这需要对原始数据进行分组(来自pandas),而不是使用模型

答案

一个简单的pandas组,显示每次住院的平均再入院率。

使用concat将验证数据分开,而不是使用所有原始数据

all_train = pd.concat([train_X, train_y], axis=1)

all_train.groupby([‘time_in_hospital’]).mean().readmitted.plot()
plt.show()

第五步

现在医生们确信你有正确的数据,模型概述看起来是合理的。是时候把它变成他们可以使用的成品了。具体来说,医院希望您创建一个函数patient_risk_factors,该函数执行以下操作

  • 获取单行患者数据(格式与原始数据相同)
  • 创建一个可视化显示患者的哪些特征增加了他们再入院的风险,哪些特征降低了风险,以及这些特征有多重要。

展示每一个特征对再入院风险的每一个微小影响并不重要。只关注病人最重要的特征是可以的。

# Your Code Here
____

提示:这里需要填写显示 SHAP 值,注意要用函数

答案

import shap  # package used to calculate Shap valuessample_data_for_prediction = val_X.iloc[0].astype(float)  # to test functiondef patient_risk_factors(model, patient_data):# Create object that can calculate shap valuesexplainer = shap.TreeExplainer(model)shap_values = explainer.shap_values(patient_data)shap.initjs()return shap.force_plot(explainer.expected_value[1], shap_values[1], patient_data)

继续深入

您有一些强大的工具来了解模型和单独预测。接下来,您将查看SHAP值的聚合,以便将模型级和预测级的解释联系起来。

相关文章:

【机器学习可解释性】4.SHAP 值

机器学习可解释性 1.模型洞察的价值2.特征重要性排列3.部分依赖图4.SHAP 值5.SHAP 值 高级使用 正文 理解各自特征的预测结果? 介绍 您已经看到(并使用)了从机器学习模型中提取一般解释技术。但是,如果你想要打破模型对单个预测的工作原理? SHAP 值…...

OpenCV官方教程中文版 —— 直方图均衡化

OpenCV官方教程中文版 —— 直方图均衡化 前言一、原理二、 OpenCV 中的直方图均衡化三、 CLAHE 有限对比适应性直方图均衡化 前言 本小节我们要学习直方图均衡化的概念,以及如何使用它来改善图片的对比。 一、原理 想象一下如果一副图像中的大多是像素点的像素值…...

如何使用navicat图形化工具远程连接MariaDB数据库【cpolar内网穿透】

公网远程连接MariaDB数据库【cpolar内网穿透】 文章目录 公网远程连接MariaDB数据库【cpolar内网穿透】1. 配置MariaDB数据库1.1 安装MariaDB数据库1.2 测试局域网内远程连接 2. 内网穿透2.1 创建隧道映射2.2 测试随机地址公网远程访问3. 配置固定TCP端口地址3.1 保留一个固定的…...

【uniapp】uview1.x使用upload上传图片

和2.x不同的是,要用 action 来配置后端上传图片的接口地址; 再来一些配置项的命名有所不同,一般1.x的命名用 -,2.x的命名使用小驼峰; 1.x 的上传会自带删除时的提示框,2.x 没有; 重要的几个配置…...

基于nodejs+vue食力派网上订餐系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…...

软件测试常用的8种功能测试类型有哪些?

软件测试常用的8种功能测试类型有哪些? 单元测试 单元测试确保在一个段中编写的每一段代码都能产生最佳结果。开发人员在单元测试期间只看接口和确定部件。它提供了代码进展的文档,因为每个代码单元在继续下一个之前都经过了彻底的测试。 集成测试 至少对…...

动态规划之01背包问题

01背包问题 1. 【模板】01背包2. 分割等和子集3. 目标和4. 最后一块石头的重量 II 01背包问题是一种动态规划问题,用于求解在有限容量的背包中装入最大价值的物品组合。具体步骤如下: 定义一个二维数组dp[i][j],表示从前i个物品中选择若干个…...

安防监控项目---boa服务器的移植

文章目录 前言一、boa服务器简介二、移植步骤三、测试结果四、A9平台移植BOA总结 前言 书接上期,在配置完成环境后,那么接下来呢还得移植两个非常关键的东西,一个呢时boa服务器,另一个呢时cgi接口,boa服务器能够使得我…...

Gson 字符串常用转换方式(集合转换为Json数组

数组转换为 Json 字符串&#xff1a; GsonUtils.toJson(itemListBean.getImgs())json 字符串转换为数组 Gson().fromJson(goodsDbBean.getImgs(), String[].class)Json 转换为已知实体类 GsonUtils.parseJSON(result, AFileInfoBean.class);Json 转换为已知实体类集合 List<…...

MyBatis的使用(XML映射文件)

MyBatis的使用&#xff08;XML映射文件&#xff09; MyBatis基于注解开发简单便捷&#xff0c;但是弊端是失去SQL语句的灵活性&#xff0c;不能根据实际情况产生不同的SQL语句 MyBatis除了支持注解开发以外&#xff0c;还支持一种开发方式&#xff1a;XML映射文件&#xff0c…...

localhost知识

文章目录 一、localhost是什么&#xff1f;二、localhost 在平时用到的地方三、 localhost 与 127.0.01 一、localhost是什么&#xff1f; localhost 是一个特殊的主机名&#xff0c;通常指代本机。它被用来进行本地开发和测试&#xff0c;也常被用作网络配置中的占位符&#…...

PyTorch入门学习(八):神经网络-卷积层

目录 一、数据准备 二、创建卷积神经网络模型 三、可视化卷积前后的图像 一、数据准备 首先&#xff0c;需要准备一个数据集来演示卷积层的应用。在这个示例中&#xff0c;使用了CIFAR-10数据集&#xff0c;该数据集包含了10个不同类别的图像数据&#xff0c;用于分类任务。…...

【EI会议征稿】 2024年遥感、测绘与图像处理国际学术会议(RSMIP2024)

2024年遥感、测绘与图像处理国际学术会议(RSMIP2024) 2024 International Conference on Remote Sensing, Mapping and Image Processing 2024年遥感、测绘与图像处理国际学术会议(RSMIP2024)将于2024年1月19日-21日在中国厦门举行。会议主要围绕遥感、测绘与图像处理等研究领…...

MySQL 8 - 处理 NULL 值 - is null、=null、is not null、<> null 、!= null

处理 NULL 值&#xff1a; IS NULL&#xff1a;IS NULL 用于检查一个列是否为 NULL。例如&#xff0c;如果查找一个表中某一列的值为 NULL 的行&#xff0c;可以使用以下语法&#xff1a; SELECT * FROM table_name WHERE column_name IS NULL;IS NOT NULL&#xff1a;IS NOT N…...

高教社杯数模竞赛特辑论文篇-2018年C题:大型百货商场会员画像描述(附获奖论文及MATLAB代码实现)

目录 摘 要 一、问题重述 1.1 问题背景 1.2 问题提出 二、问题分析 2.1 问题一的分析...

#力扣:2315. 统计星号@FDDLC

2315. 统计星号 - 力扣&#xff08;LeetCode&#xff09; 一、Java class Solution {public int countAsterisks(String s) {int cnt 0;boolean flag true;for(char c: s.toCharArray()) {if(c |) flag !flag;else if(c * && flag) cnt;}return cnt;} }...

设计模式——单例模式详解

目录 设计模式类型单例模式单例模式方式饿汉式静态常量方式静态代码块形式 懒汉式线程不安全&#xff08;不推荐&#xff09;懒汉式优化&#xff08;不推荐&#xff09; 双重检查&#xff08;推荐方式&#xff09;静态内部类&#xff08;推荐方式&#xff09;枚举方式&#xff…...

一、W5100S/W5500+RP2040树莓派Pico<静态配置网络信息>

文章目录 1. 前言2. 相关网络信息2.1 简介2.2 优点2.3 应用 3. WIZnet以太网芯片4. 静态IP网络设置示例讲解以及使用4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 编译烧录 5. 注意事项6. 相关链接 1. 前言 从本章开始我们将用WIZnet的W5100S/W5500以太网芯片结合RP…...

【C++的OpenCV】第十四课-OpenCV基础强化(二):访问单通道Mat中的值

&#x1f389;&#x1f389;&#x1f389; 欢迎各位来到小白 p i a o 的学习空间&#xff01; \color{red}{欢迎各位来到小白piao的学习空间&#xff01;} 欢迎各位来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; &#x1f496;&#x1f496;&…...

elementUI el-collapse 自定义折叠面板icon 和 样式 或文字展开收起

: :v-deep{.el-collapse-item__arrow {width: 40px;}.el-icon-arrow-right:before {content: "展开";font-size: 15px;font-family: heiti;color: #2295ff;font-weight: bold;}.el-collapse-item__arrow.is-active {transform: none;}.el-collapse-item__arrow.is-a…...

如何用个人数据Milvus Cloud知识库构建 RAG 聊天机器人?(上)

生成式人工智能时代,开发者可以借助大语言模型(LLM)开发更智能的应用程序。然而,由于有限的知识,LLM 非常容易出现幻觉。检索增强生成(RAG)https://zilliz.com/use-cases/llm-retrieval-augmented-generation 通过为 LLM 补充外部知识,有效地解决了这一问题。 在 Chat …...

2023年江西省“振兴杯”工业互联网安全技术技能大赛暨全国大赛江西选拔赛 Write UP

文章目录 一、协议分析 - modbus二、协议分析 - 异常的流量三、协议分析 - S7Error四、协议分析 - OmronAttack五、组态编程 - 工程的秘密六、组态编程 - 工程的秘密七、组态编程 - 简单的计算八、组态编程 - 交通灯九、组态编程 - 有趣的转盘十、应急处置 - 登录日志分析十一、…...

PostMan 之 Mock 接口测试

在测试的时候经常会碰到后端开发工程师的接口还没有开发完成&#xff0c;但是测试任务已经分配过来。没有接口怎么测试呢&#xff1f; 测试人员可以通过 mock server 自己去造一个接口来访问。mock server 可用于模拟真实的接口。收到请求时&#xff0c;它会根据配置返回对应的…...

LuatOS-SOC接口文档(air780E)--libgnss - NMEA数据处理

示例 -- 提醒: 本库输出的坐标,均为 WGS84 坐标系 -- 如需要在国内地图使用, 要转换成对应地图的坐标系, 例如 GCJ02 BD09 -- 相关链接: https://lbsyun.baidu.com/index.php?titlecoordinate -- 相关链接: https://www.openluat.com/GPS-Offset.html-- 方案1, 经lua层进行数…...

基于华为云 IoT 物联网平台实现家居环境实时监控

01 智能家居环境监测 智能家居环境监测采用 Ruff 开发板作为主控&#xff0c;串口线连接温湿度传感器 DHT11 和空气质量传感器 SDS011&#xff0c;每5分钟采集一次数据&#xff0c;通过 MQTT 协议发送到华为云 IoT 物联网平台&#xff0c;并基于数据分析服务实时计算出整个家庭…...

【开源框架】Glide的图片加载流程

本篇文章从Glide 4.11源码入手&#xff0c;简单的分析整个图片请求的流程&#xff0c;本着 ”只见树林&#xff0c;不见树木“ 的原则&#xff0c;宏观请求流程&#xff0c;不细究实现细节&#xff08;细节留坑埋点&#xff0c;之后慢慢写&#xff09; 引入依赖 以下的所有分…...

win10下Mariadb绿色版安装步骤

使用绿色版的mariadb数据库管理软件&#xff0c;免费开源&#xff0c;可以用来替换MySQL。首先从mariadb官网下载绿色版本的压缩包。解压后、配置好即可以使用。 把他解压缩到C:\mariadb\之下。打开powershell&#xff1a; Cd c:\mariadb\bin .\mysql_install_db.exe 这一…...

wiresharak捕获DNS

DNS解析&#xff1a; 过滤项输入dns&#xff1a; dns查询报文 应答报文&#xff1a; 事务id相同&#xff0c;flag里 QR字段1&#xff0c;表示响应&#xff0c;answers rrs变成了2. 并且响应报文多了Answers 再具体一点&#xff0c;得到解析出的ip地址&#xff08;最底下的add…...

vue源码分析(一)——源码目录说明

文章目录 一、如何下载源码&#xff08;可忽略&#xff09;&#xff08;1&#xff09;打开地址&#xff08;2&#xff09;复制链接&#xff08;3&#xff09;git clone 链接 二、源码目录说明1.可以根据你下载的源码通过package.json文件查看vue版本2.源码目录说明 一、如何下载…...

【深度学习】吴恩达课程笔记(二)——浅层神经网络、深层神经网络

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 笔记链接 【深度学习】吴恩达课程笔记(一)——深度学习概论、神经网络基础 吴恩达课程笔记——浅层神经网络、深层神经网络 四、浅层神经网络1.双层神经网络表示2.双层神经网络的前向传播第一层前向传播第二层前…...