You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过循环用70栋房屋多房间氡气时序数据持续训练单LSTM模型

用多房屋多房间数据持续训练单个LSTM模型(氡气时间序列预测)

需求实现说明

已基于单房屋单房间的年度氡气时间序列训练了LSTM模型,现在要利用70栋房屋(每栋4个房间)的数据持续训练同一个模型,而非训练多个独立模型。核心思路是初始化一次模型后,循环遍历所有目标房屋的房间数据,逐步更新模型权重。

修改后的完整代码

import pandas as pd
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import InputLayer, LSTM, Dense
from tensorflow.keras.callbacks import ModelCheckpoint
from tensorflow.keras.losses import MeanSquaredError
from tensorflow.keras.metrics import RootMeanSquaredError
from tensorflow.keras.optimizers import Adam

# 生成100栋房屋×4个房间的合成氡气时间序列数据
df = pd.DataFrame()
# 生成2020年全年小时级时间序列
df['date_time'] = pd.date_range(start='2020-01-01', end='2020-12-31', freq='H')
# 生成100个房屋ID(格式:01TE85到100TE85)
house_ids = [f"{str(i).zfill(2)}TE85" for i in range(1, 101)]
df['house'] = np.random.choice(house_ids, size=len(df))
# 4个固定房间类型
room_types = ['Living room', 'Bedroom', 'Kitchen', 'Bathroom']
df['room'] = np.random.choice(room_types, size=len(df))
# 生成氡气短期平均值(正态分布)
df['radon_short_term_avg'] = np.random.normal(loc=0.5, scale=0.1, size=len(df)) 

# 转换时间格式并设置为索引
df['date_time'] = pd.to_datetime(df['date_time'], format='%Y-%m-%d %H:%M:%S')
df = df.set_index('date_time')

# 定义函数:将时间序列转换为LSTM输入格式(滑动窗口)
# 输入:时间序列数据,窗口大小;输出:X(样本数,窗口大小,特征数),y(样本数,1)
def df_to_X_y(series, window_size):
    series_np = series.to_numpy()
    X, y = [], []
    for i in range(len(series_np) - window_size):
        # 提取窗口内的序列,保持(窗口大小,1)的维度
        window = [[val] for val in series_np[i:i+window_size]]
        X.append(window)
        # 窗口下一个时刻的值作为标签
        y.append(series_np[i+window_size])
    return np.array(X), np.array(y)

# 配置参数
WINDOW_SIZE = 5  # 用过去5小时数据预测下1小时
TRAIN_HOUSE_COUNT = 70  # 用于持续训练的房屋数量
EPOCHS_PER_ROOM = 2  # 每个房间数据训练的轮数(可根据需求调整)

# ---------------------- 初始化并编译LSTM模型 ----------------------
# 仅初始化一次,后续所有房屋/房间数据复用该模型
model = Sequential()
model.add(InputLayer((WINDOW_SIZE, 1)))  # 输入维度:(窗口大小, 特征数)
model.add(LSTM(64, activation='relu'))  # LSTM层,64个神经元
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='linear'))  # 回归任务,输出预测值

# 模型配置
checkpoint = ModelCheckpoint('best_radon_model/', save_best_only=True)
model.compile(
    loss=MeanSquaredError(),
    optimizer=Adam(learning_rate=0.0001),
    metrics=[RootMeanSquaredError()]
)
model.summary()

# ---------------------- 循环遍历70栋房屋的每个房间,持续训练模型 ----------------------
# 取前70栋房屋的ID
train_house_ids = house_ids[:TRAIN_HOUSE_COUNT]

for house_id in train_house_ids:
    print(f"\n===== 开始训练房屋 {house_id} 的数据 =====")
    for room in room_types:
        print(f"--- 处理房间:{room} ---")
        # 提取当前房屋当前房间的氡气数据
        room_data = df[(df['house'] == house_id) & (df['room'] == room)]['radon_short_term_avg']
        
        # 跳过数据量不足的房间(无法生成至少1组训练样本)
        if len(room_data) <= WINDOW_SIZE:
            print(f"房间 {room} 数据量不足,跳过")
            continue
        
        # 生成训练用的序列数据
        X, y = df_to_X_y(room_data, WINDOW_SIZE)
        
        # 拆分训练集和验证集(8:2比例)
        split_idx = int(len(X) * 0.8)
        X_train, y_train = X[:split_idx], y[:split_idx]
        X_val, y_val = X[split_idx:], y[split_idx:]
        
        # 持续训练模型:基于已有权重继续更新,而非重新训练
        model.fit(
            X_train, y_train,
            validation_data=(X_val, y_val),
            epochs=EPOCHS_PER_ROOM,
            callbacks=[checkpoint],
            verbose=1
        )

print("\n===== 所有房屋数据训练完成 =====")

关键改动说明

  1. 模型复用:仅初始化和编译一次LSTM模型,所有房屋/房间的数据都用来更新同一个模型的权重,避免训练多个独立模型。
  2. 批量遍历逻辑:循环遍历前70栋房屋的每个房间,逐个处理数据,确保所有样本都参与模型训练。
  3. 数据有效性检查:跳过数据量不足的房间,避免生成无效的训练样本。
  4. 增量训练:每次调用model.fit()时,模型会在之前训练的权重基础上继续优化,逐步学习所有房屋的氡气时间序列模式。

内容的提问来源于stack exchange,提问作者HCAI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:35:26