
继续泰迪杯,跑了2个模型,赛题论文暂不放在博客。
LSTM
多特征线性回归
首先学习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
标签值是用功功率。
在对模型进行评估时,我们需要一个“测试集”来测试模型的能力。通常测试集与训练集的划分有“留出法”、“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)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)