Approaching (Almost) Any Machine Learning Problem中译版

前言

  • Abhishek Thakur,很多kaggler对他都非常熟悉,2017年,他在 Linkedin 发表了一篇名为Approaching (Almost) Any Machine Learning Problem的文章,介绍他建立的一个自动的机器学习框架,几乎可以解决任何机器学习问题,这篇文章曾火遍 Kaggle。
  • Abhishek在Kaggle上的成就:
    • Competitions Grandmaster(17枚金牌,世界排名第3)
    • Kernels Expert (Kagglers排名前1%)
    • Discussion Grandmaster(65枚金牌,世界排名第2)
  • 目前,Abhishek在挪威boost公司担任首席数据科学家的职位,这是一家专门从事会话人工智能的软件公司。
  • 本文对Approaching (Almost) Any Machine Learning Problem进行了中文翻译,由于本人水平有限,且未使用机器翻译,可能有部分言语不通顺或本土化程度不足,也请大家在阅读过程中多提供宝贵意见。
  • 因为有几章内容太过基础,所以未进行翻译,详细情况请参照书籍目录:
    • 准备环境(未翻译)
    • 无监督和有监督学习(未翻译)
    • 交叉检验(已翻译)
    • 评估指标(已翻译)
    • 组织机器学习(已翻译)
    • 处理分类变量(已翻译)
    • 特征工程(已翻译)
    • 特征选择(已翻译)
    • 超参数优化(已翻译)
    • 图像分类和分割方法(未翻译)
    • 文本分类或回归方法(未翻译)
    • 组合和堆叠方法(未翻译)
    • 可重复代码和模型方法(未翻译)
  • 我将会把翻译后markdown文件放在Github上,供大家免费下载,若在阅读过程中发现错误,也欢迎大家提出issue或者PR协助我修改。AAAML-CN。
  • 如果后续大家有需要可能会继续翻译未翻译的章节,如果对大家有帮助的话,请帮忙点个star,或者关注。
  • 下面我展示一下交叉检验章节的翻译内容

交叉检验

在上一章中,我们没有建立任何模型。原因很简单,在创建任何一种机器学习模型之前,我们必须知道什么是交叉检验,以及如何根据数据集选择最佳交叉检验数据集。

那么,什么是交叉检验,我们为什么要关注它?

关于什么是交叉检验,我们可以找到多种定义。我的定义只有一句话:交叉检验是构建机器学习模型过程中的一个步骤,它可以帮助我们确保模型准确拟合数据,同时确保我们不会过拟合。但这又引出了另一个词:过拟合

要解释过拟合,我认为最好先看一个数据集。有一个相当有名的红酒质量数据集(red wine quality dataset)。这个数据集有11个不同的特征,这些特征决定了红酒的质量。

这些属性包括:

  • 固定酸度(fixed acidity)
  • 挥发性酸度(volatile acidity)
  • 柠檬酸(citric acid)
  • 残留糖(residual sugar)
  • 氯化物(chlorides)
  • 游离二氧化硫(free sulfur dioxide)
  • 二氧化硫总量(total sulfur dioxide)
  • 密度(density)
  • PH值(pH)
  • 硫酸盐(sulphates)
  • 酒精(alcohol)

根据这些不同特征,我们需要预测红葡萄酒的质量,质量值介于0到10之间。

让我们看看这些数据是怎样的。

import pandas as pd
df = pd.read_csv("winequality-red.csv")

请添加图片描述

图 1:红葡萄酒质量数据集简单展示

我们可以将这个问题视为分类问题,也可以视为回归问题。为了简单起见,我们选择分类。然而,这个数据集值包含6种质量值。因此,我们将所有质量值映射到0到5之间。

quality_mapping = {
    3: 0,
    4: 1,
    5: 2,
    6: 3,
    7: 4,
    8: 5
}
df.loc[:, "quality"] = df.quality.map(quality_mapping)

当我们看大这些数据并将其视为一个分类问题时,我们脑海中会浮现出很多可以应用的算法,也许,我们可以使用神经网络。但是,如果我们从一开始就深入研究神经网络,那就有点牵强了。所以,让我们从简单的、我们也能可视化的东西开始:决策树。

在开始了解什么是过拟合之前,我们先将数据分为两部分。这个数据集有1599个样本。我们保留1000个样本用于训练,599个样本作为一个单独的集合。

以下代码可以轻松完成划分:

df = df.sample(frac=1).reset_index(drop=True)

df_train = df.head(1000)
df_test = df.tail(599)

现在,我们将在训练集上使用scikit-learn训练一个决策树模型。

from sklearn import tree 
from sklearn import metrics

clf = tree.DecisionTreeClassifier(max_depth=3) 

cols = ['fixed acidity',
        'volatile acidity',
        'citric acid',
        'residual sugar',
        'chlorides',
        'free sulfur dioxide',
        'total sulfur dioxide',
        'density',
        'pH',
        'sulphates',
        'alcohol']

clf.fit(df_train[cols], df_train.quality)

请注意,我将决策树分类器的最大深度(max_depth)设为3。该模型的所有其他参数均保持默认值。现在,我们在训练集和测试集上测试该模型的准确性:

train_predictions = clf.predict(df_train[cols])

test_predictions = clf.predict(df_test[cols])

train_accuracy = metrics.accuracy_score(
    df_train.quality, train_predictions
)

test_accuracy = metrics.accuracy_score(
    df_test.quality, test_predictions
)

训练和测试的准确率分别为58.9%和54.25%。现在,我们将最大深度(max_depth)增加到7,并重复上述过程。这样,训练准确率为76.6%,测试准确率为57.3%。在这里,我们使用准确率,主要是因为它是最直接的指标。对于这个问题来说,它可能不是最好的指标。我们可以根据最大深度(max_depth)的不同值来计算这些准确率,并绘制曲线图。

from sklearn import tree
from sklearn import metrics 
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
matplotlib.rc('xtick', labelsize=20)
matplotlib.rc('ytick', labelsize=20)
%matplotlib inline
train_accuracies = [0.5]
test_accuracies = [0.5]
for depth in range(1, 25):
    clf = tree.DecisionTreeClassifier(max_depth=depth)
    cols = [
        'fixed acidity',
        'volatile acidity',
        'citric acid',
        'residual sugar',
        'chlorides',
        'free sulfur dioxide',
        'total sulfur dioxide',
        'density',
        'pH',
        'sulphates',
        'alcohol'
    ]
    clf.fit(df_train[cols], df_train.quality)
    train_predictions = clf.predict(df_train[cols]) 
    test_predictions = clf.predict(df_test[cols])
    
    train_accuracy = metrics.accuracy_score(
        df_train.quality, train_predictions
    )
    test_accuracy = metrics.accuracy_score(
        df_test.quality, test_predictions
    )
    train_accuracies.append(train_accuracy)
    test_accuracies.append(test_accuracy)
    
plt.figure(figsize=(10, 5)) 
sns.set_style("whitegrid")
plt.plot(train_accuracies, label="train accuracy")
plt.plot(test_accuracies, label="test accuracy")
plt.legend(loc="upper left", prop={'size': 15})
plt.xticks(range(0, 26, 5))
plt.xlabel("max_depth", size=20)
plt.ylabel("accuracy", size=20)
plt.show()

这将生成如图 2 所示的曲线图。
请添加图片描述

图 2:不同 max_depth 训练和测试准确率。

我们可以看到,当最大深度(max_depth)的值为14时,测试数据的得分最高。随着我们不断增加这个参数的值,测试准确率会保持不变或变差,但训练准确率会不断提高。这说明,随着最大深度(max_depth)的增加,决策树模型对训练数据的学习效果越来越好,但测试数据的性能却丝毫没有提高。

这就是所谓的过拟合

模型在训练集上完全拟合,而在测试集上却表现不佳。这意味着模型可以很好地学习训练数据,但无法泛化到未见过的样本上。在上面的数据集中,我们可以建立一个最大深度(max_depth)非常高的模型,它在训练数据上会有出色的结果,但这种模型并不实用,因为它在真实世界的样本或实时数据上不会提供类似的结果。

有人可能会说,这种方法并没有过拟合,因为测试集的准确率基本保持不变。过拟合的另一个定义是,当我们不断提高训练损失时,测试损失也在增加。这种情况在神经网络中非常常见。

每当我们训练一个神经网络时,都必须在训练期间监控训练集和测试集的损失。如果我们有一个非常大的网络来处理一个非常小的数据集(即样本数非常少),我们就会观察到,随着我们不断训练,训练集和测试集的损失都会减少。但是,在某个时刻,测试损失会达到最小值,之后,即使训练损失进一步减少,测试损失也会开始增加。我们必须在验证损失达到最小值时停止训练。

这是对过拟合最常见的解释

奥卡姆剃刀用简单的话说,就是不要试图把可以用简单得多的方法解决的事情复杂化。换句话说,最简单的解决方案就是最具通用性的解决方案。一般来说,只要你的模型不符合奥卡姆剃刀原则,就很可能是过拟合。

请添加图片描述

图 3:过拟合的最一般定义

现在我们可以回到交叉检验。

在解释过拟合时,我决定将数据分为两部分。我在其中一部分上训练模型,然后在另一部分上检查其性能。这也是交叉检验的一种,通常被称为 “暂留集”(hold-out set)。当我们拥有大量数据,而模型推理是一个耗时的过程时,我们就会使用这种(交叉)验证。

交叉检验有许多不同的方法,它是建立一个良好的机器学习模型的最关键步骤。选择正确的交叉检验取决于所处理的数据集,在一个数据集上适用的交叉检验也可能不适用于其他数据集。不过,有几种类型的交叉检验技术最为流行和广泛使用。

其中包括:

  • k折交叉检验
  • 分层k折交叉检验
  • 暂留交叉检验
  • 留一交叉检验
  • 分组k折交叉检验

交叉检验是将训练数据分层几个部分,我们在其中一部分上训练模型,然后在其余部分上进行测试。请看图4。
请添加图片描述

图 4:将数据集拆分为训练集和验证集

图 4 和图 5 说明,当你得到一个数据集来构建机器学习模型时,你会把它们分成两个不同的集:训练集和验证集。很多人还会将其分成第三组,称之为测试集。不过,我们将只使用两个集。如你所见,我们将样本和与之相关的目标进行了划分。我们可以将数据分为 k 个互不关联的不同集合。这就是所谓的 k 折交叉检验
请添加图片描述

图 5:K 折交叉检验

我们可以使用scikit-learn中的KFold将任何数据分割成k个相等的部分。每个样本分配一个从0到k-1的值。

import pandas as pd
from sklearn import model_selection

if __name__ == "__main__":
    df = pd.read_csv("train.csv")
    df["kfold"] = -1
    df = df.sample(frac=1).reset_index(drop=True)
    kf = model_selection.KFold(n_splits=5)
    for fold, (trn_, val_) in enumerate(kf.split(X=df)): 
        df.loc[val_, 'kfold'] = fold
        df.to_csv("train_folds.csv", index=False)

几乎所有类型的数据集都可以使用此流程。例如,当数据图像时,您可以创建一个包含图像 ID、图像位置和图像标签的 CSV,然后使用上述流程。

另一种重要的交叉检验类型是分层k折交叉检验。如果你有一个偏斜的二元分类数据集,其中正样本占 90%,负样本只占 10%,那么你就不应该使用随机 k 折交叉。对这样的数据集使用简单的k折交叉检验可能会导致折叠样本全部为负样本。在这种情况下,我们更倾向于使用分层 k 折交叉检验。分层 k 折交叉检验可以保持每个折中标签的比例不变。因此,在每个折叠中,都会有相同的 90% 正样本和 10% 负样本。因此,无论您选择什么指标进行评估,都会在所有折叠中得到相似的结果。

修改创建 k 折交叉检验的代码以创建分层 k 折交叉检验也很容易。我们只需将 model_selection.KFold更改为 model_selection.StratifiedKFold ,并在 kf.split(…) 函数中指定要分层的目标列。我们假设 CSV 数据集有一列名为 “target” ,并且是一个分类问题。

import pandas as pd
from sklearn import model_selection 
if __name__ == "__main__":
    df = pd.read_csv("train.csv")
    df["kfold"] = -1
    df = df.sample(frac=1).reset_index(drop=True)
    y = df.target.values
    kf = model_selection.StratifiedKFold(n_splits=5)
    for f, (t_, v_) in enumerate(kf.split(X=df, y=y)): 
        df.loc[v_, 'kfold'] = f
        df.to_csv("train_folds.csv", index=False)

对于葡萄酒数据集,我们来看看标签的分布情况。

b = sns.countplot(x='quality', data=df)
b.set_xlabel("quality", fontsize=20) 
b.set_ylabel("count", fontsize=20)

请注意,我们继续上面的代码。因此,我们已经转换了目标值。从图 6 中我们可以看出,质量偏差很大。有些类别有很多样本,有些则没有那么多。如果我们进行简单的k折交叉检验,那么每个折叠中的目标值分布都不会相同。因此,在这种情况下,我们选择分层 k 折交叉检验。
请添加图片描述

图 6:葡萄酒数据集中 "质量" 分布情况

规则很简单,如果是标准分类问题,就盲目选择分层k折交叉检验。

但如果数据量很大,该怎么办呢?假设我们有 100 万个样本。5 倍交叉检验意味着在 800k 个样本上进行训练,在 200k 个样本上进行验证。根据我们选择的算法,对于这样规模的数据集来说,训练甚至验证都可能非常昂贵。在这种情况下,我们可以选择暂留交叉检验

创建保持结果的过程与分层 k 折交叉检验相同。对于拥有 100 万个样本的数据集,我们可以创建 10 个折叠而不是 5 个,并保留其中一个折叠作为保留样本。这意味着,我们将有 10 万个样本被保留下来,我们将始终在这个样本集上计算损失、准确率和其他指标,并在 90 万个样本上进行训练。

在处理时间序列数据时,暂留交叉检验也非常常用。假设我们要解决的问题是预测一家商店 2020 年的销售额,而我们得到的是 2015-2019 年的所有数据。在这种情况下,你可以选择 2019 年的所有数据作为保留数据,然后在 2015 年至 2018 年的所有数据上训练你的模型。
请添加图片描述

图 7:时间序列数据示例

在图 7 所示的示例中,假设我们的任务是预测从时间步骤 31 到 40 的销售额。我们可以保留 21 至 30 步的数据,然后从 0 步到 20 步训练模型。需要注意的是,在预测 31 步至 40 步时,应将 21 步至 30 步的数据纳入模型,否则,模型的性能将大打折扣。

在很多情况下,我们必须处理小型数据集,而创建大型验证集意味着模型学习会丢失大量数据。在这种情况下,我们可以选择留一交叉检验,相当于特殊的 k 则交叉检验其中 k=N ,N 是数据集中的样本数。这意味着在所有的训练折叠中,我们将对除 1 之外的所有数据样本进行训练。这种类型的交叉检验的折叠数与数据集中的样本数相同。

需要注意的是,如果模型的速度不够快,这种类型的交叉检验可能会耗费大量时间,但由于这种交叉检验只适用于小型数据集,因此并不重要。

现在我们可以转向回归问题了。回归问题的好处在于,除了分层 k 折交叉检验之外,我们可以在回归问题上使用上述所有交叉检验技术。也就是说,我们不能直接使用分层 k 折交叉检验,但有一些方法可以稍稍改变问题,从而在回归问题中使用分层 k 折交叉检验。大多数情况下,简单的 k 折交叉检验适用于任何回归问题。但是,如果发现目标分布不一致,就可以使用分层 k 折交叉检验。

要在回归问题中使用分层 k 折交叉检验,我们必须先将目标划分为若干个分层,然后再以处理分类问题的相同方式使用分层 k 折交叉检验。选择合适的分层数有几种选择。如果样本量很大(> 10k,> 100k),那么就不需要考虑分层的数量。只需将数据分为 10 或 20层即可。如果样本数不多,则可以使用 Sturge’s Rule 这样的简单规则来计算适当的分层数。

Sturge’s Rule:
N u m b e r o f B i n s = 1 + l o g 2 ( N ) Number of Bins = 1 + log_2(N) NumberofBins=1+log2(N)
其中 N N N 是数据集中的样本数。该函数如图8所示。
请添加图片描述

图 8:利用斯特格法则绘制样本与箱数对比图

让我们制作一个回归数据集样本,并尝试应用分层 k 折交叉检验,如下面的 python 代码段所示。

import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn import model_selection

def create_folds(data):
    data["kfold"] = -1
    data = data.sample(frac=1).reset_index(drop=True)
    
    num_bins = int(np.floor(1 + np.log2(len(data)))) 
    data.loc[:, "bins"] = pd.cut(
        data["target"], bins=num_bins, labels=False 
    )
    kf = model_selection.StratifiedKFold(n_splits=5)
    for f, (t_, v_) in enumerate(kf.split(X=data, y=data.bins.values)): 
        data.loc[v_, 'kfold'] = f
        data = data.drop("bins", axis=1) 
    return data

if __name__ == "__main__":
    X, y = datasets.make_regression(
        n_samples=15000, n_features=100, n_targets=1 
    )
df = pd.DataFrame(
    X,
    columns=[f"f_{i}" for i in range(X.shape[1])] 
)
df.loc[:, "target"] = y 
df = create_folds(df)

交叉检验是构建机器学习模型的第一步,也是最基本的一步。如果要做特征工程,首先要拆分数据。如果要建立模型,首先要拆分数据。如果你有一个好的交叉检验方案,其中验证数据能够代表训练数据和真实世界的数据,那么你就能建立一个具有高度通用性的好的机器学习模型。

本章介绍的交叉检验类型几乎适用于所有机器学习问题。不过,你必须记住,交叉检验也在很大程度上取决于数据,你可能需要根据你的问题和数据采用新的交叉检验形式。

例如,假设我们有一个问题,希望建立一个模型,从患者的皮肤图像中检测出皮肤癌。我们的任务是建立一个二元分类器,该分类器接收输入图像并预测其良性或恶性的概率。

在这类数据集中,训练数据集中可能有同一患者的多张图像。因此,要在这里建立一个良好的交叉检验系统,必须有分层的 k 折交叉检验,但也必须确保训练数据中的患者不会出现在验证数据中。幸运的是,scikit-learn 提供了一种称为 GroupKFold 的交叉检验类型。 在这里,患者可以被视为组。 但遗憾的是,scikit-learn 无法将 GroupKFold 与 StratifiedKFold 结合起来。所以你需要自己动手。我把它作为一个练习留给读者的练习。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI 绘画Stable Diffusion 研究(十五)SD Embedding详解

大家好,我是风雨无阻。 本期内容: Embedding是什么?Embedding有什么作用?Embedding如何下载安装?如何使用Embedding? 大家还记得 AI 绘画Stable Diffusion 研究(七) 一文读懂 Stab…

5分钟看懂物料清单(BOM)的用途、类型及管理

管理物料可以提高制造和供应链流程的效率,例如生产、物流、调度、产品成本核算和库存计划。企业通常使用物料清单作为制造产品的组件、材料和流程的中央记录。 物料清单(BOM)是构建、制造或维修产品或服务所需的原材料、组件和说明的详细列表…

Linux线程控制

目录 一、线程的简单控制 1.多线程并行 2.线程结束 3.线程等待 (1)系统调用 (2)返回值 4.线程取消 5.线程分离 二、C多线程小组件 三、线程库TCB 1.tid 2.局部储存 一、线程的简单控制 1.多线程并行 我们之前学过pt…

代码随想录笔记--哈希表篇

目录 1--有效的字母异位词 2--两个数组的交集 3--两数之和 4--四数相加II 5--三数之和 6--四数之和 1--有效的字母异位词 利用哈希表存储每个字母的出现次数&#xff0c;比较两个字符串各个字母出现次数是否相等即可&#xff1b; #include <iostream> #include <…

QT基础教程之七Qt消息机制和事件

QT基础教程之七Qt消息机制和事件 事件 事件&#xff08;event&#xff09;是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘&#xff0c;或者是窗口需要重新绘制的时候&#xff0c;都会发出一个相应的事件。一些事件在对用户操作做出响应时发出&#xff0c…

CRM通过哪四个特点赢得不同类型的客户

1.设置正确的目标 首先&#xff0c;在CRM系统中设置正确的目标是非常重要的。不同类型的客户有不同的需求和预期&#xff0c;需要使用不同的方法去处理。如果企业想吸引新客户&#xff0c;那么企业需要更加侧重于建立品牌形象和提供相关的信息。如果企业想留住老客户&#xff…

Socks5代理 vs. Socks4代理:特点和区别解析

在网络通信中&#xff0c;使用代理服务器可以提供更安全、匿名的连接。其中&#xff0c;Socks5和Socks4是两种常见的代理协议。本文将深入探讨它们之间的特点和区别&#xff0c;帮助您选择适合自己需求的代理类型。 1.特点概述 -Socks5&#xff08;Socket Secure 5&#xff0…

MP中的字段还可以利用函数来查询拼接sql

//根据value查询GetMapping("getTest")public List<HashMap> getTest() {QueryWrapper<TTest> queryWrapper new QueryWrapper<>();queryWrapper.eq("substr(name,1,2)","99999");List<TTest> list1 testService.list…

Linux网络编程:线程池并发服务器 _UDP客户端和服务器_本地和网络套接字

文章目录&#xff1a; 一&#xff1a;线程池模块分析 threadpool.c 二&#xff1a;UDP通信 1.TCP通信和UDP通信各自的优缺点 2.UDP实现的C/S模型 server.c client.c 三&#xff1a;套接字 1.本地套接字 2.本地套 和 网络套对比 server.c client.c 一&#xff1a;线…

ogg怎么转mp3格式?让我们一起来学习吧

ogg怎么转mp3格式&#xff1f;如今&#xff0c;有许多种音频格式可供选择&#xff0c;其中包括了很多小伙伴可能并不熟悉的OGG音频格式。OGG的全称是OGG Vorbis&#xff0c;它是一种免费开放且没有使用限制的音频格式&#xff0c;因此备受许多小伙伴的喜爱。然而&#xff0c;OG…

打破数据孤岛,实现文档数据互通

随着数字经济加速发展&#xff0c;企业数字化转型正向更深层次推进。非结构化数据量也正在飞速增长&#xff0c;这些数据以文档、图片、音频等形式散落在组织内部&#xff0c;这给数据的整理和统一利用增加了难度。由于部门、应用、框架、多云环境等原因形成非结构化数据孤岛。…

【React源码实现】元素渲染的实现原理

前言 本文将结合React的设计思想来实现元素的渲染&#xff0c;即通过JSX语法的方式是如何创建为真实dom渲染到页面上&#xff0c;本文基本不涉及React的源码&#xff0c;但与React的实现思路是一致的&#xff0c;所以非常适合小白学习&#xff0c;建议跟着步骤敲代码&#xff…

csp认证真题——重复局面——Java题解

目录 题目背景 问题描述 输入格式 输出格式 样例输入 样例输出 样例说明 子任务 提示 【思路解析】 【代码实现】 题目背景 国际象棋在对局时&#xff0c;同一局面连续或间断出现3次或3次以上&#xff0c;可由任意一方提出和棋。 问题描述 国际象棋每一个局面可以…

01JVM_内存结构

一、什么是JVM 1.JVM的定义 Java程序的运行环境&#xff0c;java二进制字节码的运行环境 2.JVM的好处 ①一次编写&#xff0c;到处运行 ②自动内存管理&#xff0c;垃圾回收功能 ③数组下标越界检查 ④多态 3.jvm&#xff0c;jre&#xff0c;jdk的比较 3.常见的JVM 主…

Mac下Docker Desktop安装命令行工具、开启本地远程访问

Mac系统下&#xff0c;为了方便在terminal和idea里使用docker&#xff0c;需要安装docker命令行工具&#xff0c;和开启Docker Desktop本地远程访问。 具体方法是在设置-高级下&#xff0c; 1.将勾选的User调整为System&#xff0c;这样不用手动配置PATH即可使用docker命令 …

说说我最近筛简历和面试的感受。。

大家好&#xff0c;我是鱼皮。 都说现在行情不好、找工作难&#xff0c;但招人又谈何容易&#xff1f;&#xff01; 最近我们公司在招开发&#xff0c;实习社招都有。我收到的简历很多&#xff0c;但认真投递的、符合要求的却寥寥无几&#xff0c;而且都是我自己看简历、选人…

对于uts namespace共享的测试

前言 单单以下列命令运行虽然是root&#xff0c;还不行&#xff0c;我们需要加--privileged&#xff0c;不然会报 hostname: you must be root to change the host name docker run -it --utshost ubuntu:latest /bin/bash 如果加上--privileged后 docker run -it --priv…

基于AI智能分析网关EasyCVR视频汇聚平台关于能源行业一体化监控平台可实施应用方案

随着数字经济时代的到来&#xff0c;实体经济和数字技术深度融合已成为经济发展的主流思路。传统能源行业在运营管理方面也迎来了新的考验和机遇。许多大型能源企业已开始抓住机遇&#xff0c;逐步将视频监控、云计算、大数据和人工智能技术广泛应用于生产、维护、运输、配送等…

hp惠普光影精灵5笔记本HP Pavilion Gaming-15-dk0135tx原装出厂Win10系统

原厂系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、惠普电脑管家等预装程序 适用型号&#xff1a; 15-dk0011tx,15-dk0018tx,15-dk0019tx,15-dk0020tx,15-dk0021tx,15-dk0038tx 15-dk0039tx,15-dk0040tx,15-dk0041tx,15-dk0125tx,15-dk0126tx,15-dk0127tx 15-dk012…

排序 Bubble Sort(提取函数)

C自学精简教程 目录(必读) 1 前驱知识点 3.5 for循环语句 3.6 if语句 3.7 函数 3.8 动态内存 2 排序 是将元素按照从小到大的顺序存放的方法。 一开始元素可能并不是按照从小到大的顺序存放的。 这时候我们需要找到需要调整的元素对&#xff0c;并交换这两个元素的值&…