Datawhale AI 夏令营 Task3——使用深度学习方案

一、时间序列预测特征提取和分析方法

二、优化方案尝试

在优化中,一般用到的方法有:

  1. 提取更多特征:在数据挖掘比赛中,特征总是最终制胜法宝,去思考什么信息可以帮助我们提高预测精准度,然后将其转化为特征输入到模型。

  2. 尝试不同的模型:模型间存在很大的差异,预测结果也会不一样,比赛的过程就是不断的实验和试错的过程,通过不断的实验寻找最佳模型,同时帮助自身加强模型的理解能力。

下面我讲进行多种方法尝试:

2.1特征优化+多模型融合

这里主要构建了历史平移特征、差分特征、和窗口统计特征;每种特征都是有理可据的,具体说明如下:

(1)历史平移特征:通过历史平移获取上个阶段的信息;

(2)差分特征:可以帮助获取相邻阶段的增长差异,描述数据的涨减变化情况。在此基础上还可以构建相邻数据比值变化、二阶差分等;

(3)窗口统计特征:窗口统计可以构建不同的窗口大小,然后基于窗口范围进统计均值、最大值、最小值、中位数、方差的信息,可以反映最近阶段数据的变化情况。

进行模型融合的前提是有多个模型的输出结果,比如使用catboost、xgboost和lightgbm三个模型分别输出三个结果,这时就可以将三个结果进行融合,最常见的是将结果直接进行加权平均融合。

下面我们构建了cv_model函数,内部可以选择使用lightgbm、xgboost和catboost模型,可以依次跑完这三个模型,然后将三个模型的结果进行取平均进行融合。

对于每个模型均选择经典的K折交叉验证方法进行离线评估,大体流程如下:

1、K折交叉验证会把样本数据随机的分成K份;

2、每次随机的选择K-1份作为训练集,剩下的1份做验证集;

3、当这一轮完成后,重新随机选择K-1份来训练数据;

4、最后将K折预测结果取平均作为最终提交结果。

运行代码尝试:

途中遇到以下俩个报错:

1.train_cols 没用被定义:

解决方案:

2.在定义train_cols 后出现以下报错 

 

原因融合数据类型错误。

因能力有限,未能解决上述问题,于是换一种路径。

2.2 深度学习方法

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense, RepeatVector, TimeDistributed
from keras.optimizers import Adam

train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')

# 数据预处理
def preprocess_data(df, look_back=100):
    # 将数据按照id进行分组
    grouped = df.groupby('id')
    datasets = {}
    for id, group in grouped:
        datasets[id] = group.values
        
    # 准备训练数据集
    X, Y = [], []
    for id, data in datasets.items():
        for i in range(10, 15): # 每个id构建5个序列
            a = data[i:(i + look_back), 3]
            a = np.append(a, np.array([0]*(100-len(a))))
            X.append(a[::-1])
            Y.append(data[i-10:i, 3][::-1])
    
    # 准备测试数据集
    OOT = []
    for id, data in datasets.items():
        a = data[:100, 3]
        a = np.append(a, np.array([0]*(100-len(a))))
        OOT.append(a[::-1])
    
    return np.array(X, dtype=np.float64), np.array(Y, dtype=np.float64), np.array(OOT, dtype=np.float64)

# 定义模型
def build_model(look_back, n_features, n_output):
    model = Sequential()
    model.add(LSTM(50, input_shape=(look_back, n_features)))
    model.add(RepeatVector(n_output))
    model.add(LSTM(50, return_sequences=True))
    model.add(TimeDistributed(Dense(1)))
    model.compile(loss='mean_squared_error', optimizer=Adam(0.001))
    return model

# 构建和训练模型
look_back = 100  # 序列长度
n_features = 1  # 假设每个时间点只有一个特征
n_output = 10  # 预测未来10个时间单位的值

# 预处理数据
X, Y, OOT = preprocess_data(train, look_back=look_back)

# 构建模型
model = build_model(look_back, n_features, n_output)

# 训练模型
model.fit(X, Y, epochs=10, batch_size=64, verbose=1)

# 进行预测
predicted_values = model.predict(OOT)

# 保存预测结果
result_df = pd.DataFrame({
    'id': test['id'],
    'dt': test['dt'],
    'target': predicted_values.flatten()
})
result_df.to_csv('submit_lstm500.csv', index=None)
  1. 导入库:代码开始处导入了所需的库,包括数据处理库NumPy和Pandas,以及用于构建LSTM模型的Keras库。

  2. 读取数据:使用Pandas的read_csv函数读取训练数据集train.csv和测试数据集test.csv

  3. 定义数据预处理函数

    1. preprocess_data函数用于准备训练和测试数据。

    2. 数据按id列进行分组。

    3. 对于每个id,提取特定列(索引为3的列)的数据作为时间序列。

    4. 创建多个序列,每个序列长度为look_back,默认为100。

    5. 序列被反转,并且如果序列长度不足100,则用0填充。

    6. 训练数据集的标签Y是序列的一部分,同样进行反转。

    7. 测试数据集(OOT,Out-Of-Time)也被反转并用0填充以满足序列长度要求。

  4. 定义模型构建函数

    1. build_model函数用于构建LSTM模型。

    2. 模型包括一个LSTM层,用于学习时间序列数据的特征,以及一个重复向量层RepeatVector,用于复制上一个LSTM层的输出以供下一个LSTM层使用。

    3. 再次使用LSTM层和时间分布的密集层来预测序列的下一个值。

    4. 模型使用均方误差作为损失函数,并使用Adam优化器。

  5. 构建和训练模型

    1. 设置序列长度look_back、特征数n_features和输出时间单位数n_output

    2. 调用preprocess_data函数预处理训练数据。

    3. 使用build_model函数构建模型。

    4. 使用模型的fit方法训练模型,指定迭代次数(epochs)和批量大小(batch_size)。

  6. 进行预测

    1. 使用训练好的模型对测试数据集进行预测。

    2. 这里需要注意注意自行将预测结果转化为提交格式

总结

时间序列预测是一个不断发展的领域,随着技术的进步,我们可以期待更多的优化方法和模型的出现。深度学习模型,特别是LSTM和其变体,已经在许多时间序列预测任务中显示出了优越的性能。未来的研究可能会集中在以下几个方面:

  • 更复杂的模型结构:如引入注意力机制的LSTM模型,以更好地捕捉时间序列中的长期依赖关系。

  • 多模态数据融合:结合时间序列数据和其他类型的数据,如文本或图像,以提供更全面的分析。

  • 模型解释性:提高模型的可解释性,以便更好地理解预测结果。

  • 自动化特征工程:开发自动化的特征工程工具,以减少手动特征提取的工作量。

  • 实时预测:提高模型在实时数据流上的预测能力。

  • 模型鲁棒性:提高模型对异常值和噪声的鲁棒性。

随着技术的不断发展,我们可以期待时间序列预测在准确性、效率和应用范围上都会有显著的提升。

 

 

 

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值