鉴于看得人变多了,说明一下:博主本职是Python开发,现在偏向全栈的移动端开发·······这个比赛和文章是在大三想尝试这个方向才去做(写)的。实在是很业余,首先希望不要误人子弟,其次对大家有帮助最好
代码早就不在了,数据还有,看到都会发的
2021/07/19. 以下为原文
最近参加了一个光伏发电预测的比赛,第一次接触这类课题,看了很多关于光伏发电预测和负荷预测的论文,算是入了一个门。主要工作还是在数据清理上和特征工程上。做好了这两项后面的预测过程倒是比较简单。比赛要求:利用之前若干时段的光伏发电参数,预测未来两个月的正向有功总电量。
具体见下文。
一、数据分析
原始数据表 “data.csv”,提供了用户 A1-A5 的 2016 年 12 月 31 日-2018 年 1 月 1 日 瞬时有功、瞬时无功、A相电流、B 相电流、C 相电流、A 相电压、B 相电压、C 相电压、正向有功总 9 个属性的数据表,共 342768 条数据,其中正向有功为预测对象。截取其中一个月的数据图形如下图1所示,可知预测对象正向有功为累计值,呈其他 8 个属性数据为瞬时值,需对正向有功进行差分处理,转化为瞬时值。另外,每日数据为从晚至早逆序排列,也需逆序处理。
图1 2016年12月正向有功总值变化图
图2 2016年12月主要属性变化图
图3 2016年12月正向有功总值差分变化图
通过对每日采集点的频数统计,显示每日数据值小于 96 点的日期,缺失情况如图4,发现数据集中存在缺失值,需补充完整。
图4 A1公司数据缺失日期统计
二、算法原理
本次预测算法,采用 python2.7.12(比赛环境要求) 编写,程序分为 LoadData.py 和 PredictLabel.py 两部分。
1、LoadData.py
LoadData.py 程序的主要功能为数据清洗,具体函数如下:
(1)splitDataSet():主要功能是划分数据:将“data.csv”数据集按用户类型A1-A5划分为五个数据集,以便分别处理和预测。
(2)reduceDataSet(work):主要功能是对数据进行清洗:其一,根据属性相关性计算结果剔除瞬时无功、A相电流、B相电流、C相电流、A相电压、B相电压、C相电压等7列属性,增加A相功率、B相功率和C相功率3列。其二,由于预测值正向有功是连续数据,按照缺失值等于前期值,补全所有数据缺失点,并计算每日增量,将正向有功累积值转化为瞬时值。其三,将数据表中属性值倒叙累加,得到每天0点时刻瞬时有功、A相功率、B相功率和C相功率的每天累加值,并根据初赛要求,提取所有0点时刻采集的数据。
(3)loadDataSet(work):主要功能是提取经过数据清晰的训练数据集
(4)loadWeatherData():主要功能是提取外部天气数据集。
(5)normData(dataSet):主要功能是对数据进行无量纲归一化处理。
(6)loadFutureWeatherData():主要功能是提取预测数据集的属性值(2018年8月-9月天气数据)
(7)saveFile(work):主要功能是保存程序运行的中间数据文件
2、PredictLabel.py
PredictLabel.py程序的主要功能是执行样本训练和数据预测,具体函数如下:
(1)nn_model()主要功能为利用训练样本训练神经网络模型
(2)nn_model_weather():主要功能利用预测数据训练预测模型
(3)predictLabel(predictData,trainData,trainLabel,lastLabel):主要功能为执行电力预测,利用训练好的模型(模型为keras中的全连接神经网络nn_model),调用预测数据,输出正向有功预测结果。
(4)predictDataFunc(predictData,trainData,trainLabel):主要功能为执行属性预测,利用训练好的模型(模型为keras中的全连接神经网络nn_model),调用外部数据,输出属性预测结果。
(5)concatCSV():主要功能为拼接预测数据表。
三、方案设计
1、数据处理
步骤1:将原始数据划分为A1-A5五个用户数据集;
步骤2:将用户数据集的缺失数据补全;
步骤3:根据初赛要求,提取每日0点数据;
步骤4:将正向有功总值进行每日增量计算,得到正向有功每日瞬时值;
2、指标筛选
步骤1:新增A相功率、B相功率和C相功率3列属性;
步骤2:将瞬时有功、A相功率、B相功率和C相功率数据倒序累加得到累计值;
步骤3:计算瞬时无功、A相电流、B相电流、C相电流、A相电压、B相电压、C相电压瞬时值和瞬时有功、A相功率、B相功率和C相功率累计值与预测对象正向有功每日瞬时值之间的相关性;
步骤4:计算外部数据集中日平均气温、日最高气温、日最低气温、日照时长和降水量等属性指标与预测对象瞬时有功之间的相关性;
步骤5:根据相关性结果,选择高相关性的指标形成用户电量预测数据集(具体为瞬时有功、A相功率、B相功率、C相功率);根据相关性结果,选择高相关性的指标形成瞬时有功预测数据集(具体为日平均气温、日最高气温、日最低气温、日照时长和降水量);
3、模型优化
步骤1:在用户电量预测数据集中,选择80%数据样本进行模型训练,以最小 MSE 为标准优化模型参数,重复10次;在瞬时有功预测数据集中,选择80%数据样本进行模型训练,以最小 MSE 为标准优化模型参数,重复10次。
步骤2:在用户电量预测数据集中,选择剩下20%数据,带入训练好的模型中进行电量预测,计算预测结果的MESE;在瞬时有功预测数据集中,选择剩下20%数据,带入训练好的模型中进行电量预测,计算预测结果的MESE;
步骤3:根据预测结果MSE,确定预测模型
4、预测结果
步骤1:将2018年8月-2018年9月的外部数据作为属性值代入瞬时有功预测模型,得到2018年8月-2018年9月的瞬时有功预测值。
步骤2:利用步骤一中预测的2018年8月-2018年9月的瞬时有功预测值,调用另一个模型预测2018年8月-2018年9月的每天正向有功的增量的值
步骤3:将增量累加到2018年7月31日的正向有功值,得到每天的累计正向有功值。
四、模型效果
使用K-交叉验证,每次取 0.8 的数据集作为样本,和 0.2 的验证集比较。
模型1的准确率:80%以上。
模型2:80%以上。
最终值(累加后的)准确率:99%左右
由于最终值是一个累加值,初始值达数千,而每天的增量范围为0-50,因此最终的预测结果非常理想。