2022-04-20学习内容

2022-04-20学习内容,第1张

4-21

继续泰迪杯,跑了2个模型,赛题论文暂不放在博客。

LSTM

多特征线性回归

4-20 1.模型搭建

首先学习LSTM模型,LSTM模型是一种改进版RNN模型,结合长短期记忆来处理时间序列。通过视频大致了解了LSTM的原理,其中包含三个控制门,用于控制模型的记忆。在Keras中直接调用如下:

def SWPU(SEQ_LEN, x_train):
    model = Sequential([
        layers.LSTM(32, input_shape=(SEQ_LEN, 11), return_sequences=True),
        # layers.Dropout(0.4),
        layers.LSTM(units=32, return_sequences=False),
        layers.Dense(1)
    ])

    model.compile(loss="mse", optimizer="rmsprop")
    return model
2.数据处理 2.1 预处理
def get_train(data1, data2, data3):
    """
    @date: 2022-4-17 13:41:40
    :param data1: 附件1
    :param data2: 附件2
    :param data3: 附件3
    :return: 训练集x,y
    """
    electrical_load = pd.read_csv(data1, sep=',')
    industry = pd.read_csv(data2)
    weather = pd.read_csv(data3)

    # 处理温度
    weather['最高温度'] = weather['最高温度'].map(lambda d: d.replace('℃', '')).astype(int)
    weather['最低温度'] = weather['最低温度'].map(lambda d: d.replace('℃', '')).astype(int)
    # 处理天气
    series = weather.join(weather['天气状况'].str.split('/', expand=True))
    weather['天气1'] = series[0]
    weather['天气2'] = series[1]
    weather_list = weather['天气1'].unique().tolist() + weather['天气2'].unique().tolist()
    weather_list = list(set(weather_list))
    dic_weather = dict()
    for i in range(len(weather_list)):
        dic_weather[weather_list[i]] = i
    weather['天气1'] = weather['天气1'].map(dic_weather)
    weather['天气2'] = weather['天气2'].map(dic_weather)
    # 处理风向
    window_list = weather['白天风力风向'].unique().tolist()
    window_list_2 = weather['夜晚风力风向'].unique().tolist()
    window_list = window_list + window_list_2
    window = list(set(window_list))  # set去重
    dic = dict()
    for i in range(len(window)):
        dic[window[i]] = i
    weather['白天风力风向'] = weather['白天风力风向'].map(dic)
    weather['夜晚风力风向'] = weather['夜晚风力风向'].map(dic)
    # 删除多余列
    weather = weather.drop('天气状况', axis=1)
    # ====
    #print(electrical_load)
    electrical_load = electrical_load.rename(columns={'数据时间': '日期1'})
    electrical_load['日期'] = electrical_load['日期1'].apply(lambda x: x.split(' ')[0])
    weather.loc[:, '日期'] = pd.to_datetime(weather.loc[:, '日期'], format='%Y年%m月%d日', errors='coerce')
    electrical_load.loc[:, '日期'] = pd.to_datetime(electrical_load.loc[:, '日期'], format='%Y/%m/%d', errors='coerce')
    train = electrical_load.merge(weather, on='日期', how='left')
    del train['日期']
    #print(electrical_load)

    train['日期1'] = pd.to_datetime(train['日期1'])
    train['月'] = train['日期1'].dt.month
    train['天'] = train['日期1'].dt.day
    train['小时'] = train['日期1'].dt.hour
    train['一年第几天'] = train['日期1'].dt.dayofyear
    train['一年第几周'] = train['日期1'].dt.week
    pd.set_option('display.max_columns', None)  # 展示所有列
    train_y = train['总有功功率(kw)']
    train.drop(columns=['总有功功率(kw)'], axis=1, inplace=True)
    train.drop(columns=['日期1'], axis=1, inplace=True)       # 删除时间
    # print(electrical_load['总有功功率(kw)'].describe())
    print(train)
    print(train_y)
    return train, train_y


标签值是用功功率。

2.2 按时间步长划分

在对模型进行评估时,我们需要一个“测试集”来测试模型的能力。通常测试集与训练集的划分有“留出法”、“k-fold交叉验证法”等,然而,在本题目中,时间序列数据存在明显的周期性,所以,使用留出法和k-fold交叉验证是不合理的,其中包括测试数据出现在训练数据时间点之前的缺陷。

在时间序列中,需要用特殊的方法划分训练集和测试集。

def split_dataset(dataset_x, dataset_y):
    """
    生成时间序列
    :param dataset_x: x
    :param dataset_y: y
    :return: 划分后的时间序列。res[0]: 0-127, res[1]: 128开始
    """
    # sampling_rate:采样间隔,一段采样中每个中间隔多少
    # length:生成的每段训练、测试时间序列长度
    # start_index:采样数据从哪个index开始
    # end_index:采样数据从哪个index结束
    # batch_size:每批次中的时序数据数量
    # stride:滑动步长
    return tf.keras.preprocessing.sequence.TimeseriesGenerator(dataset_x, dataset_y,
                                                               length=32, sampling_rate=1, stride=1,
                                                               batch_size=96)

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/714065.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-24
下一篇2022-04-24

发表评论

登录后才能评论

评论列表(0条)

    保存