qq_58579963 2024-05-05 02:00 采纳率: 0%
浏览 12
已结题

lstm时间序列共享单车预测,loss值优化,参数优化算法

lstm时间序列,loss值很高
共享单车需求预测
如何优化代码,或者说我思路有问题?
该如何写
数据集
321行,特征字段weekday(0工作日,1非工作日),weather(1晴,2多云),meantemp
最好加上参数优化代码,另有报酬

# 加载数据集
dataset = pd.read_csv("../data/r_ultimate4.csv", parse_dates=['starttime'], index_col=['starttime'])
# 特征数据集
X = dataset.drop(columns=['count'], axis=1)
# 标签数据集
y = dataset['count']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False, random_state=6)
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
X_train = pd.DataFrame(X_train)
X_test = pd.DataFrame(X_test)
# 2 构造特征数据集
def create_dataset(X, y, seq_len=3):
    features = []
    targets = []
    for i in range(0, len(X) - seq_len, 1):
        data = X.iloc[i:i + seq_len]
        label = y.iloc[i + seq_len]
        features.append(data)
        targets.append(label)
    return np.array(features), np.array(targets)
# 构造训练特征数据集
train_dataset, train_labels = create_dataset(X_train, y_train, seq_len=3)
# 构造测试特征数据集
test_dataset, test_labels = create_dataset(X_test, y_test, seq_len=3)
# print(train_dataset.shape)
# print(train_labels.shape)
# 构造批数据
def create_batch_dataset(X, y, train=True, buffer_size=100, batch_size=32):
    batch_data = tf.data.Dataset.from_tensor_slices((tf.constant(X), tf.constant(y)))  # 数据封装,tensor类型
    if train:  # 训练集
        return batch_data.cache().shuffle(buffer_size).batch(batch_size)
    else:  # 测试集
        return batch_data.batch(batch_size)
# # 训练批数据
train_batch_dataset = create_batch_dataset(train_dataset, train_labels)
# print(train_batch_dataset)
# 测试批数据
test_batch_dataset = create_batch_dataset(test_dataset, test_labels, train=False)
# print(train_dataset.shape)
# print(train_dataset)
# # 模型构建
model = Sequential()
model.add(LSTM(256, activation='relu', input_shape=train_dataset.shape[-2:]))
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(1))
optimizer = Adam(learning_rate=0.001)
# 模型编译
model.compile(optimizer='adam',loss='mean_squared_error')
checkpoint_file = "best_model.hdf5"
checkpoint_callback = ModelCheckpoint(filepath=checkpoint_file,
                                      monitor='loss',
                                      mode='min',
                                      save_best_only=True,
                                      save_weights_only=True)
# 模型训练
history = model.fit(train_batch_dataset,
                    epochs=1000,
                    validation_data=test_batch_dataset,
                    callbacks=[checkpoint_callback])

img

img

  • 写回答

18条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-05 08:34
    关注

    引自免费微信小程序:皆我百晓生

    针对您提出的共享单车需求预测问题,以及遇到的高Loss值和参数优化的需求,我为您提供以下几点详细的优化建议:

    1. 数据预处理

    • 标准化:您已经在使用MinMaxScaler对数据进行标准化处理,这是很好的做法。但请注意,对于时间序列数据,尤其是包含周期性模式的,考虑使用StandardScaler可能更合适,因为它能更好地保留数据的分布特性。
    • 序列长度选择:您选择了序列长度为3,这取决于数据的特性。考虑尝试不同的序列长度,比如更长的序列(如7天,以捕获周内周期性),并观察效果。

    2. 特征工程

    • 增加特征:除了现有的weekday、weather、meantemp,可以考虑添加更多与共享单车需求相关的特征,如节假日标识、历史骑行量、温度变化率等。
    • 特征交叉:通过创建新特征来捕捉特征间的交互效应,如weather与meantemp的组合特征。

    3. 模型结构优化

    • LSTM层调整:尝试减少LSTM单元数,比如从256降到128,过大的神经元数量可能会导致过拟合。
    • 添加Dropout:在LSTM层后添加Dropout层,以防止过拟合。例如,可以在每个隐藏层后加入Dropout(0.2)
    • 双向LSTM:考虑使用双向LSTM以捕获输入序列的前向和后向依赖。
    • 时间特征编码:将时间信息(如小时、日期、星期几)编码为额外的输入特征,可以使用循环神经网络(如Embedding)或固定大小的编码(如one-hot编码)。

    4. 损失函数与优化器

    • 损失函数:您正在使用均方误差(MSE)作为损失函数,这是回归问题的常见选择。如果目标值分布有偏斜,可以尝试使用平均绝对误差(MAE)或Huber损失。
    • 优化器与学习率:您已使用Adam优化器,可以尝试其他优化器(如RMSprop或Adagrad),并考虑使用学习率衰减策略,比如LearningRateScheduler
    • 早停机制:加入EarlyStopping回调,当验证损失在一定轮次内不再下降时停止训练,以避免过拟合。

    5. 参数调优

    • 网格搜索:使用GridSearchCVRandomizedSearchCV进行超参数优化,这需要较大的计算资源。
    • Bayesian Optimization:使用贝叶斯优化库(如hyperopt)来自动寻找最优参数组合。

    6. 代码优化示例

    基于以上建议,下面是对您代码的修改示例:

    from tensorflow.keras.callbacks import EarlyStopping
    from sklearn.preprocessing import StandardScaler
    from keras.optimizers import Adam
    from keras.callbacks import LearningRateScheduler
    
    # 使用StandardScaler
    scaler = StandardScaler()
    X_train = scaler.fit_transform(X_train)
    X_test = scaler.transform(X_test)
    
    # 添加Dropout
    model = Sequential()
    model.add(LSTM(128, activation='relu', input_shape=train_dataset.shape[-2:], return_sequences=True))
    model.add(Dropout(0.2))
    model.add(LSTM(64, activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(1))
    
    # 使用学习率衰减
    def scheduler(epoch, lr):
        if epoch % 100 == 0 and epoch != 0:
            return lr * 0.9
        return lr
    
    lr_schedule = LearningRateScheduler(scheduler)
    
    # 添加EarlyStopping
    early_stopping = EarlyStopping(monitor='val_loss', patience=20)
    
    # 编译模型,使用优化的学习率和损失函数
    optimizer = Adam(learning_rate=0.001)
    model.compile(optimizer=optimizer, loss='mean_squared_error')
    
    # 训练模型,加入更多的回调
    history = model.fit(train_batch_dataset,
                        epochs=1000,
                        validation_data=test_batch_dataset,
                        callbacks=[checkpoint_callback, lr_schedule, early_stopping])
    

    请注意,这些优化措施需要根据您的具体数据和模型表现来逐步尝试和调整。希望这些建议能帮助您降低Loss值,并提高模型预测性能。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月7日
  • 赞助了问题酬金15元 5月5日
  • 修改了问题 5月5日
  • 修改了问题 5月5日
  • 展开全部

悬赏问题

  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路
  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应