混淆矩阵和数据不平衡 (2/3)

news2024/11/25 6:16:46

一、说明

        当我们的数据标签具有比另一个类别更多的类别时,我们说我们有数据不平衡 如果数据集数据不平恒,如何评估分类器的效果?如果分类器不好,如何改进分类器?本篇将讲述不平衡数据下,混淆矩阵的应用。

二、数据的

        我们的数据是不平衡的,因为在我们的训练数据中,徒步旅行者动物树木岩石的数量大不相同。我们可以通过将这些数据制成表格来看到这一点:

<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424">Label     Hiker     Animal     Tree     Rock
Count      <span style="color:#1c00cf">400</span>       <span style="color:#1c00cf">200</span>        <span style="color:#1c00cf">800</span>      <span style="color:#1c00cf">800</span></span></span></span></span>

        请注意,大多数数据都是树木岩石。平衡数据集没有这个问题。例如,如果我们试图预测一个物体是徒步旅行者动物树木还是岩石,理想情况下,我们希望所有类别的数量相等,如下所示:

Label     Hiker     Animal     Tree     Rock
Count      550       550        550      550 

        如果我们只是试图预测一个物体是否是徒步旅行者,理想情况下,我们需要相同数量的徒步旅行者和非徒步旅行者对象:

Label     Hiker     Non-Hiker
Count     1100        1100 

三、为什么数据不平衡很重要?

        数据不平衡很重要,因为模型可以在不需要的时候学会模仿这些不平衡。例如,假设我们训练了一个逻辑回归模型来识别对象是远足者还是非远足者r。如果训练数据在很大程度上由“远足者”标签主导,那么训练将使模型偏向于几乎总是返回“远足者”标签。然而,在现实世界中,我们可能会发现无人机遇到的大多数东西都是树木。有偏见的模型可能会将许多这些树标记为徒步旅行者

        之所以出现这种现象,是因为默认情况下,成本函数确定是否给出了正确的响应。这意味着对于有偏差的数据集,模型达到最佳性能的最简单方法是几乎忽略所提供的特征,并且始终或几乎总是返回相同的答案。这可能会产生毁灭性的后果。例如,假设我们的徒步旅行者/非徒步旅行者模型是在每 1000 个样本中只有一个包含徒步旅行者的数据上进行训练的。一个学会了每次都返回“非徒步旅行者”的模型的准确率为 99.9%!这个统计数据看起来很出色,但该模型毫无用处,因为它永远不会告诉我们是否有人在山上,如果雪崩发生,我们将不知道如何营救他们。

四、混淆矩阵中的偏差

        混淆矩阵是识别数据不平衡或模型偏差的关键。在理想情况下,测试数据具有近似偶数个标签,并且模型所做的预测也大致分布在标签上。对于 1000 个样本,一个无偏但经常得到错误答案的模型可能如下所示:

        我们可以看出输入数据是无偏的,因为行总和相同(每行 500),表明一半标签是“true”,一半是“false”。同样,我们可以看到该模型给出了公正的响应,因为它一半时间返回 true,另一半时间返回 false。

        相比之下,有偏差的数据大多包含一种标签,如下所示:

        同样,有偏差的模型主要产生一种标签,如下所示:

五、模型偏差不是准确性

        请记住,偏见不是准确性。例如,前面的一些示例有偏差,而其他示例则没有偏差,但它们都显示了一个模型,该模型在 50% 的时间内都能获得正确的答案。作为一个更极端的例子,下面的矩阵显示了一个不准确的无偏模型:

        请注意行数和列数加起来如何达到 500,表明两个数据都是平衡的,并且模型没有偏差。不过,这个模型几乎所有的响应都是错误的!

        当然,我们的目标是让模型准确无误,例如:

        但我们需要确保我们的准确模型没有偏见,仅仅因为数据是:

        在此示例中,请注意实际标签大多为 false(左列,显示数据不平衡),并且模型也经常返回 false(顶行,显示模型偏差)。此模型不擅长正确给出 true 响应。

六、避免数据不平衡的后果

                避免数据不平衡后果的一些简单方法是:

  • 通过更好的数据选择来避免它。
  • 对数据进行重采样,使其包含少数标注分类的重复项。
  • 对成本函数进行更改,使其优先处理不太常见的标签。例如,如果对给出了错误的响应,则成本函数可能返回 1;而如果对 Hiker 做出错误的响应,它可能会返回 10。

        在本练习中,我们将仔细研究不平衡的数据集,它们对预测的影响以及如何解决它们。我们还将使用混淆矩阵来评估模型更新。

七、数据可视化

        就像在前面的练习中一样,我们使用一个数据集来表示在山上发现的不同类别的对象:

import pandas
!wget https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to-machine-learning/main/graphing.py
!wget https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to-machine-learning/main/Data/snow_objects.csv
!wget https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to-machine-learning/main/Data/snow_objects_balanced.csv

#Import the data from the .csv file
dataset = pandas.read_csv('snow_objects.csv', delimiter="\t")

# Let's have a look at the data
dataset
           size     roughness     color     motion     label
0       50.959361    1.318226     green    0.054290    tree
1       60.008521    0.554291     brown    0.000000    tree
2       20.530772    1.097752     white    1.380464    tree
3       28.092138    0.966482     grey     0.650528    tree
4       48.344211    0.799093     grey     0.000000    tree
 ...       ...          ...        ...        ...       ...
2195    1.918175     1.182234     white    0.000000    animal
2196    1.000694     1.332152     black    4.041097    animal
2197    2.331485     0.734561     brown    0.961486    animal
2198    1.786560     0.707935     black    0.000000    animal
2199    1.518813     1.447957     brown    0.000000    animal

2200 rows × 5 columns

回想一下,我们有一个不平衡的数据集。有些类比其他类更频繁:

import graphing # custom graphing code. See our GitHub repo for details

# Plot a histogram with counts for each label
graphing.multiple_histogram(dataset, label_x="label", label_group="label", title="Label distribution")

八、使用二元分类

        在这里,我们将构建一个二元分类模型。我们想预测雪中的物体是“徒步旅行者”还是“非徒步旅行者”。为此,我们首先需要向数据集添加另一列,并将其设置为true,其中原始标签为hiker,并将其设置为false,并将其设置为其他任何内容

# Add a new label with true/false values to our dataset
dataset["is_hiker"] = dataset.label == "hiker"

# Plot frequency for new label
graphing.multiple_histogram(dataset, label_x="is_hiker", label_group="is_hiker", title="Distribution for new binary label 'is_hiker'")

现在我们的数据集中只有两类标签,但我们使其更加不平衡。

让我们使用 is_hiker 作为目标变量来训练随机森林模型,然后在训练集和测试集上测量其准确性:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
# import matplotlib.pyplot as plt
# from sklearn.metrics import plot_confusion_matrix
from sklearn.metrics import accuracy_score

# Custom function that measures accuracy on different models and datasets
# We will use this in different parts of the exercise
def assess_accuracy(model, dataset, label):
    """
    Asesses model accuracy on different sets
    """ 
    actual = dataset[label]        
    predictions = model.predict(dataset[features])
    acc = accuracy_score(actual, predictions)
    return acc

# Split the dataset in an 70/30 train/test ratio. 
train, test = train_test_split(dataset, test_size=0.3, random_state=1, shuffle=True)

# define a random forest model
model = RandomForestClassifier(n_estimators=1, random_state=1, verbose=False)

# Define which features are to be used (leave color out for now)
features = ["size", "roughness", "motion"]

# Train the model using the binary label
model.fit(train[features], train.is_hiker)

print("Train accuracy:", assess_accuracy(model,train, "is_hiker"))
print("Test accuracy:", assess_accuracy(model,test, "is_hiker"))
Train accuracy: 0.9532467532467532
Test accuracy: 0.906060606060606

准确性对于训练集和测试集来说都很好,但请记住,此指标并不是成功的绝对衡量标准。我们应该绘制一个混淆矩阵,看看模型的实际表现:

# sklearn has a very convenient utility to build confusion matrices
from sklearn.metrics import confusion_matrix
import plotly.figure_factory as ff

# Calculate the model's accuracy on the TEST set
actual = test.is_hiker
predictions = model.predict(test[features])

# Build and print our confusion matrix, using the actual values and predictions 
# from the test set, calculated in previous cells
cm = confusion_matrix(actual, predictions, normalize=None)

# Create the list of unique labels in the test set, to use in our plot
# I.e., ['True', 'False',]
unique_targets = sorted(list(test["is_hiker"].unique()))

# Convert values to lower case so the plot code can count the outcomes
x = y = [str(s).lower() for s in unique_targets]

# Plot the matrix above as a heatmap with annotations (values) in its cells
fig = ff.create_annotated_heatmap(cm, x, y)

# Set titles and ordering
fig.update_layout(  title_text="<b>Confusion matrix</b>", 
                    yaxis = dict(categoryorder = "category descending")
                    )

fig.add_annotation(dict(font=dict(color="black",size=14),
                        x=0.5,
                        y=-0.15,
                        showarrow=False,
                        text="Predicted label",
                        xref="paper",
                        yref="paper"))

fig.add_annotation(dict(font=dict(color="black",size=14),
                        x=-0.15,
                        y=0.5,
                        showarrow=False,
                        text="Actual label",
                        textangle=-90,
                        xref="paper",
                        yref="paper"))

# We need margins so the titles fit
fig.update_layout(margin=dict(t=80, r=20, l=120, b=50))
fig['data'][0]['showscale'] = True
fig.show()

        混淆矩阵向我们表明,尽管报告了指标,但该模型并不是非常精确。在测试集中存在的660个样本(占总样本的30%)中,它预测了29个假阴性和33个假阳性

        更重要的是,看看底行,它显示了当模型被显示有关徒步旅行者的信息时发生了什么:它几乎有40%的时间得到错误的答案。这意味着它无法正确识别山上近40%的人!如果我们使用这个模型对平衡集合进行预测会发生什么?

        让我们加载一个数据集,其中包含相同数量的“徒步旅行者”和“非徒步旅行者”的结果,然后使用该数据进行预测:

# Load and print umbiased set
#Import the data from the .csv file
balanced_dataset = pandas.read_csv('snow_objects_balanced.csv', delimiter="\t")

#Let's have a look at the data
graphing.multiple_histogram(balanced_dataset, label_x="label", label_group="label", title="Label distribution")

        这个新数据集在类之间是平衡的,但出于我们的目的,我们希望它在徒步旅行者和非徒步旅行者之间保持平衡。为简单起见,让我们将徒步旅行者加上非徒步旅行者的随机抽样。

# Add a new label with true/false values to our dataset
balanced_dataset["is_hiker"] = balanced_dataset.label == "hiker"

hikers_dataset = balanced_dataset[balanced_dataset["is_hiker"] == 1] 
nonhikers_dataset = balanced_dataset[balanced_dataset["is_hiker"] == False] 
# take a random sampling of non-hikers the same size as the hikers subset
nonhikers_dataset = nonhikers_dataset.sample(n=len(hikers_dataset.index), random_state=1)
balanced_dataset = pandas.concat([hikers_dataset, nonhikers_dataset])

# Plot frequency for "is_hiker" labels
graphing.multiple_histogram(balanced_dataset, label_x="is_hiker", label_group="is_hiker", title="Label distribution in balanced dataset")

        请注意,对于两个类,is_hiker标签具有相同的 true 和 false 数。我们现在使用的是类平衡数据集。让我们使用之前训练的模型在此集合上运行预测:

# Test the model using a balanced dataset
actual = balanced_dataset.is_hiker
predictions = model.predict(balanced_dataset[features])

# Build and print our confusion matrix, using the actual values and predictions 
# from the test set, calculated in previous cells
cm = confusion_matrix(actual, predictions, normalize=None)

# Print accuracy using this set
print("Balanced set accuracy:", assess_accuracy(model,balanced_dataset, "is_hiker"))
Balanced set accuracy: 0.754

正如预期的那样,我们使用不同的集合时准确性明显下降。再次,让我们直观地分析它的性能:

# plot new confusion matrix
# Create the list of unique labels in the test set to use in our plot
unique_targets = sorted(list(balanced_dataset["is_hiker"].unique()))

# Convert values to lower case so the plot code can count the outcomes
x = y = [str(s).lower() for s in unique_targets]

# Plot the matrix above as a heatmap with annotations (values) in its cells
fig = ff.create_annotated_heatmap(cm, x, y)

# Set titles and ordering
fig.update_layout(  title_text="<b>Confusion matrix</b>", 
                    yaxis = dict(categoryorder = "category descending")
                    )

fig.add_annotation(dict(font=dict(color="black",size=14),
                        x=0.5,
                        y=-0.15,
                        showarrow=False,
                        text="Predicted label",
                        xref="paper",
                        yref="paper"))

fig.add_annotation(dict(font=dict(color="black",size=14),
                        x=-0.15,
                        y=0.5,
                        showarrow=False,
                        text="Actual label",
                        textangle=-90,
                        xref="paper",
                        yref="paper"))

# We need margins so the titles fit
fig.update_layout(margin=dict(t=80, r=20, l=120, b=50))
fig['data'][0]['showscale'] = True
fig.show()

        混淆矩阵证实了使用此数据集的准确性很差,但是当我们在早期的训练测试集中拥有如此出色的指标时,为什么会发生这种情况?

        回想一下,第一个模型严重不平衡徒步旅行者课程约占结果的22%。当这种不平衡发生时,分类模型没有足够的数据来学习少数类的模式,因此会偏向多数类!

        不平衡集可以通过多种方式解决:
        - 改进数据选择
        - 对数据集
        进行重采样 - 使用加权类 - >我们将在练习中重点讨论这个问题

九、使用类权重平衡数据集

        我们可以根据多数类和少数类的分布为其分配不同的权重,并修改我们的训练算法,使其在训练阶段考虑这些信息。

        然后,当少数类被错误分类时,它将惩罚错误,实质上是“强迫”模型更好地学习其特征和模式。
        要使用加权类,我们必须使用原始训练集重新训练模型,但这次告诉算法在计算误差时使用权重:

# Import function used in calculating weights
from sklearn.utils import class_weight

# Retrain model using class weights
# Using class_weight="balanced" tells the algorithm to automatically calculate weights for us
weighted_model = RandomForestClassifier(n_estimators=1, random_state=1, verbose=False, class_weight="balanced")
# Train the weighted_model using binary label
weighted_model.fit(train[features], train.is_hiker)

print("Train accuracy:", assess_accuracy(weighted_model,train, "is_hiker"))
print("Test accuracy:", assess_accuracy(weighted_model, test, "is_hiker"))
Train accuracy: 0.962987012987013
Test accuracy: 0.9090909090909091

        使用加权类后,列车精度几乎保持不变,而测试精度则略有提高(约1%)。让我们再次使用平衡预测集看看结果是否得到改善:

print("Balanced set accuracy:", assess_accuracy(weighted_model, balanced_dataset, "is_hiker"))

# Test the weighted_model using a balanced dataset
actual = balanced_dataset.is_hiker
predictions = weighted_model.predict(balanced_dataset[features])

# Build and print our confusion matrix, using the actual values and predictions 
# from the test set, calculated in previous cells
cm = confusion_matrix(actual, predictions, normalize=None)
Balanced set accuracy: 0.761

        平衡集的准确度提高了大约 4%,但我们仍然应该尝试可视化和理解新结果。

十、最终混淆矩阵

        现在,我们可以使用在加权类数据集上训练的模型绘制最终的混淆矩阵,表示对平衡数据集的预测:

# Plot the matrix above as a heatmap with annotations (values) in its cells
fig = ff.create_annotated_heatmap(cm, x, y)

# Set titles and ordering
fig.update_layout(  title_text="<b>Confusion matrix</b>", 
                    yaxis = dict(categoryorder = "category descending")
                    )

fig.add_annotation(dict(font=dict(color="black",size=14),
                        x=0.5,
                        y=-0.15,
                        showarrow=False,
                        text="Predicted label",
                        xref="paper",
                        yref="paper"))

fig.add_annotation(dict(font=dict(color="black",size=14),
                        x=-0.15,
                        y=0.5,
                        showarrow=False,
                        text="Actual label",
                        textangle=-90,
                        xref="paper",
                        yref="paper"))

# We need margins so the titles fit
fig.update_layout(margin=dict(t=80, r=20, l=120, b=50))
fig['data'][0]['showscale'] = True
fig.show()

        虽然结果可能看起来有点令人失望,但我们现在有21%的错误预测(FNs + FPs),而之前的实验为25%。
正确预测(TPs + TNs)从74.7%上升到78.7%。全方位的 4% 改善是否显着?

        请记住,我们用于训练模型的数据相对较少,并且对于不同的样本,我们可用的特征可能仍然非常相似(例如,徒步旅行者和动物往往很小,不粗糙并且移动很多),尽管我们做出了努力,但模型仍然难以做出正确的预测。

        我们只需要更改一行代码即可获得更好的结果,因此似乎值得付出努力!

十一、总结

        在本练习中,我们讨论了以下概念:

  • 创建新的标签字段,以便我们可以使用具有多个类的数据集执行二元分类。
  • 不平衡集合上的训练如何对性能产生负面影响,尤其是在使用来自平衡数据集的看不见的数据时。
  • 使用混淆矩阵评估二元分类模型的结果。
  • 在训练模型和评估结果时使用加权类来解决类不平衡问题。

        祝你学习愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1022267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

许战海战略文库|品类缩量时代:制造型企业如何跨品类打造份额产品?

所有商业战略的本质是围绕着竞争优势与竞争效率展开的。早期&#xff0c;所有品牌立足于从局部竞争优势出发。因此,品牌创建初期大多立足于单个品类。后期增长受限,就要跨品类持续扩大竞争优势&#xff0c;将局部竞争优势转化为长期竞争优势&#xff0c;如果固化不前很难获得增…

玩转 gpgpu sim 02记 —— 构建了什么

1. 设置环境变量 编译gpgpu-sim 需要先运行脚本 setup_environment , source setup_environment&#xff0c; 注释如下&#xff0c;主要是设置一些 Makefile中会用到的环境变量 # see README before running this # 下面这句用来检测当前的shell环境是不是 bash 或者 sh 或者 …

GD32F303窗口看门狗在待机模式下运行

1.窗口看门狗 独立看门狗的时钟关闭不了&#xff0c;所以低功耗模式下需要定期唤醒喂狗&#xff0c;否则就会重启&#xff0c;比较麻烦。窗口看门狗使用的是APB1时钟&#xff0c;低功耗模式下时钟就停止了&#xff0c;所以不需要定期唤醒喂狗。但是窗口看门狗有喂狗的时间窗口&…

韩国市场最全开发攻略

2022年1月1日&#xff0c;RCEP正式生效施行&#xff0c;韩国也是首次跟中国缔结自贸条约&#xff0c;更低的关税&#xff0c;更灵活的贸易规则、更简洁的通关程序都将为中韩在贸易上继续发力增加了更多可施展的空间。这也将帮助更多的企业在东亚市场大展拳脚&#xff0c;推进整…

归并排序~

将一个无序系列&#xff0c;分成小系列&#xff0c;相邻两个小系列进行排序合并&#xff0c;再将两个相邻小系列排序合并&#xff0c;。。。。 int[] data {0,5,4,8,9,3,2,67,23} len 9 第一次每个元素一组 0,5,4,8,9,3,2,67,23 相邻排序合并 …

Vue框架分享与总结

总结开发中最常用的vue语法&#xff0c;以及对特定语法的理解。vue官网 文章目录 一、创建vue项目1、使用开发工具创建2、使用命令行创建3、vue框架结构4、Vue文件结构 二、Vue 常用模板语法1、v-if、v-show2、v-for3、v-on4、v-bind5、v-model 三、组件通信1、父组件给子组件传…

Bytebase 2.8.0 - ​全新升级的数据脱敏功能

&#x1f680; 新功能 全新升级的数据脱敏功能&#xff0c;提供更加细化的脱敏和访问权限配置。全新升级的 SQL 编辑器界面。库表同步功能支持 Oracle。支持设置公告。 &#x1f384; 改进 新增基于 MySQL parser 的数据脱敏内核。调整了侧边栏数据库列表&#xff0c;用最近…

Docker实战-第一章欢迎来到Docker世界

Docker基础 什么是Docker docker是包括一个命令行程序、后台守护进程和一组远程服务&#xff0c;它简化了安装、运行、发布和删除软件的工作。docker实现的基础是UNIX的容器技术。所以在docker出世之前已经有容器的概念&#xff0c;而且像谷歌一类公司也在探索自己的容器&…

关于taos数据库使用过程中突发“unable to establish connection”问题解决

项目使用的版本信息 1.taos的版本信息 3.0.4.1 2.jdbc的版本 3.2.1 3.druid连接池版本 1.2.11问题描述 Java应用服务连接&#xff0c;突然大量抛出如下的异常信息导致应用宕机&#xff1a; sql: select server_status(), desc: unable to establish connection和集团DBA沟通…

云原生微服务 第四章 Spring Cloud Netflix 之 Eureka

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 文章目录 系列文章目录[TOC](文章目录) 前言1、Eureka 两大组件2、Eureka 服务注册与发现3、案例3.1、创建主工程3.1.1、主…

(超详解)堆排序+(图解)

目录&#xff1a; 1:如何建堆(两种方法) 2:两种方法建堆的时间复杂度分析与计算 3:不同类型的排序方式我们应该如何建堆 文章正式开始&#xff1a; 1&#xff1a;如何建堆 在实现堆排序之前我们必须得建堆&#xff0c;才能够实现堆排序 首先在讲解如何建堆之前让我们先来回顾一…

保研复习-计算机组成原理

计算机组成原理 计算机组成冯诺依曼体系结构计算机系统的层次结构计算机的五大组成部件编译和解释的区别 CPUCPU的组成寄存器的类型指令类型指令功能指令执行过程 存储器存储器的层次结构寻址方式 输入和输出io方式有哪几种IO接口的基本结构 计算机组成 冯诺依曼体系结构 存储…

如何将你在树莓派上部署的 IoT 物联网 MQTT 服务发布到公网?

​ 上一章&#xff0c;你成功的在树莓派搭建了 EMQX 开源社区版&#xff0c;用来提供 MQTT 服务&#xff0c;并验证了设备端接入和消息通信。但你发现只能在局域网内访问 emqx.local 服务&#xff0c;而 IoT 设备分布在全国各地公共网络环境&#xff0c;这些设备该如何接入呢&a…

Android 13 CameraMetadata详解1 (内存分布以及增删改查)

文章目录 简介allocate_camera_metadataadd_camera_metadata_entrydelete_camera_metadata_entryupdate_camera_metadata_entryfind_camera_metadata_entry 点赞收藏加关注&#xff0c;下次找我不迷路。 也欢迎关注微信公众号 无限无羡 期待与你的相识&#xff01; 简介 初识…

【面试必刷TOP101】删除链表的倒数第n个节点 两个链表的第一个公共结点

目录 题目&#xff1a;删除链表的倒数第n个节点_牛客题霸_牛客网 (nowcoder.com) 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;两个链表的第一个公共结点_牛客题霸_牛客网 (nowcoder.com) …

雷达仿真:FMCW DDMA-MIMO 3D点云获取方法

1.DDMA-MIMO原理 由于TDMA-MIMO采用不同单天线交替发射信号&#xff0c;没有更好的利用发射天线同时工作的发射资源&#xff0c;导致发射功率低以及损耗大&#xff0c;从而使得TDMA波形只能应用在近距离探测的低功率雷达场景。而DDMA波形则能很好的弥补TDMA上述缺点&#xff0c…

为什么用IP访问网站也要使用SSL证书

IP地址SSL证书是一种专门用于公网IP地址验证的数字证书。它可以为公网IP地址提供安全的数据传输保障&#xff0c;解决了IP地址明文传输的安全隐患&#xff0c;保护了IP地址的数据传输安全。 与普通的SSL证书不同&#xff0c;IP地址SSL证书是基于IP地址进行验证的。在申请IP地址…

ssh登录时间久或登陆后报错

情况1 问题描述&#xff1a; ssh登录时间很久&#xff0c;登录后出现abrt-cli status timed out 的报错 问题原因&#xff1a; .lock文件被锁导致 执行systemctl status abrtd.service可以看到被锁的.lock 处理方式&#xff1a; ps -ef | grep pid 找到被锁的进程kill掉…

Java基于SpringBoot的在线考试系统的研究与实现(附源码,教程)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 第一章第二章.主要技术第三章第四章 系统设计4.1功能结构4.2 数据库设计4.2.1 数据库E/R图4.2.2 数…

Windows安装cuda和cudnn教程最新版(2023年9月)

文章目录 cudacudnn cuda 查看电脑的cuda最高驱动版本&#xff08;适用于N卡电脑-Nvidia&#xff09; winR打开命令行&#xff0c;输入nvidia-smi 右上角cuda -version就是目前支持的最高cuda版本 nvidia官网下载cuda 下载地址&#xff1a;https://developer.nvidia.com/cuda…