zmalqpzmxncbv 2023-03-14 16:58 采纳率: 0%
浏览 51
已结题

关于#lstm#的问题,如何解决?

根据lstm的多变量时间预测模型,预测海洋中S、T的浓度,使用超参数搜索出现num,且预测值为num,数据来源:http://mds.nmdis.org.cn/pages/dataViewDetail.html?dataSetId=18

import os
import pandas as pd
#import re
path = r"C:\Users\Asus\Desktop\毕设\data\new"  # 读取csv文件目录路径
# listdir()--返回path指定 的 文件夹中包含的文件或者文件夹名字 的 列表
FileNames = os.listdir(path)# 因此Filename是一个列表
df = []
for fn in FileNames:
    fullfilename = os.path.join(path, fn)
    df.append(pd.read_csv(fullfilename,encoding='utf-8',index_col = None))
data = pd.concat(df)
data=data[['Station', 'date', 'lat', 'lon', 'SampleDepth','T', 'S']]
data["date"] = pd.to_datetime(data["date"], format='%m/%d/%Y')

group = data.groupby(['Station'])
SAT=data['Station'].value_counts()
n_SAT=pd.DataFrame(SAT)
n_SAT=n_SAT[n_SAT['Station']>=100]
n_SAT['counts']=n_SAT['Station']
n_SAT['Station'] = n_SAT.index
n_SAT

n_data=[]
for i in n_SAT['Station']:
    n_data.append(data.loc[data["Station"]==i])
data0 = pd.concat(n_data)
a = data0[['lat','lon']]
data0['location']=a.apply(lambda x: str(x['lat'])+" "+str(x['lon']),axis=1)
#准备数据
#T_data = data0[[ 'date', 'location','SampleDepth','T']]
#S_data = data0[[ 'date', 'location','SampleDepth','S']]

#T_data = T_data.groupby('date').mean()
data0 =data0.sort_values(by='date')
b =  data0.groupby(['date','location']).mean()
b['indexs']=b.index

ls = list(b['indexs'])
bd = []
bl = []

for i in range(0,len(ls)):
    d = ls[i]
    for j in range(0,len(d)):
        if j == 0:
            n = str(d[j])
            bd.append(n.split(' ')[0])
        else:
            bl.append(d[j])
b['location']=bl
b['date']=bd
T_data = b[[ 'date', 'lat','lon','SampleDepth','T']]
T_data= T_data.set_index('date')

import numpy as np
import pandas as pd
#from matplotlib import pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM
from tensorflow.keras.layers import Dense, Dropout
from sklearn.preprocessing import MinMaxScaler
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import GridSearchCV


#拆分数据集
test_split=round(len(T_data)*0.20)
df_for_training=T_data[:-5828]
df_for_testing=T_data[-5828:]
print(df_for_training.shape)
print(df_for_testing.shape)


#MinMaxScaler缩放数据
#from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0,1))
df_for_training_scaled = scaler.fit_transform(df_for_training)
df_for_testing_scaled=scaler.transform(df_for_testing)
df_for_training_scaled


def createXY(dataset,n_past):
    dataX = []
    dataY = []
    for i in range(n_past, len(dataset)):
            dataX.append(dataset[i - n_past:i, 0:dataset.shape[1]])
            dataY.append(dataset[i,0])
    return np.array(dataX),np.array(dataY)

trainX,trainY=createXY(df_for_training_scaled,30)
testX,testY=createXY(df_for_testing_scaled,30)


def build_model(optimizer):
    grid_model = Sequential()
    grid_model.add(LSTM(50,return_sequences=True,input_shape=(30,4)))
    grid_model.add(LSTM(50))
    grid_model.add(Dropout(0.2))
    grid_model.add(Dense(1,activation='linear'))

    grid_model.compile(loss = 'mse',optimizer = optimizer)
    return grid_model
grid_model = KerasRegressor(build_fn=build_model,verbose=1,validation_data=(testX,testY))

parameters = {'batch_size' : [18,20],
              'epochs' : [45,50],
              'optimizer' : ['adam']  }

grid_search  = GridSearchCV(estimator = grid_model,
                            param_grid = parameters,
                            cv = 2)

grid_search = grid_search.fit(trainX,trainY)


#获取最优参数
grid_search.best_params_
my_model=grid_search.best_estimator_.model

#测试数据集测试模型
prediction=my_model.predict(testX)
print("prediction\n", prediction)
print("\nPrediction Shape-",prediction.shape)


  • 写回答

4条回答 默认 最新

  • Leodong. 2023-03-14 17:07
    关注

    该回答引用GPTᴼᴾᴱᴺᴬᴵ,具体如下:

    根据代码,你正在使用LSTM模型预测海洋中S、T的浓度,并使用网格搜索找到最佳超参数。但是在代码中,超参数的列表不完整。
    

    这里提供完整的参数列表,你可以将其添加到代码中进行网格搜索。

    parameters = {'batch_size' : [16, 32, 64],
                  'epochs' : [50, 100, 200],
                  'optimizer' : ['adam', 'rmsprop'],
                  'n_past': [30, 60, 90]}
    
    
    
    此外,你需要更新 build_model 函数以使用 n_past 超参数,并将其传递到 createXY 函数中。在更新后的 createXY 函数中,需要将最后一维更改为 dataset.shape[1]-1,因为不再包含要预测的目标变量。最后,在使用模型进行预测之前,还需要对预测值进行反缩放,以便进行比较。
    

    如果以上回答对您有所帮助,望采纳~谢谢

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月22日
  • 创建了问题 3月14日

悬赏问题

  • ¥15 使用gojs3.0,如何在nodeDataArray设置好text的位置,再go.TextBlock alignment中进行相应的改变
  • ¥15 psfusion图像融合指标很低
  • ¥15 银河麒麟linux系统如何修改/etc/hosts权限为777
  • ¥50 医院HIS系统代码、逻辑学习
  • ¥30 docker离线安装mysql报错,如何解决?
  • ¥15 构建工单的总账影响在哪里查询或修改
  • ¥15 三个简单项目写完之后有重赏之后联系我
  • ¥15 python报内存不能read错误
  • ¥15 hexo安装这种情况怎么办
  • ¥100 找hCaptcha图形验证码自动识别解决方案