第十届“泰迪杯”数据挖掘挑战赛B题python实现

目录

前言

一、第一题

1.第一问

2.第二问

二、第二题

1.第一问

2.第二问

写在后面


前言

帮朋友宣传一下(第十届泰迪杯B题),用了好多种方法,比如模型用了LSTM,ARIMA等模型,LSTM中又分了LSTM实现单变量时间序列预测,LSTM实现多变量单步长时间序列预测,LSTM实现多变量多步长时间序列预测,写论文可以都写上对比!同时运用了多种统计检验方法。

以下是部分思路/代码/数据可视化。

传送门:闲鱼


一、第一题

1.第一问

LSTM模型:

class LSTM(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_size, batch_size):
        super().__init__()
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.output_size = output_size
        self.num_directions = 1 # 单向LSTM
        self.batch_size = batch_size
        self.lstm = nn.LSTM(self.input_size, self.hidden_size, self.num_layers, batch_first=True)
        self.linear = nn.Linear(self.hidden_size, self.output_size)

    def forward(self, input_seq):
        h_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device)
        c_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device)
        seq_len = input_seq.shape[1]
        # input(batch_size, seq_len, input_size)
        input_seq = input_seq.view(self.batch_size, seq_len, 1) 
        # output(batch_size, seq_len, num_directions * hidden_size)
        output, _ = self.lstm(input_seq, (h_0, c_0))
        output = output.contiguous().view(self.batch_size * seq_len, self.hidden_size) 
        pred = self.linear(output) # pred(150, 1)
        pred = pred.view(self.batch_size, seq_len, -1) 
        pred = pred[:, -1, :]
        return pred

思路一:用一天中每隔15分钟的所有的点预测下一个点,即用96个点预测下一时刻的点。

思路二:用预测点的前一天同时刻的点和预测点前一时刻的点预测下一个点,即用两个点预测一个点,当然也可以自己加,比如加上上一周同时刻的点一起预测一个点。

部分关键代码:

    for i in range(len(data) - 96):
        train_seq = []
        train_label = []
        for j in range(i, i + 96):
            train_seq.append(load[j])
        train_label.append(load[i + 96])
        train_seq = torch.FloatTensor(train_seq).view(-1)
        train_label = torch.FloatTensor(train_label).view(-1)
        seq.append((train_seq, train_label))

可视化:

x = [i for i in range(1, 97)]
    x_smooth = np.linspace(np.min(x), np.max(x), 900)
    y_smooth = make_interp_spline(x, y.T[96:192])(x_smooth)
    plt.plot(x_smooth, y_smooth, c='green', marker='*', ms=1, alpha=0.75, label='true')

    y_smooth = make_interp_spline(x, pred.T[96:192])(x_smooth)
    plt.plot(x_smooth, y_smooth, c='red', marker='o', ms=1, alpha=0.75, label='pred')
    plt.grid(axis='y')
    plt.legend()
    plt.show()

运行结果如下:(对数据进行了处理)

第十届“泰迪杯”数据挖掘挑战赛B题python实现_第1张图片

 mape: 0.014883823223180978,即准确率达98%+,可自行调参提高准确率

ARIMA模型:

直接上结果:

数据时间 总有功功率(KM)
2021/9/1 0:00 261372.7135
2021/9/1 0:15 236249.2922
2021/9/1 0:30 232803.4953
2021/9/1 0:45 229891.0916
2021/9/1 1:00 250784.1078
2021/9/1 1:15 226421.0218
2021/9/1 1:30 223678.3659
2021/9/1 1:45 222034.4955
2021/9/1 2:00 244418.4528
...... ......

mape: 0.07800534689379683,即准确率达92%+,可自行调参提高准确率

第十届“泰迪杯”数据挖掘挑战赛B题python实现_第2张图片

2.第二问

直接上结果:

未来 3 个月日负荷最大值:
数据时间 总有功功率(KM)
2021/9/1 270572.8498
2021/9/2 266392.4357
2021/9/3 263519.7642
2021/9/4 260923.6411
2021/9/5 258540.9461
2021/9/6 256324.3903
2021/9/7 254238.4298
2021/9/8 252256.2427
2021/9/9 250357.4918
...... ......
未来 3 个月日负荷最小值:
        ......略

二、第二题

1.第一问

处理异常值和缺失值,缺失值填补有很多策略......

"""

缺失一条数据且为int型,均值/中位数填充
缺失两条数据且为离散型 出现次数最多的字符填充

缺失率:缺失较小 模型填充(如KNN算法,随机森林算法......)
缺失率:缺失较大 删除

"""

部分异常时间点分析可视化:

第十届“泰迪杯”数据挖掘挑战赛B题python实现_第3张图片

各行业用电负荷突变的时间和量级表: 第十届“泰迪杯”数据挖掘挑战赛B题python实现_第4张图片

2.第二问

类似第一题第二问......


写在后面

        我看了下她做的,内容挺丰富的,代码/方法/可视化的图都打包好了,照着她的思路论文也很好写。 这里我只帮她展示了一点点内容,详情请移步闲鱼

你可能感兴趣的:(python,数据挖掘)