m0_74420115 2024-04-28 19:27 采纳率: 71.9%
浏览 1
已结题

怎么看生成的文件中哪个拟合效果最好

这是代码

import pandas_datareader.data as web
import datetime
start = datetime.datetime(2000,1,1)
end = datetime.datetime(2024,1,1)
df = web.DataReader('GOOGL', 'stooq',start,end)
def Stock_Price_LSTM_Data_Precesing(df,mem_his_days,pre_days):
    df.dropna(inplace=True)
    df.sort_index(inplace=True)
    df['label']= df['Close'].shift(-pre_days)
    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    sca_X=scaler.fit_transform(df.iloc[:,:-1])
    
    
    mem_his_days = 10
    
    from collections import deque
    deq = deque(maxlen=mem_his_days)
    
    X = []
    for i in sca_X:
        deq.append(list(i))
        if len(deq)==mem_his_days:
            X.append(list(deq))
    X_lately = X[-pre_days:]
    X = X[:-pre_days]
    y = df['label'].values[mem_his_days-1:-pre_days]
    
    
    import numpy as np
    X = np.array(X)
    y = np.array(y)
    return X,y,X_lately
X,y,X_lately = Stock_Price_LSTM_Data_Precesing(df,5,10)
print(len(X))
print(len(y))
print(len(X_lately))
pre_days = 10
mem_days=[5,10,15]
lstm_layers=[1,2,3]
dense_layers=[1,2,3]
units = [16,32]
from tensorflow.keras.callbacks import ModelCheckpoint
for the_mem_days in mem_days:
    for the_lstm_layers in lstm_layers:
        for the_dense_layers in dense_layers:
            for the_units in units:
                filepath = './models/men_{0}lstm{1}dense{2}unit{3}.weights.h5'.format(the_mem_days, the_lstm_layers, the_dense_layers, the_units)
                checkpoint = ModelCheckpoint(
                    filepath=filepath,
                    save_weights_only=True,
                    monitor='val_mape',
                    mode='min',
                    save_best_only=True)
                X,y,X_lately = Stock_Price_LSTM_Data_Precesing(df,the_mem_days,pre_days)
                from sklearn.model_selection import train_test_split
                X_train,X_test,y_train,y_test = train_test_split(X,y,shuffle=False,test_size=0.1)
                import tensorflow as tf
                from tensorflow.keras.models import Sequential
                from tensorflow.keras.layers import LSTM,Dense,Dropout
                model = Sequential()
                model.add(LSTM(the_units,input_shape=X.shape[1:],activation='relu',return_sequences=True))
                model.add(Dropout(0.1))
                for i in range(the_lstm_layers):
                    model.add(LSTM(the_units,activation='relu',return_sequences=True))
                    model.add(Dropout(0.1))
                
                model.add(LSTM(the_units,activation='relu'))
                model.add(Dropout(0.1))
                for i in range(the_dense_layers):
                    model.add(Dense(the_units,activation='relu'))
                    model.add(Dropout(0.1))
                
                model.add(Dense(1))
                model.compile(optimizer='adam',
                             loss='mse',
                             metrics=['mape'])
                model.fit(X_train,y_train,batch_size=32,epochs=50,validation_data=(X_test,y_test),callbacks=[checkpoint])

怎么通过把损失值或误差的数值放在文件的头部,这样按名称排序的时候就能直接找到最好的拟合方案

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-04-28 19:27
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    问题概括

    这个问题的目的是找到一种方法,以便在保存模型权重文件时,将模型的损失值或误差作为文件名的一部分,这样当按名称排序时,能够快速识别出拟合效果最好的模型。

    问题出现原因

    这个问题出现的原因是,在尝试不同的模型配置(如不同的记忆天数、LSTM层数、密集层数和单元数)时,需要一种简便的方法来比较和识别出表现最佳的模型。目前,模型的权重文件名只包含了模型的配置参数,而没有包含模型的性能指标,这使得直接比较模型性能变得困难。

    问题解决方案

    为了解决这个问题,我们可以修改保存模型权重的文件名,使其包含模型的验证集上的性能指标,如均方误差(MSE)或平均绝对百分比误差(MAPE)。这样,文件名将直观地反映出模型的性能,便于排序和比较。

    提供代码

    以下是修改后的代码段,它将在保存模型权重时,将验证集上的MAPE指标添加到文件名中:

    from tensorflow.keras.callbacks import ModelCheckpoint
    from sklearn.metrics import mean_absolute_percentage_error
    
    # ...(省略了其他代码)
    
    for the_mem_days in mem_days:
        for the_lstm_layers in lstm_layers:
            for the_dense_layers in dense_layers:
                for the_units in units:
                    # 定义模型保存路径和文件名格式
                    filepath = f'./models/mem_{the_mem_days}lstm_{the_lstm_layers}dense_{the_dense_layers}unit_{the_units}_MAPE_{0:.4f}.weights.h5'
                    # 使用ModelCheckpoint回调函数
                    checkpoint = ModelCheckpoint(
                        filepath=filepath,
                        save_weights_only=True,
                        monitor='val_mape',
                        mode='min',
                        save_best_only=True)
                    
                    # ...(省略了数据预处理和模型训练的代码)
    
                    # 定义一个自定义回调函数,用于在每个epoch后计算MAPE并更新文件名
                    class MapeCallback(tf.keras.callbacks.Callback):
                        def on_epoch_end(self, epoch, logs=None):
                            if logs is not None and 'val_mape' in logs:
                                mape_value = logs['val_mape']
                                new_filepath = filepath.format(mape_value)
                                self.model.save_weights(new_filepath)
    
                    # 添加自定义回调函数到模型训练中
                    model.fit(X_train, y_train, batch_size=32, epochs=50, validation_data=(X_test, y_test), callbacks=[checkpoint, MapeCallback()])
    
    # ...(省略了其他代码)
    

    请注意,这里使用了Python的格式化字符串(f-string)来动态生成包含MAPE值的文件名。同时,添加了一个自定义的回调函数MapeCallback,它会在每个epoch结束后计算验证集上的MAPE,并更新模型权重文件的保存路径。

    代码运行方式

    运行这段代码需要以下环境:

    • Python 3.x
    • TensorFlow 2.x
    • Keras
    • scikit-learn
    • pandas_datareader
    • datetime

    运行方式是在Python环境中直接运行这段脚本。

    代码预期运行结果

    代码运行后,将生成一系列模型权重文件,文件名将包含模型的配置参数和在验证集上的MAPE值。例如,./models/mem_10lstm_2dense_2unit_32_MAPE_0.01.weights.h5,其中0.01是该模型在验证集上的MAPE值。

    推荐相关链接

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月14日
  • 已采纳回答 5月6日
  • 创建了问题 4月28日