第九届泰迪杯上市公司财务造假全国一等奖,曾入围特等选拔7进3,并进行答辩。由于实习的原因不参加本次比赛,在此记录一下自己的一些想法与思考,希望可以为大家提供一些思路。此外,就多次参加比赛的经历中,笔者认为在模型构建以及论文撰写中,大家可以把某一个点作为论文的亮点,围绕这个点来展开,并对比这一个处理方法相较于其他的方法有多大的提升。通过图表的方式将多个模型结果进行可视化对比,提高摘要的质量,做到这几点,一般离拿奖就不远了。
B题:电力系统负荷预测分析
一、问题背景
电力系统负荷(电力需求量,即有功功率)预测是指充分考虑历史的系统负荷、经济状况、气象条件和社会事件等因素的影响,对未来一段时间的系统负荷做出预测。负荷预测是电力系统规划与调度的一项重要内容。短期(两周以内)预测是电网内部机组启停、调度和运营计划制定的基础;中期(未来数月)预测可为保障企业生产和社会生活用电,合理安排电网的运营与检修决策提供支持;长期(未来数年)预测可为电网改造、扩建等计划的制定提供参考,以提高电力系统的经济效益和社会效益。
复杂多变的气象条件和社会事件等不确定因素都会对电力系统负荷造成一定的影响,使得传统负荷预测模型的应用存在一定的局限性。同时,随着电力系统负荷结构的多元化,也使得模型应用的效果有所降低,因此电力系统负荷预测问题亟待进一步研究。
二、解决问题
1.地区负荷的中短期预测分析
根据附件中提供的某地区电网间隔15分钟的负荷数据,建立中短期负荷预测模型:
(1)给出该地区电网未来10天间隔15分钟的负荷预测结果,并分析其预测精度;
(2)给出该地区电网未来3个月日负荷的最大值和最小值预测结果,以及相应达到负荷最大值和最小值的时间,并分析其预测精度。
2.行业负荷的中期预测分析
对不同行业的用电负荷进行中期预测分析,能够为电网运营与调度决策提供重要依据。特别是在新冠疫情、国家“双碳”目标等背景下,通过对大工业、非普工业、普通工业和商业等行业的用电负荷进行预测,有助于掌握各行业的生产和经营状况、复工复产和后续发展走势,进而指导和辅助行业的发展决策。请根据附件中提供的各行业每天用电负荷相关数据,建立数学模型研究下面问题:
(1)挖掘分析各行业用电负荷突变的时间、量级和可能的原因。
(2)给出该地区各行业未来3个月日负荷最大值和最小值的预测结果,并对其预测精度做出分析。
(3)根据各行业的实际情况,研究国家“双碳”目标对各行业未来用电负荷可能产生的影响,并对相关行业提出有针对性的建议。
对于时间序列预测模型,一般采用arima,Facebook研发的prophet预测模型,还有对数据进行特征处理后采用lightGBM等机器学习模型进行预测。在回归中,预测精度一般采用RMSE,MAPE等评价指标进行预测精度判断。此外,对于后续数据增加,比较有亮点的地方是通过不同的调参方法进行参数调优。个人认为在本次比赛中,调参方法若是选择的好,参加比赛的小伙伴可以着重于这个点来撰写论文,获奖的可能性极大。
通过数据结构构建将时间序列数据变成机器学习可识别的模式,例如以一天的数据为例,可以将window设置为96,构造出{(1-96),97},{(2-97),98}这样的样本,以lightGBM为例:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import lightgbm as lgb
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedKFold
### CREATE X,Y ####
def create_xy(series, window_size, prediction_horizon, shuffle = False):
x = []
y = []
for i in range(0, len(series)):
if len(series[(i + window_size):(i + window_size + prediction_horizon)]) < prediction_horizon:
break
x.append(series[i:(i + window_size)])
y.append(series[(i + window_size):(i + window_size + prediction_horizon)])
x = np.array(x)
y = np.array(y)
return x,y
df = pd.read_csv("..//附件1-区域15分钟负荷数据.csv")
series = df.iloc[:,1] #得到时序数据
### HYPERPARAMETERS ###
window_size = 30
prediction_horizon = 1
### TRAIN VAL SPLIT ### (include shuffling later)
test_size = 6
split_time = len(series) - test_size
train_series = series[:split_time]
test_series = series[split_time - window_size:]
train_x, train_y = create_xy(train_series, window_size, prediction_horizon)
test_x, test_y = create_xy(test_series, window_size, prediction_horizon)
train_y = train_y.flatten()
test_y = test_y.flatten()
print(train_x.shape)
print(train_y.shape)
print(test_x.shape)
print(test_y.shape)
### lightGBM model ###
params = {
'n_estimators': 500,
'max_depth': 4,
'num_leaves': 2**4,
'learning_rate': 0.1,
'boosting_type': 'dart'
}
model = lgb.LGBMRegressor(first_metric_only = True, **params)
model.fit(train_x, train_y,
eval_metric = 'l1',
eval_set = [(test_x, test_y)],
#early_stopping_rounds = 10,
verbose = 0)
### forecast ###
forecast = model.predict(test_x)
print(' LightGBM MAE: %.4f' % (np.mean(np.abs(forecast - test_y))))
02 会包含prophet模型的代码。