# boiler_running_forecast **Repository Path**: lore/boiler_running_forecast ## Basic Information - **Project Name**: boiler_running_forecast - **Description**: 一个使用Tensorflow框架训练的预测锅炉发电机15秒后运行参数的深度学习模型 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-16 - **Last Updated**: 2025-06-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于深度学习的发电机运行参数预测 ## 1. 摘要 这是机器学习在工业领域的一次探索与实践:基于深度学习的方法、使用Keras和Tensorflow框架,根据发电机历史数据训练模型、预测15秒后的运行参数。结果表明,模型的预测达到了一定的准确度,在相关场景下具有实际意义,同时也表明机器学习在工业领域有较大前景。 ## 2. 背景 机器学习一直是热门,ChatGPT的出现更是让它大火;然而,在同样热门的工业物联网领域,机器学习的应用却很少,这是一个特别的现象。 锅炉发电机一共采集了36个参数,包括有功电量(S6_EPI)和无功电量(S6_UEPI)等2个发电电表数据;其中,空气阀A开度(S6_034)、空气阀B开度(S6_035)、燃气浓度(S6_028) 和 J功率预设(S6_039)是4个可以控制的参数。下面将根据采集数据逐步分析。 ## 3. 数据准备 原始数据是2023-09-04 02:35:37到2023-09-10 23:33:30的21万5千多条数据,这些数据大多数是3秒采集一次。因为各种原因,原始数据存在数据缺失(空值)、数据错误(负数或极大)、密集采集(1秒多条)、或者部分时间段未采集等情形。 ### 3.1 数据清洗 按照下列步骤,将原始数据提取为15秒间隔的有效数据,为后续模型训练做准备。 1. 重复数据清理 删除时间重复的数据,保留相同时间的最后一条 2. 异常数据格式化 小于0的数据设为0,空值用上一条数据的值填充 3. 长间隔数据填充 两条数据采集间隔超过3秒,则隔3秒填充一条数据。插入方式:时间加3秒,有功发电量和无功发电量 按步长线性 叠加,其他数据用上一数据填充 4. 数据提取 按数据先后顺序,间隔 大于等于 15秒 提取一条数据;可能最大时间间隔17s,最小15s(填充数据误差) 5. 数据计算 计算两个数据之间的有功发电量、无功发电量 和 时间间隔,即有功发电量和无功发电量读数转电量 - 数据清洗后215985条原始数据转变为39048条数据, 时间间隔 16和17秒共占比 15%,有功发电量大于6的351条(0.9%),其中有功发电量最大 239(1条);有功发电量出现239的极大异常数据是因为将近半个小时的采集数据丢失,大于6的情况也大多是采集数据缺失的缘故。 ### 3.2 特征分布 在建立模型训练之前,使用 matplotlib 和 seaborn 可视化数据。下图中除了计算功率、有功发电量和无功发电量等存在个别较长的异常数据,其他数据都差别不大。 ![feature](./docs/images/feature.png) - J预设功率 ![01.J预设功率](./docs/images/01.J预设功率.png) - 燃气浓度 ![02.燃气浓度](./docs/images/02.燃气浓度.png) ## 4. 模型训练 将训练数据按70%(27300条)、20%(7800条)、10% 分为 训练数据集、验证数据集和测试数据集等3份数据,进行模型训练与测试。 预测模型是一个向量回归问题,损失函数使用 均方误差(mean_squared_error)、评估指标使用 绝对误差(MAE),优化器使用rmsprop 优化器。 ``` RMSProp 优化器是一种自适应学习率的优化算法,它通过累积各个变量的梯度的平方来动态调整学习率。RMSProp 算法可以有效解决梯度下降算法中常见的振荡和收敛速度过慢的问题 ``` ### 4.1 单变量预测(连接密集网络) 根据历史运行参数,使用Dense密集网络迭代100次 预测15秒后的有功发电量。训练绝对误差 0.8396,评估绝对误差 0.3871 - 模型 ``` # 创建模型 model = tf.keras.models.Sequential([ tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(1), ]) # 编译模型 model.compile(optimizer='rmsprop', loss='mean_squared_error', metrics=['mae']) # 训练模型 model.fit(train_data, train_label, epochs=100) # 评估模型 model.evaluate(verify_data, verify_label) ``` - 结果 ``` Epoch 100/100 854/854 [==============================] - 1s 775us/step - loss: 41.0623 - mae: 0.8396 244/244 [==============================] - 0s 685us/step - loss: 0.2047 - mae: 0.3871 ``` ### 4.2 单变量预测(LSTM循环网络) 根据历史运行参数,使用LSTM循环网络迭代100次 预测15秒后的有功发电量。训练绝对误差 0.9556,评估绝对误差 0.7223 - 模型 ``` # 创建模型 model = tf.keras.models.Sequential([ tf.keras.layers.LSTM(64), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(1, activation='ReLU'), ]) # 编译模型 model.compile(optimizer='rmsprop', loss='mean_squared_error', metrics=['mae']) # 训练模型 model.fit(train_data, train_label, epochs=100) # 评估模型 model.evaluate(verify_data, verify_label) ``` - 结果 ``` Epoch 100/100 854/854 [==============================] - 1s 1ms/step - loss: 4.6540 - mae: 0.9556 244/244 [==============================] - 1s 828us/step - loss: 0.8563 - mae: 0.7223 ``` ### 4.3 多变量预测(连接密集网络) 根据历史运行参数,使用Dense密集网络迭代100次 预测15秒后的空气阀A开度(S6_034)、空气阀B开度(S6_035)、燃气浓度(S6_028) 和 J功率预设(S6_039)等4个控制参数。训练绝对误差 3.1298,评估绝对误差 3.6012 - 模型 ``` # 创建模型 model = tf.keras.models.Sequential([ tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(4), ]) # 编译模型 model.compile(optimizer='rmsprop', loss='mean_squared_error', metrics=['mae']) # 训练模型 model.fit(train_data, train_label, epochs=100) ``` - 结果 ``` Epoch 100/100 854/854 [==============================] - 1s 796us/step - loss: 81.2989 - mae: 3.1298 244/244 [==============================] - 0s 697us/step - loss: 120.6847 - mae: 3.6012 ``` ### 4.4 多变量预测(LSTM循环网络) 根据历史运行参数,使用LSTM循环网络迭代100次 预测15秒后的空气阀A开度(S6_034)、空气阀B开度(S6_035)、燃气浓度(S6_028) 和 J功率预设(S6_039)等4个控制参数。训练绝对误差 9.7179,评估绝对误差 12.6950 - 模型 ``` # 创建模型 model = tf.keras.models.Sequential([ tf.keras.layers.LSTM(64), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(4), ]) # 编译模型 model.compile(optimizer='rmsprop', loss='mean_squared_error', metrics=['mae']) # 训练模型 model.fit(train_data, train_label, epochs=100) # 评估模型 model.evaluate(verify_data, verify_label) ``` - 结果 ``` Epoch 100/100 854/854 [==============================] - 1s 1ms/step - loss: 336.4066 - mae: 9.7179 244/244 [==============================] - 1s 853us/step - loss: 607.1098 - mae: 12.6950 ``` ## 5. 模型评估 在单变量预测时,Dense密集网络的评估绝对误差为 0.3871,误差在0.5以内;在 多变量预测时,Dense密集网络的评估绝对误差为3.6012,因为J预测功率的值在750左右,因此总体误差也较小。 对比Dense密集网络和LSTM循环网络发现,Dense网络的误差小于LSTM网络,可能原因是LSTM使用的时间步长为1,即用当前运行参数这1条数据预测15秒后的数据,如果用前n条数据(比如前五分钟的20条数据)预测,LSTM的表现可能会优于Dense。 上述模型训练未对数据进行标准化处理,损失函数仍然比较大;对数据进行标准化处理后,损失函数会明显减小,评估绝对误差也更小。其中,数据标准化对LSTM网络的影响更为明显。 ## 6. 结论 使用深度学习的方法,预测设备的运行 可以达到一定的准确性;误差在相关的范围内,对设备的生产等有现实的意义。基于模型的预测,来反向控制设备的运行,提高设备稳定性和安全型、提高产线产量,则还需要相关控制策略和程序模块进一步实现。 ## 7. 附录 略