#参数配置
class Config():
data_path = '../data/wind_dataset.csv'
timestep = 20 # 时间步长,就是利用多少时间窗口
batch_size = 32 # 批次大小
feature_size = 8 # 每个步长对应的特征数量,这里只使用1维,每天的风速
hidden_size = 256 # 隐层大小
output_size = 1 # 由于是单输出任务,最终输出层大小为1,预测未来1天风速
num_layers = 2 # lstm的层数
epochs = 10 # 迭代轮数
best_loss = 0 # 记录损失
learning_rate = 0.0003 # 学习率
model_name = 'lstm' # 模型名称
save_path = './{}.pth'.format(model_name) # 最优模型保存路径
config = Config()
def split_data(data, timestep, feature_size):
dataX = [] # 保存X
dataY = [] # 保存Y
# 将整个窗口的数据保存到X中,将未来一天保存到Y中
for index in range(len(data) - timestep):
dataX.append(data[index: index + timestep])
dataY.append(data[index + timestep][0])
dataX = np.array(dataX)
dataY = np.array(dataY)
# 获取训练集大小
train_size = int(np.round(0.8 * dataX.shape[0]))
# 划分训练集、测试集
x_train = dataX[: train_size, :].reshape(-1, timestep, feature_size)
y_train = dataY[: train_size].reshape(-1, 1)
x_test = dataX[train_size:, :].reshape(-1, timestep, feature_size)
y_test = dataY[train_size:].reshape(-1, 1)
return [x_train, y_train, x_test, y_test]
x_train, y_train, x_test, y_test = split_data(data, config.timestep, config.feature_size)
训练集有三个维度,即 [样本数,时间步,特征维度],假设训练集的维度为[4494,20,8] ,样本数就不用多说了,时间步就是利用过去多长时间来预测未来的数据,如果我们设置为30,那就是基于过去30天的样本数据来预测未来1天的数据,特征维度为8,包含温度、风速、降水等特征。
数据的 归一化和标准化 是特征缩放(feature scaling)的方法,是数据预处理的关键步骤。不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据归一化/标准化处理,以解决数据指标之间的可比性。原始数据经过数据归一化/标准化处理后,各指标处于同一数量级,适合进行综合对比评价。
常见的归一化方式有: Min-Max、 Z-Score、 L2范数归一化 等等,常用的是 MIn-Max 归一化,他会将所有的数据缩放到0 -1 区间,对于该操作可以借助sklearn 的 MinMaxScaler 实现,代码如下:
scaler_model = MinMaxScaler()
data = scaler_model.fit_transform(np.array(df))
scaler.fit_transform(np.array(df['WIND']).reshape(-1, 1))
# 4.将数据转为tensor
x_train_tensor = torch.from_numpy(x_train).to(torch.float32)
y_train_tensor = torch.from_numpy(y_train).to(torch.float32)
x_test_tensor = torch.from_numpy(x_test).to(torch.float32)
y_test_tensor = torch.from_numpy(y_test).to(torch.float32)
# 5.形成训练数据集
train_data = TensorDataset(x_train_tensor, y_train_tensor)
test_data = TensorDataset(x_test_tensor, y_test_tensor)
# 6.将数据加载成迭代器
train_loader = torch.utils.data.DataLoader(train_data,
config.batch_size,
False)
test_loader = torch.utils.data.DataLoader(test_data,
config.batch_size,
False)
这里有两个比较陌生的函数 TensorDataset 和 torch.utils.data.DataLoader,我们分别看一下两个函数的介绍
以下是对 PyTorch 1.9.0 版本中 torch.utils.data.TensorDataset
函数的所有参数的官方解释内容的翻译:
参数 | 默认值 | 描述 |
---|---|---|
tensors | 无默认值 | 数据集的张量列表,每个张量的第一个维度应该相同,表示数据集中的样本数量 |
以下是对 PyTorch 1.9.0 版本中 torch.utils.data.TensorDataset
函数的所有属性的官方解释内容的翻译:
属性 | 类型 | 描述 |
---|---|---|
tensors | 张量列表 | 数据集的张量列表 |
以下是对 PyTorch 1.9.0 版本中 torch.utils.data.TensorDataset
函数的所有方法的官方解释内容的翻译:
方法 | 方法描述 | 参数描述 | 返回值 |
---|---|---|---|
__getitem__(index) | 获取数据集中给定索引处的样本 | index :要获取的样本的索引 |
返回一个元组,其中第一个元素是数据样本的张量,第二个元素是对应的标签 |
__len__() | 获取数据集中的样本总数 | 无参数 | 样本总数 |
注:torch.utils.data.TensorDataset
是 PyTorch 中的一个简单的数据集类,它将多个张量作为输入,并将它们的第一个维度视为样本数量。因此,TensorDataset
的 __getitem__()
方法返回一个元组,其中第一个元素是从每个输入张量中选择的索引处的数据样本的张量,第二个元素是一个表示样本标签的张量。如果输入的张量列表只有一个,则返回的元组中只有一个元素。
以下是对 PyTorch 1.9.0 版本中 torch.utils.data.DataLoader
函数的所有参数的官方解释内容的翻译:
参数 | 默认值 | 描述 |
---|---|---|
dataset | 无默认值 | 加载数据的数据集 |
batch_size | 1 | 每个批次的样本数量 |
shuffle | False | 是否在每个时期开始时重新打乱数据 |
sampler | 无默认值 | 定义从数据集中提取样本的策略 |
batch_sampler | 无默认值 | 与 sampler 相同,但返回批次的索引而不是单个样本的索引 |
num_workers | 0 | 加载数据的子进程数量 |
collate_fn | 默认为 None |
合并样本列表以形成一个批次的函数 |
pin_memory | False | 是否将数据加载到 CUDA 固定内存中 |
drop_last | False | 如果数据集大小不能被批次大小整除,则是否删除最后一个不完整的批次 |
以下是对 PyTorch 1.9.0 版本中 torch.utils.data.DataLoader
函数的所有属性的官方解释内容的翻译:
属性 | 类型 | 描述 |
---|---|---|
dataset | 数据集 | 加载数据的数据集 |
batch_size | 整数 | 每个批次的样本数量 |
num_workers | 整数 | 加载数据的子进程数量 |
collate_fn | 函数 | 合并样本列表以形成一个批次的函数 |
pin_memory | 布尔值 | 是否将数据加载到 CUDA 固定内存中 |
drop_last | 布尔值 | 如果数据集大小不能被批次大小整除,则是否删除最后一个不完整的批次 |
以下是对 PyTorch 1.9.0 版本中 torch.utils.data.DataLoader
函数的所有方法的官方解释内容的翻译:
方法 | 方法描述 | 参数描述 | 返回值 |
---|---|---|---|
__iter__() | 返回一个可迭代的数据加载器对象 | 无参数 | 返回一个可以迭代的数据加载器对象,可用于遍历数据集中的所有批次 |
__len__() | 获取数据集中的批次总数 | 无参数 | 数据集中的批次总数 |
注:torch.utils.data.DataLoader
是 PyTorch 中的一个数据加载器类,它可以加载和转换数据集,并生成数据批次以供模型训练。因此,DataLoader
的参数包括数据集、批次大小、是否重排和数据加载的子进程数量等等。