时间序列预测 — CNN-LSTM-Attention实现多变量负荷预测(Tensorflow):多变量滚动

news2024/11/15 8:26:20

   专栏链接:https://blog.csdn.net/qq_41921826/category_12495091.html

专栏内容

​ 所有文章提供源代码、数据集、效果可视化

​ 文章多次上领域内容榜、每日必看榜单、全站综合热榜

时间序列预测存在的问题

 现有的大量方法没有真正的预测未来值,只是用历史数据做验证

​ 利用时间序列分解算法存在信息泄露的问题:有人用emd+lstm对时间序列进行预测,是否存在原理上的问题? - 知乎


目录

1 数据处理

1.1 导入库文件

1.2 导入数据集

​1.3 缺失值分析

​2 构造训练数据

3 CNN_LSTM-Attention模型训练

3.1 CNN_LSTM模型 

3.2 搭建Attention模型

3.3 搭建CNN_LSTM-Attention模型

4 CNN_LSTM-Attention模型预测

4.1 分量预测

4.2 可视化


1 数据处理

1.1 导入库文件

import scipy
import pandas as pd
import numpy as np
import math
import datetime
from matplotlib import pyplot as plt

# 导入深度学习框架tensorflow
import tensorflow as tf    
from tensorflow import keras 
from tensorflow.keras import Sequential, layers, callbacks
from tensorflow.keras.layers import Input, Reshape,Conv2D, MaxPooling2D, LSTM, Dense, Dropout, Flatten, Reshape, TimeDistributed
from keras import backend as K

from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error, mean_absolute_percentage_error 
plt.rcParams['font.sans-serif'] = ['SimHei']     # 显示中文
plt.rcParams['axes.unicode_minus'] = False  # 显示负号
plt.rcParams.update({'font.size':18})  #统一字体字号

1.2 导入数据集

实验数据集采用数据集6:澳大利亚电力负荷与价格预测数据(下载链接),包括数据集包括日期、小时、干球温度、露点温度、湿球温度、湿度、电价、电力负荷特征,时间间隔30min。

# 导入数据
data_raw = pd.read_excel("澳大利亚电力负荷与价格预测数据.xlsx")
data_raw = data_raw[-365*24*6-49:-1].reset_index(drop=True)
data_raw

​对数据进行可视化

from itertools import cycle
# 可视化数据
def visualize_data(data, row, col):
    cycol = cycle('bgrcmk')
    cols = list(data.columns)
    fig, axes = plt.subplots(row, col, figsize=(16, 4))
    fig.tight_layout()
    if row == 1 and col == 1:  # 处理只有1行1列的情况
        axes = [axes]  # 转换为列表,方便统一处理
    for i, ax in enumerate(axes.flat):
        if i < len(cols):
            ax.plot(data.iloc[:,i], c=next(cycol))
            ax.set_title(cols[i])
        else:
            ax.axis('off')  # 如果数据列数小于子图数量,关闭多余的子图
    plt.subplots_adjust(hspace=0.6)
    plt.show()

visualize_data(data_raw.iloc[:,2:], 2, 3)

单独查看部分负荷数据。

# 预测结果可视化
plt.figure(dpi=100, figsize=(14, 4))
plt.plot(data_raw['电力负荷'], markevery=5)
plt.xlabel('时间')
plt.ylabel('负荷')
plt.show()

​1.3 缺失值分析

首先查看数据的信息,发现并没有缺失值

data_raw.info()

​进一步统计缺失值

data_raw.isnull().sum()

​2 构造训练数据

构造数据前先将数据变为数值类型

data = data_raw.iloc[:-48*8,2:].values

构造训练数据,也是真正预测未来的关键。首先设置预测的timesteps时间步、predict_steps预测的步长(预测的步长应该比总的预测步长小),length总的预测步长,参数可以根据需要更改。

timesteps = 48*7 #构造x,为48*7个数据,表示每次用前48*7个数据作为一段
predict_steps = 4 #构造y,为4个数据,表示用后4个数据作为一段
length = 48  #预测多步,预测48个数据
feature_num = 6 #特征的数量

通过前timesteps行历史数据预测后面predict_steps个数据,需要对数据集进行滚动划分(也就是前timesteps行的数据和后predict_steps行的数据训练,后面预测时就可通过timesteps行数据预测未来的predict_steps行数据)。这里需要注意的是,因为是多变量滚动预测多变量,特征就是标签(例如,前5行[干球温度、露点温度、湿球温度、电价、电力负荷]预测第6行[干球温度、露点温度、湿球温度、电价、电力负荷],划分数据集时,就用前5行当做train_x,第6行作为train_y,此时的train_y有多列,而不是只有1列)。

# 构造数据集,用于真正预测未来数据
# 整体的思路也就是,前面通过前timesteps个数据训练后面的predict_steps个未来数据
# 预测时取出前timesteps个数据预测未来的predict_steps个未来数据。
def create_dataset(datasetx, datasety=None, timesteps=96*7, predict_size=12):
    datax = []  # 构造x
    datay = []  # 构造y
    for each in range(len(datasetx) - timesteps - predict_size):
        x = datasetx[each:each + timesteps]
        # 判断是否是单变量分解还是多变量分解
        if datasety is not None:
            y = datasety[each + timesteps:each + timesteps + predict_size]
        else:
            y = datasetx[each + timesteps:each + timesteps + predict_size]
        datax.append(x)
        datay.append(y)
    return datax, datay

​​数据处理前,需要对数据进行归一化,按照上面的方法划分数据,这里返回划分的数据和归一化模型(单变量和多变量的归一化不同,多变量归一化需要将X和Y分开归一化,不然会出现信息泄露的问题),此时的归一化是相当于是单变量归一化,函数的定义如下:

# 数据归一化操作
def data_scaler(datax, datay=None, timesteps=36, predict_steps=6):
    # 数据归一化操作
    scaler1 = MinMaxScaler(feature_range=(0, 1))   
    datax = scaler1.fit_transform(datax)
    # 用前面的数据进行训练,留最后的数据进行预测
    # 判断是否是单变量分解还是多变量分解
    if datay is not None:
        scaler2 = MinMaxScaler(feature_range=(0, 1))
        datay = scaler2.fit_transform(datay)
        trainx, trainy = create_dataset(datax, datay, timesteps, predict_steps)
        trainx = np.array(trainx)
        trainy = np.array(trainy)
        return trainx, trainy, scaler1, scaler2
    else:
        trainx, trainy = create_dataset(datax, timesteps=timesteps, predict_size=predict_steps)
        trainx = np.array(trainx)
        trainy = np.array(trainy)
        return trainx, trainy, scaler1, None

然后分解的数据进行划分和归一化。

trainx, trainy, scalerx, scalery = data_scaler(data.reshape(-1, 1), timesteps=timesteps, predict_steps=predict_steps)

3 CNN_LSTM-Attention模型训练

3.1 CNN_LSTM模型 

CNN-LSTM 是一种结合了 CNN 特征提取能力与 LSTM 对时间序列长期记忆能力的混合神经网络。

CNN 主要由四个层级组成, 分别为输入层、 卷积层、 激活层(Relu 函数)和池化层。 每一层都会将数据处理之后送到下一层, 其中最重要的是卷积层, 这个层级起到的作用是将特征数据进行卷积计算, 将计算好的结果传到激活层, 激活函数对数据进行筛选。最后一层是 LSTM 层, 这一层是根据 CNN 处理后的特征数据,对其模型进行进一步的维度修偏, 权重修正等工作, 为下一步输出精度较高的预测值做好准备, 在 LSTM 训练的过程中, 由于其神经网络内部包括了输入、 遗忘和输出门, 通常的做法是通过增减遗忘门和输入门的个数, 来控制算法的精度。
 

来源:基于改进的 CNN-LSTM 短期风功率预测方法研究

对于输入到 CNN-LSTM 的数据,首先,经过 CNN 的卷积层对局部特征进行提取,将提取后的特征向量传递到池化层进行特征向量的下采样和数据体量的压缩。然后,将经过卷积层和池化层处理后的特征向量经过一个扁平层转化成一维向量输入到 LSTM 中, 每一层 LSTM 后加一个随机失活层以防止模型过拟合。

3.2 搭建Attention模型

参考文章:https://www.cnblogs.com/jiangxinyang/p/9367497.html

(1) Attention思想

深度学习里的Attention model其实模拟的是人脑的注意力模型,举个例子来说,当我们观赏一幅画时,虽然我们可以看到整幅画的全貌,但是在我们深入仔细地观察时,其实眼睛聚焦的就只有很小的一块,这个时候人的大脑主要关注在这一小块图案上,也就是说这个时候人脑对整幅图的关注并不是均衡的,是有一定的权重区分的。这就是深度学习里的Attention Model的核心思想。

(2) Encoder-Decoder框架

所谓encoder-decoder模型,又叫做编码-解码模型。这是一种应用于seq2seq问题的模型。seq2seq问题简单的说,就是根据一个输入序列x,来生成另一个输出序列y。Encoder-Decoder模型中的编码,就是将输入序列转化成一个固定长度的向量;解码,就是将之前生成的固定向量再转化成输出序列。

Encoder-Decoder(编码-解码)是深度学习中非常常见的一个模型框架,准确的说,Encoder-Decoder并不是一个具体的模型,而是一类框架。Encoder和Decoder部分可以是任意的文字,语音,图像,视频数据,模型可以采用CNN,RNN,BiRNN、LSTM、GRU等等。所以基于Encoder-Decoder,我们可以设计出各种各样的应用算法。

Encoder-Decoder框架可以看作是一种文本处理领域的研究模式,应用场景异常广泛,下图是文本处理领域里常用的Encoder-Decoder框架最抽象的一种表示:

(3) Attention模型 

        在Encoder-Decoder框架中,在预测每一个yi时对应的语义编码c都是一样的,也就意味着序列X中点对输出Y中的每一个点的影响都是相同的。这样就会产生两个弊端:一是语义向量无法完全表示整个序列的信息,再者就是先输入的内容携带的信息会被后输入的信息稀释掉,或者说,被覆盖了。输入序列越长,这个现象就越严重。这就使得在解码的时候一开始就没有获得输入序列足够的信息, 那么解码的准确度自然也就要打个折扣了。

  为了解决上面的弊端,就需要用到我们的Attention Model(注意力模型)来解决该问题。在机器翻译的时候,让生成词不是只能关注全局的语义编码向量c,而是增加了一个“注意力范围”,表示接下来输出词时候要重点关注输入序列中的哪些部分,然后根据关注的区域来产生下一个输出。模型结构如下:

关于模型的更多介绍可以查阅相关文献,下面给出Attention的代码

# CNN_LSTM_Attention模型
from keras.layers import multiply, Permute, RepeatVector, Multiply, Lambda
from keras.models import Model

def attention_function(inputs, single_attention_vector=False):    
    # 获取 inputs 的时间步数和特征维度   
    TimeSteps = K.int_shape(inputs)[1]
    input_dim = K.int_shape(inputs)[2]
 
    a = Permute((2, 1))(inputs)   #将 inputs 的维度进行转置,维度顺序变为 (特征维度, 时间步维度)  
    a = Dense(TimeSteps, activation='softmax')(a)  #经过全连接层
    
     # 如果为 True,单一注意力操作
    if single_attention_vector:
        a = Lambda(lambda x: K.mean(x, axis=1))(a)  #对第二个维度进行求平均,得到单一注意力向量
        a = RepeatVector(input_dim)(a)   # 将单一注意力向量进行复制,使其与 inputs 的维度一致  
         
    a_probs = Permute((2, 1))(a)    # 再次将注意力权重进行转置,维度顺序变为 (时间步维度, 特征维度)  
    output_attention_mul = Multiply()([inputs, a_probs])  # 使用 Multiply 层将 inputs 和注意力权重进行元素级乘法操作
    return output_attention_mul

3.3 搭建CNN_LSTM-Attention模型

首先搭建模型的常规操作,然后使用训练数据trainx和trainy进行训练,进行50个epochs的训练,每个batch包含64个样本(建议使用GPU进行训练,增加epochs)。

def CNN_LSTM_Attention_train(trainx, trainy, timesteps, feature_num, predict_steps):
    # 调用GPU加速
    gpus = tf.config.experimental.list_physical_devices(device_type='GPU')
    for gpu in gpus:
        tf.config.experimental.set_memory_growth(gpu, True)
    
    #搭建cnn模型
    inputs = Input(shape=(timesteps, feature_num))
    reshaped = Reshape((timesteps, feature_num, 1))(inputs)
    conv2d = Conv2D(filters=64, kernel_size=3, strides=1, padding="same", activation="relu")(reshaped)
    maxpool = MaxPooling2D(pool_size=2, strides=1, padding="same")(conv2d)
    dropout = Dropout(0.3)(maxpool)
    reshape2 = Reshape((timesteps, -1))(dropout)
    
    #搭建atttention模型
    attention_out = attention_function(reshape2)
    
    #搭建lstm模型
    lstm1 = LSTM(128, return_sequences=True, dropout=0.2)(attention_out)
    lstm2 = LSTM(128, return_sequences=False, dropout=0.2)(lstm1)  
    repeat_vector = RepeatVector(predict_steps)(lstm2) 
    outputs = TimeDistributed(Dense(feature_num))(repeat_vector)
    model = Model(inputs=inputs, outputs=outputs)
    model.compile(loss="mean_squared_error", optimizer="adam", metrics=['accuracy'])
    print(model.summary())
    model.fit(trainx, trainy, epochs=50, batch_size=128)
 
    return model

然后进行训练,将训练的模型、损失和训练时间保存。

# 模型训练
model = CNN_LSTM_Attention_train(trainx, trainy, timesteps, feature_num, predict_steps)
# 模型保存
model.save('cnn_lstm_attention.h5')

4 CNN_LSTM-Attention模型预测

4.1 分量预测

下面介绍文章中最重要,也是真正没有未来特征的情况下预测未来标签的方法。整体的思路也就是取出预测前48*7行数据预测未来的4行个数据,然后将4行数据添加进历史数据,再预测4行数据,滚动预测。因为每次只预测4行数据,但是我要预测48个数据,所以采用的就是循环预测12次的思路。

# #滚动predict
# #因为每次只能预测4行数据,但是我要预测48行数据,所以采用的就是循环预测的思路。
# #每次预测的4行数据,添加到数据集中充当预测x,然后在预测新的4行y,再添加到预测x列表中,如此往复,最终预测出48行。
def predict_using_LSTM(model, data, timesteps, predict_steps, length, feature_num, scaler):
    # 初始化预测输入和输出
    predict_xlist = np.array(data).reshape(1, timesteps, feature_num) 
    predict_y = np.array([]).reshape(0, feature_num)

    while len(predict_y) < length:
        # 从最新的predict_xlist取出timesteps个数据,预测新的predict_steps个数据
        predictx = predict_xlist[:,-timesteps:,:]

        # 预测新值
        lstm_predict = model.predict(predictx)
        
        # 将新预测出来的predict_steps个数据,加入predict_xlist列表,用于下次预测
        predict_xlist = np.concatenate((predict_xlist, lstm_predict), axis=1)
        
        # 预测的结果y,每次预测的predict_steps个数据,添加进去,直到预测length个为止
        lstm_predict = scaler.inverse_transform(lstm_predict.reshape(-1, feature_num))
        predict_y = np.concatenate((predict_y, lstm_predict), axis=0)
        
    return predict_y

然后对数据进行预测,得到预测结果。

from tensorflow.keras.models import load_model

# 加载模型
model = load_model('CNN_LSTM_Attention.h5')
pre_x = scalerx.transform(data[-48*8:-48])
y_true = data[-48:, -1]
# 预测
y_predict = predict_using_LSTM(model, pre_x, timesteps, predict_steps, length, feature_num, scalerx)

4.2 可视化

对预测的结果进行可视化并计算误差。

# 预测并计算误差和可视化
def error_and_plot(y_true,y_predict):
    # 计算误差
    r2 = r2_score(y_true, y_predict)
    rmse = mean_squared_error(y_true, y_predict, squared=False)
    mae = mean_absolute_error(y_true, y_predict)
    mape = mean_absolute_percentage_error(y_true, y_predict)
    print("r2: %.2f\nrmse: %.2f\nmae: %.2f\nmape: %.2f" % (r2, rmse, mae, mape))
    
    # 预测结果可视化
    cycol = cycle('bgrcmk')
    plt.figure(dpi=100, figsize=(14, 5))
    plt.plot(y_true, c=next(cycol), markevery=5)
    plt.plot(y_predict, c=next(cycol), markevery=5)
    plt.legend(['y_true', 'y_predict'])
    plt.xlabel('时间')
    plt.ylabel('功率(kW)')
    plt.show()   
    
    return 0
error_and_plot(y_true,y_predict[:,-1])

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

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

相关文章

Qt —— 自定义飞机仪表控件(附源码)

示例效果 部署环境 本人亲测版本Vs2017+Qt5.12.4,其他版本应该也可使用。 源码1 qfi_ADI::qfi_ADI( QWidget *parent ) :QGraphicsView ( parent ),m_scene ( nullptr )

持续集成工具Jenkins的使用之安装篇(一)

Jenkins是一个基于Java开发的开源的一种持续集成工具&#xff0c;主要用于环境部署&#xff0c;监控重复性的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。要想使用它&#xff0c;你就必须的先安装&#xff0c;接下来我们就介绍下J…

第一篇【传奇开心果短博文系列】Python的库OpenCV技术点案例示例:cv2常用功能和方法

传奇开心果短博文系列 短博文系列目录Python的库OpenCV技术点案例示例系列 短博文目录一、前言二、常用功能和方法示例三、归纳总结 短博文系列目录 Python的库OpenCV技术点案例示例系列 短博文目录 一、前言 cv2是Python中常用的第三方库&#xff0c;也称为OpenCV库&#…

web3:B站chainlink课程第五课Wsl安装ubuntu虚拟机

坑了我好久。 https://learn.microsoft.com/zh-cn/windows/wsl/install-manual 按照微软给的这个手动安装的方式来&#xff0c;别想在线了&#xff0c;反正来看这个的肯定是直接 wsl --install成功不了的选手。 注意&#xff01; 步骤6别从Microsoft Store 下载&#xff0c;…

Django开发_16_文件上传

一、通过正常网页端文件上传 &#xff08;一&#xff09;前端&#xff1a;html form表单中添加设置 enctype"multipart/form-data" &#xff08;二&#xff09;后端&#xff1a;views.py 获取上传文件对象 upload_filerequest.FILES.get("文件域名称"…

人工智能原理实验4(2)——贝叶斯、决策求解汽车评估数据集

&#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1; 汽车数据集 车子具有 buying,maint,doors,persons,lug_boot and safety六种属性&#xff0c;而车子的好坏分为uncc,ucc,good and vgood四种。 &#x1f9e1;&#x1f9e1;贝叶斯求解&#x1f9e1;&#x1f9e1;…

透明拼接屏在汽车领域的应用

随着科技的进步&#xff0c;透明拼接屏作为一种新型的显示技术&#xff0c;在汽车领域的应用越来越广泛。尼伽小编将围绕透明拼接屏在汽车本身、4S店、展会、工厂等方面的应用进行深入探讨&#xff0c;并展望未来的设计方向。 一、透明拼接屏在汽车本身的应用 车窗显示&#x…

JavaScript基础之JavaScript引入方式

JavaScript引入方式 JavaScript 程序不能独立运行&#xff0c;它需要被嵌入 HTML 中&#xff0c;然后浏览器才能执行 JavaScript 代码。通过 script 标签将 JavaScript 代码引入到 HTML 中&#xff0c;一般以下方式: 外部方式内部方式JavaScript元素事件通过JavaScript伪URL引…

Haar小波下采样模块

论文原址&#xff1a;Haar wavelet downsampling: A simple but effective downsampling module for semantic segmentation - ScienceDirect 原文代码&#xff1a;HWD/HWD.py at main apple1986/HWD (github.com) 介绍 深度卷积神经网络 &#xff08;DCNN&#xff09; 通…

性能优化-HVX 指令介绍

「发表于知乎专栏《移动端算法优化》」 本文主要介绍了 HVX 指令相关的知识&#xff0c;包括 HVX 寄存器相关内容&#xff0c;指令的背景依赖&#xff0c;部分常用 intrinsic HVX 指令。具体指令的详细内容及使用还需阅读 HVX 的指令文档&#xff0c;以及细致的实践操作。 &…

MATLAB - 激光雷达 - 相机联合标定(Lidar-Camera Calibration)

系列文章目录 前言 一、 激光雷达 - 相机标定建立了三维激光雷达点和二维相机数据之间的对应关系&#xff0c;从而将激光雷达和相机输出融合在一起。 激光雷达传感器和相机被广泛用于自动驾驶、机器人和导航等应用中的三维场景重建。激光雷达传感器捕捉环境的三维结构信息&am…

惊了!竟然有上千款小游戏源码,可直接打包H5\微信\抖音,赶紧收藏!

很多人还不知道 Cocos Store 资源商城&#xff0c;它是国内最大的小游戏资源平台。上面有大量免费游戏源码可以下载&#xff0c;比如下图的《赛博朋克》&#xff0c;项目中包含大量模型、贴图&#xff0c;还有游戏源代码&#xff0c;通过Cocos引擎可以直接在浏览器上玩。 本文就…

编程语言MoonBit新增矩阵函数的语法糖

MoonBit更新 1. 新增矩阵函数的语法糖 新增矩阵函数的语法糖&#xff0c;用于方便地定义局部函数和具有模式匹配的匿名函数&#xff1a; fn init {fn boolean_or { // 带有模式匹配的局部函数true, _ > true_, true > true_, _ > false}fn apply(f, x) {f(x)}le…

vConsole 与 Vue中未定义变量而引发的Maximum call stack size exceeded异常问题

一、问题描述 前段时间有个前端小伙伴反馈在打包发布正式环境后调用VantUI的<van-popup>组件显示时&#xff0c;显示空白&#xff0c;并且在控制台看到一个Maximum call stacksize exceeded&#xff08;超出最大调用堆栈大小&#xff09;,而本地开发环境正常&#xff1a…

NOC总线(2)

1. NoC的路由 在NoC交换信息时&#xff0c;需要确定从源节点到目标节点所经过的路径&#xff0c;这时就需要路由算法来确定该路径。路由算法分为静态路由算法和动态路由算法两种。 静态路由算法对于两节点之间的路径是固定的&#xff0c;结构简单&#xff0c;便于硬件实…

mysql 导入数据 1273 - Unknown collation: ‘utf8mb4_0900_ai_ci‘

前言: mysql 导入数据 遇到这个错误 1273 - Unknown collation: utf8mb4_0900_ai_ci 具体原因没有深究 但应该是设计数据库的 字符集类型会出现这个问题 例如: char varchar text..... utf8mb4 类型可以存储表情 在现在这个时代会用很多 以后会用的更多 所以不建议改…

基于LLaMA Factory,单卡3小时训练专属大模型 Agent

大家好&#xff0c;今天给大家带来一篇 Agent 微调实战文章 Agent&#xff08;智能体&#xff09;是当今 LLM&#xff08;大模型&#xff09;应用的热门话题 [1]&#xff0c;通过任务分解&#xff08;task planning&#xff09;、工具调用&#xff08;tool using&#xff09;和…

多维时序 | Matlab实现CNN-GRU-Mutilhead-Attention卷积门控循环单元融合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现CNN-GRU-Mutilhead-Attention卷积门控循环单元融合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现CNN-GRU-Mutilhead-Attention卷积门控循环单元融合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍…

从CNN ,LSTM 到Transformer的综述

前情提要&#xff1a;文本大量参照了以下的博客&#xff0c;本文创作的初衷是为了分享博主自己的学习和理解。对于刚开始接触NLP的同学来说&#xff0c;可以结合唐宇迪老师的B站视频【【NLP精华版教程】强推&#xff01;不愧是的最完整的NLP教程和学习路线图从原理构成开始学&a…

k8s--helm

什么是helm&#xff1f;在没有这个helm之前&#xff0c;deployment service ingress helm的作用 通过打包的方式&#xff0c;把deployment service ingress等打包在一块&#xff0c;一键式的部署服务&#xff0c;类似yum安装 官方提供的一个类似与安装仓库额功能&#xff0c;…