- 前言:
- 学习总结:
- 传送门:学习总结之python篇
- 传送门:学习总结之numpy与pandas篇
- B题:电力系统负荷预测分析---题目分析
- 选题
- 原题查看
- 解题历程
- 阶段一
- 阶段二
- 阶段三
- 题目分析
- 官方所给全部数据附件目录
- 第一题:
- 解题前分析:
- 数据预处理:
博主是大一小白一枚,一开始是觉得自己没可能获奖所以不想参加,但很幸运在别人邀请下参加了比赛,后来很感谢自己参加了这次比赛,对我帮助甚至大于我目前的学习生涯。我觉得对于比赛要有一个认知:在大多数时候竞赛都更像是一种以赛促学的形式,且对数据挖掘,数学建模感兴趣的同学来说,参加泰迪杯是非常好的培养自身能力的比赛,而且泰迪杯的比赛周期长达两个月,对于小白来说时间非常充裕,有足够的时间学习,这几个月时间中你会学到在课堂上学不到东西,前提是你们不能摆烂,要实实在在当作一场比赛,在比赛过程中,
你会学习到:
python基础(这里以博主经历 来说),pandas数据处理,matplotlib、seaburn、poltly可视化工具,tensorflow,sklearn机器学习库实现建模过程,学习论文写作,团队协作能力,从竞赛你能更加了解机器学习的实际应用,这些都是从课本学习不到的,特别是比赛经历,对以后竞赛类都是一次很不错的经验。
特别补充:
泰迪杯报名参赛后,一定要利用好官网资源!泰迪云中对参赛选手基础给予了全免费的教程,可以学到对于需要用到知识的大部分基础,从python基础到数据集可视化,tensorflow sklearn建模,以及赛题分析,论文写作也有教程,在官网资源库中也有历年的特等奖论文进行参考,一定好利用好这部分资源。
以下只为个人学习总结,如果错误在所难免,请各位读者斧正。
学习总结: 传送门:学习总结之python篇 传送门:学习总结之numpy与pandas篇学习总结之mathplotlib篇
学习总结之tensorflow篇
学习总结之skleaen篇
学习总结之数据处理篇
学习总结之建模篇
学习总结之论文篇
原题查看我们队伍在一开始选题,一名队员是想选择A题图象识别的或者C题的文字识别,但是我们两个男队员觉得B题是纯数据,而且我们都是数据科学与大数据专业的,就早早定下了B题。
原题:
解题历程 阶段一1.地区负荷的中短期预测分析根据附件中提供的某地区电网间隔 15 分钟的负荷数据, 建立中短期负荷预测模型:
(1) 给出该地区电网未来 10 天间隔 15 分钟的负荷预测结果,并分析其预测精度;
(2) 给出该地区电网未来 3 个月日负荷的最大值和最小值预测结果,以及相应达到负荷最大值和最小值的时间,并分析其预测精度。2.行业负荷的中期预测分析对不同行业的用电负荷进行中期预测分析,能够为电网运营与调度决策提供重要依据。 特别是在新冠疫情、国家“双碳”目标等背景下, 通过对大工业、 非普工业、普通工业和商业等行业的用电负荷进行预测, 有助于掌握各行业的生产和经营状况、 复工复产和后续发展走势,进而指导和辅助行业的发展决策。请根据附件中提供的各行业每天用电负荷相关数据, 建立数学模型研究下面问题:
(1)挖掘分析各行业用电负荷突变的时间、量级和可能的原因。
(2)给出该地区各行业未来 3 个月日负荷最大值和最小值的预测结果,并对其预测精度做出分析。
(3)根据各行业的实际情况,研究国家“双碳”目标对各行业未来用电负荷可能产生的影响,并对相关行业提出有针对性的建议。
阶段二对于该题我们一开始讨论就认为大概思路是
建立数学模型,使用机器学习,深度学习,人工智能实现预测模型。 (一开始真的什么都不懂)只是刚好上过一节人工智能神经网络的公开课,有一点点了解)。然后就开始自己找资料,但是找的部分资料都没有很好的对症下药,而且部分也不是很看得懂(当时得基础只有
上学期学完的C语言,还有基础比较好的高数(数学在计算机这方面很重要,机器学习原理都是由数学出发的),而且只自学了一部分python的用法),所以一开始真的没有什么信心。
阶段三我们选的导师是一个很尽责的老师,也曾带队在泰迪杯获奖,老师在对我们的建议是到官网上查找资料,还有利用学校的图书馆资源在知网畅游,也可以网上购买一些大牛的书查阅(这里的大牛的书指的是开办泰迪杯比赛的大牛,有一本好像叫《python数据挖掘》),其中对我来说最重要的指点是到官网查找资料和知网使用。
题目分析 官方所给全部数据附件目录步入正轨,泰迪杯比赛有一个泰迪云学习网站,里面有一个竞赛指导,里面有各个需要用到方法的基础知识(sklearn,tensorflow,numpy和pandas两兄弟,matplotlib等)我一开始在里面看B题对应的LSTM时间序列示例预测视频(每道题都有一个案例视频对应,感觉官方是真不错!),看第一遍觉得没什么(主要是没太看懂里面的函数和各个用法)看第二遍才发现完全可以套用在第一题!然后我顺着视频思路往下,照炉画瓢写了一个一样的模型。这才对解题有了一个思路,后面求解也遵从这个思路。
附件1-区域15分钟负荷数据.csv)数据格式如下:
附件2-行业日负荷数据.csv数据格式如下:
篇幅有限只放部分数据(各行业)
附件3-气象数据.csv数据格式如下
各题思路如下
第一题:解题前分析:1.地区负荷的中短期预测分析根据附件中提供的某地区电网间隔 15 分钟的负荷数据, 建立中短期负荷预测模型:
(1) 给出该地区电网未来 10 天间隔 15 分钟的负荷预测结果,并分析其预测精度;
可以看出题目给了从
2018/1/1 0:00:00 到 2021/8/31 23:45:00的每十五分钟的数据 ,其中附件二是各行业数据与第一题无关,接着是附件2气象条件。
题目需要预测的是每十五分钟的,而所给气象则是每日的,突变性太大,对模型帮助不大,所以我们综上只能以单变量预测,
使用LSTM时间序列模型。
模型原理讲解文章传送门:(更新中)
查找缺失值:
使用pandas 引入数据 在函数有一个参数:
na_values=[‘?’, 0, ‘nan’], # 设置缺失值的表示值,因为系统默认缺失值表示是NAN在实际中可能会有?等表示,所以不要漏了。
data = pd.read_csv("./全部数据/全部数据/附件1-区域15分钟负荷数据.csv",
sep=',', # 设置数据的分隔符
# index_col='数据时间', # 设置索引
na_values=['?', 0, 'nan'], # 设置缺失值的表示
parse_data= ['数据时间'] #直接转换为时间格式 简便操作
)
特别注意!!!
在对于时间序列的数据来说,官方还会挖一个坑,就是缺失值是日期,我们一般处理数据缺失值的都是所给数据,故会容易忽略时间,而对于时间序列模型,时间连续性是很重要的,这里的时间缺失比较特殊,我的解决办法是,形成对应的的时间时间序列data_range,然后对源数据重新设置索引(设置为data_range)对于没有的数据其会设置其为NAN。
data_range = pd.date_range(start=data['数据时间'].min(), end=data['数据时间'].max(), freq='15T')
data = data.set_index('数据时间').reindex(index=data_range)
这里挖个坑,由于缺失的天数是一整天对于每十五分钟来说是96份数据,这么一大份数据连续缺失,由于才疏学浅,目前还未掌握解决方法,只能全部填充平均值(以后学了再回来填,各位读者可以上网搜相关方法)
接着使用pandas 的DataFrame数据结构查找并填充十分方便(只需一行代码):
# 填充平均值降低影响
data = data.fillna(data['power'].mode().mean())
我这里填充的是平均值,因为当时对缺失值处理没有一个更好的办法,现在应该使用KNN的 (KNN原理讲解文章传送门:更新中)
异常值处理:
箱线图四分位距(顾名思义:分成四份)判定异常值:
(箱线图原理传送门文章:更新中)
代码实现:
Dinfo = data.describe()
# 返回一个Dataframe count 非空值数、mean 平均值、std 标准差、max 最大值、min 最小值、总数相乘(25%、50%、75%)分位数
d1 = Dinfo.loc['25%']
d2 = Dinfo.loc['75%']
d = d2 - d1 # 四分位差
dl1 = d1 - (1.5 * d) # 下限 低于为异常
dl2 = d2 + (1.5 * d) # 上限 高于为异常
datanew = datanew.values # 提取值
for i in range(len(datanew)): # 因为这里 是一个一个数据 循环 所以可以用 | 和 & 运算符得到Bool序列 的二进制数 用.bool() 做判断 直接使用会报错 也可以双重循环
if ((datanew[i] > dl2) | (datanew[i] < dl1)).bool() is True:
datanew[i] = mean
处理异常值要填充的话我也是填充平均值(异常值处理知识待填补)
数据归一化:
数据归一化好处
数据存在不同的评价指标,其量纲或量纲单位不同,处于不同的数量级。解决特征指标之间的可比性,经过归一化处理后,各指标处于同一数量级,便于综合对比。
求最优解的过程会变得平缓,更容易正确收敛。即能提高梯度下降求最优解时的速度。
提高计算精度
我们这里只有一个变量,不用考虑量纲单位不同影响结果,但是由于数据值很大 每个值 都是十几万,那么在训练模型时,容易发生梯度爆炸或者是梯度消失,归一化数据后训练结果更加容易收敛,计算精度也可以很好提高
这里我们用最大值最小值来缩放(scale) 数据,
原理:
把数据缩放到一个设定区间中,默认为0~1,公式是
X/(XMAX-XMIN) * (设置区间差) + 设置好的区间最小值
其中X是数据 ,这样就可以实现缩放(由于缩放是根据最大最小值所以叫MaxMinsclar
我是用skleran(机器学习库)的preprocessing (预处理)库中引入 MaxMinScaler实现
(注:在我印象中sklearn主要用于机器学习 ,tensorflow主要用于深度学习)
代码实现:
from sklearn.preprocessing import MinMaxScaler Scaler = MinMaxScaler() Min_Max_Scaler = Scaler.fit(datanew) # MinMaxScaler() 一个实例化对象 使用方法 fit()先提取最大最小值 # 这里也可以直接由 data_nor = Scaler.fit_transform(datanew) 提取转化数据 # 但是 后面 我们是需要 反归一化得到原始数据的 所以需要 保留转化器 Min_Max_Scaler # 这个转化器 是由 提取原数据生成的 可用来多次转化数据,也可根据需求转化其他数据 # 执行数据转化操作 data_nor = Min_Max_Scaler.transform(datanew)
构建滑动窗口数据集
自己大概画了一个图:
我们是单变量预测所以需要构建特征,这里思路就是是以五十个数据 作为 第五十个数据的特征,以这五十个数据来预测最后一个的数据(注:在LSTM多变量特征预测中在划分好数据集,也要再次这样构建滑动窗口数据集的,因为他是时间序列,是有一定的规律性的,这样做可以让模型更好的学习,但是这里是单变量,这里是为了构建特征,是不同于单变量做法的目的的)
代码实现:
构件滑动窗口数据集
# win_size 代表的是滑动窗口宽度 按照要求窗口的宽度对数据集进行处理
def dataset(data, win_size=50): # 五十个值 多特征回归
x = []
y = []
for i in range(len(data) - win_size):
temp_x = data[i:i + win_size]
temp_y = data[i + win_size]
x.append(temp_x)
y.append(temp_y)
x = np.asarray(x) # 对序列转化为 array 以进行建模操作
y = np.asarray(y)
return x, y
data_x, data_y = dataset(data_nor)
data_x = data_x.reshape(-1, 1, 50) # 按照LSTM建模要求修改数据维度 横向其增加一维
更新时间— 2022.5.20 10:37



