【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 Baseline

这篇博客介绍了在电力系统负荷预测分析比赛中,使用Python进行数据预处理,包括温度、天气状况和风向特征处理,并通过LightGBM构建预测模型。博主展示了如何从数据读取、特征工程到模型训练和评估的全过程,包括MAE、RMSE等指标的计算。
摘要由CSDN通过智能技术生成

更新时间:2022年4月21日

相关链接

(1)【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 问题一Baseline方案

(2)【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 问题一ARIMA、AutoARIMA、LSTM、Prophet 多方案实现

(3【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 问题二 时间突变分析 Python实现

(4)【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 31页一等奖论文及代码

完整代码下载

请添加图片描述

1 题目

比赛官网:第十届“泰迪杯”数据挖掘挑战赛

一、问题背景

电力系统负荷(电力需求量,即有功功率)预测是指充分考虑历史的系统负荷、经济状况、气象条件和社会事件等因素的影响,对未来一段时间的系统负荷做出预测。负荷预测是电力系统规划与调度的一项重要内容。短期(两周以内)预测是电网内部机组启停、调度和运营计划制定的基础;中期(未来数月)预测可为保障企业生产和社会生活用电,合理安排电网的运营与检修决策提供支持;长期(未来数年)预测可为电网改造、扩建等计划的制定提供参考,以提高电力系统的经济效益和社会效益。

复杂多变的气象条件和社会事件等不确定因素都会对电力系统负荷造成一定的影响,使得传统负荷预测模型的应用存在一定的局限性。同时,随着电力系统负荷结构的多元化,也使得模型应用的效果有所降低,因此电力系统负荷预测问题亟待进一步研究。

二、解决问题

1.地区负荷的中短期预测分析

根据附件中提供的某地区电网间隔15分钟的负荷数据,建立中短期负荷预测模型:

(1)给出该地区电网未来10天间隔15分钟的负荷预测结果,并分析其预测精度;

(2)给出该地区电网未来3个月日负荷的最大值和最小值预测结果,以及相应达到负荷最大值和最小值的时间,并分析其预测精度。

2.行业负荷的中期预测分析

对不同行业的用电负荷进行中期预测分析,能够为电网运营与调度决策提供重要依据。特别是在新冠疫情、国家“双碳”目标等背景下,通过对大工业、非普工业、普通工业和商业等行业的用电负荷进行预测,有助于掌握各行业的生产和经营状况、复工复产和后续发展走势,进而指导和辅助行业的发展决策。请根据附件中提供的各行业每天用电负荷相关数据,建立数学模型研究下面问题:

(1)挖掘分析各行业用电负荷突变的时间、量级和可能的原因。

(2)给出该地区各行业未来3个月日负荷最大值和最小值的预测结果,并对其预测精度做出分析。

(3)根据各行业的实际情况,研究国家“双碳”目标对各行业未来用电负荷可能产生的影响,并对相关行业提出有针对性的建议。

2 Python实现的baseline

2.1 数据读取

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt 
import seaborn as sns 
%matplotlib  inline
plt.style.use('seaborn-darkgrid')
sns.set(style = 'darkgrid')
import warnings
warnings.filterwarnings("ignore")
import lightgbm as lgb  
from sklearn.preprocessing import scale
import lightgbm as lgb
import xgboost as xgb 
from catboost import CatBoostRegressor
import time
from tqdm import tqdm
from sklearn.preprocessing import LabelEncoder
y = pd.read_csv('./data/附件1-区域15分钟负荷数据.csv')
indu = pd.read_csv('./data/附件2-行业日负荷数据.csv')
tianqi = pd.read_csv('./data/附件3-气象数据.csv')
tianqi
日期天气状况最高温度最低温度白天风力风向夜晚风力风向Unnamed: 6
02018年1月1日多云/多云22℃12℃无持续风向<3级无持续风向<3级NaN
12018年1月1日多云/多云22℃12℃无持续风向<3级无持续风向<3级NaN
22018年1月2日多云/多云22℃15℃无持续风向<3级无持续风向<3级NaN
32018年1月3日多云/阴23℃15℃无持续风向<3级无持续风向<3级NaN
42018年1月4日多云/小雨21℃16℃无持续风向<3级无持续风向<3级NaN
52018年1月5日阴/小雨19℃13℃无持续风向<3级无持续风向<3级NaN
62018年1月6日小雨-中雨/中雨-大雨15℃11℃无持续风向<3级无持续风向<3级NaN
72018年1月7日大雨/中雨15℃7℃无持续风向<3级北风4~5级NaN
82018年1月8日中雨/小雨-中雨12℃5℃北风4~5级北风3~4级NaN
92018年1月9日小雨/阴9℃6℃无持续风向<3级无持续风向<3级NaN
102018年1月10日多云/多云14℃7℃无持续风向<3级无持续风向<3级NaN
112018年1月11日多云/多云15℃6℃无持续风向<3级无持续风向<3级NaN
122018年1月12日晴/晴16℃6℃无持续风向<3级无持续风向<3级NaN
132018年1月13日晴/晴17℃7℃无持续风向<3级无持续风向<3级NaN
142018年1月14日多云/多云20℃10℃无持续风向<3级无持续风向<3级NaN
del tianqi['Unnamed: 6']

2.2 温度特征处理

tianqi['最高温度'] = tianqi['最高温度'].map(lambda d: d.replace('℃','')).astype(int)
tianqi['最低温度'] = tianqi['最低温度'].map(lambda d: d.replace('℃','')).astype(int)

2.3 天气状况特征处理

series = tianqi.join(tianqi['天气状况'].str.split('/',expand=True))
tianqi['天气1'] = series[0]
tianqi['天气2'] = series[1]
tianqi.info()

<class ‘pandas.core.frame.DataFrame’> RangeIndex: 15 entries, 0 to 14 Data columns (total 8 columns):

Column Non-Null Count Dtype — ------ -------------- -----

0 日期 15 non-null object

1 天气状况 15 non-null object

2 最高温度 15 non-null int32

3 最低温度 15 non-null int32

4 白天风力风向 15 non-null object

5 夜晚风力风向 15 non-null object

6 天气1 15 non-null object 7 天气

2 15 non-null object dtypes: int32(2), object(6)

2.4 风向特征处理

tianqi['白天风力风向'].unique()

array([‘无持续风向<3级’, ‘北风4~5级’], dtype=object)

tianqi['夜晚风力风向'].unique()

array([‘无持续风向<3级’, ‘北风4~5级’, ‘北风3~4级’], dtype=object)

dic = {'无持续风向<3级':0,
       '北风3~4级':1,
      '北风4~5级':2}
tianqi['白天风力风向'] = tianqi['白天风力风向'].map(dic)
tianqi['夜晚风力风向'] = tianqi['夜晚风力风向'].map(dic)

2.5 天气进行有序编码

tianqi['天气1'].unique()

array([‘多云’, ‘阴’, ‘小雨-中雨’, ‘大雨’, ‘中雨’, ‘小雨’, ‘晴’], dtype=object)

tianqi['天气2'].unique()

array([‘多云’, ‘阴’, ‘小雨’, ‘中雨-大雨’, ‘中雨’, ‘小雨-中雨’, ‘晴’], dtype=object)

dic1 = {'晴':1, 
        '多云':2,
        '阴':3, 
        '小雨':4,
        '小雨-中雨':5, 
        '中雨':6,
        '中雨-大雨':7,
        '大雨':8}
tianqi['天气1'] = tianqi['天气1'].map(dic1)
tianqi['天气2'] = tianqi['天气2'].map(dic1)
del tianqi['天气状况']

2.6 连着两张表

y = y.rename(columns={'数据时间':'日期1'})
y['日期'] = y['日期1'].apply(lambda x: x.split(' ')[0])
tianqi.loc[:, '日期'] = pd.to_datetime(tianqi.loc[:, '日期'], format='%Y年%m月%d日', errors='coerce')
y.loc[:, '日期'] = pd.to_datetime(y.loc[:, '日期'], format='%Y/%m/%d', errors='coerce')
train = y.merge(tianqi,on='日期',how='left')
del train['日期'] 

2.7 时序特征提取(后期直接加入测试集数据)

train['日期1'] = pd.to_datetime(train['日期1'])
train['月'] = train['日期1'].dt.month 
train['天'] = train['日期1'].dt.day
train['小时'] = train['日期1'].dt.hour
train['一年第几天'] = train['日期1'].dt.dayofyear
train['一年第几周'] = train['日期1'].dt.week

# test['月'] = test['日期1'].dt.month 
# test['天'] = test['日期1'].dt.day
# test['小时'] = test['日期1'].dt.hour
# test['一年第几天'] = test['日期1'].dt.dayofyear
# test['一年第几周'] = test['日期1'].dt.week
        
#####################
此处代码略,请下载完整代码

#####################

train['是否月末'] = [int(i) for i in train['是否月末']]
train['是否季节初'] = [int(i) for i in train['是否季节初']]
train['是否季节末'] = [int(i) for i in train['是否季节末']]
train['是否周末'] = [int(i) for i in train['是否周末']]
train['是否月初'] = [int(i) for i in train['是否月初']]

# test['是否月末'] = [int(i) for i in test['是否月末']]
# test['是否季节初'] = [int(i) for i in test['是否季节初']]
# test['是否季节末'] = [int(i) for i in test['是否季节末']]
# test['是否周末'] = [int(i) for i in test['是否周末']]
# test['是否月初'] = [int(i) for i in test['是否月初']]

3 模型训练

y = train['总有功功率(kw)']
x_train = 略。。。。

3.1 自定义训练集

(1)标签归一化

y =

(2)划分训练集和验证集

x = x_train[:900]
y_train = y[:900]
x_val = x_train[900:]
y_val = y[900:]

3.2 训练

model_lgb = lgb.LGBMRegressor(
                learning_rate=0.01,
                max_depth=-1,
                n_estimators=1000,
                    boosting_type='gbdt',
                    random_state=2021,
                    objective='regression',
                    num_leaves = '32',
                    verbose=-1)
lgb_model = model_lgb.fit(x,y_train)
pred_val_y  = lgb_model.predict(x_val)

3.2 模型评价(MAE,RMSE)

# coding=utf-8
import numpy as np
from sklearn import metrics
 
# MAPE需要自己实现
def mape(y_true, y_pred):
    return np.mean(np.abs((y_pred - y_true) / y_true))
 
y_true = np.array(y_val)
y_pred = np.array(pred_val_y  )
 
print('MSE:',metrics.mean_squared_error(y_true, y_pred))
 
print('RMSE:',np.sqrt(metrics.mean_squared_error(y_true, y_pred)))
 
print('MAE:',metrics.mean_absolute_error(y_true, y_pred))
 
print('MAPE:',mape(y_true, y_pred))
 
## R2-score
from sklearn.metrics import r2_score
print('R2-score:',r2_score(y_true, y_pred))

MSE: 0.010407552970462575

RMSE: 0.1020174150351918

MAE: 0.07714213380059706

MAPE: 0.13842409370994957

R2-score: 0.646261802505866

【标第十届泰迪杯数据挖掘挑战赛B是一个以数据分析和挖掘为核心的竞赛项目,参赛者需要通过解决一系列问来展示他们的技能和创新思维。这个压缩包包含了参赛者对B的完整解答以及实现这些解答的源代码。 【描述】这个描述简单明了,表明压缩包中的内容是关于“第十届泰迪杯数据挖掘挑战赛”的B解决方案。"完整解及代码"意味着文件中不仅有分析思路和方法论,还有实际的编程实现,这对于学习数据挖掘和机器学习的初学者或爱好者来说是非常宝贵的资源。 【标签】虽然没有提供具体的标签,但我们可以根据标和描述推断出一些关键标签,如“数据挖掘”、“数据分析”、“机器学习”、“Python编程”、“挑战赛”、“比赛策略”。 【压缩包子文件的文件名称列表】 1. 第一问第一小问.zip:这可能是参赛者对B第一部分的第一小问的解答和代码,可能涉及到数据预处理、探索性数据分析(EDA)和初步模型构建。 2. 第一问第二小问.zip:这涵盖了第一部分的第二个问,可能涉及更复杂的数据建模、特征工程或者模型优化。 3. 第二问第一小问.zip:这是针对B第二部分的第一个问,可能涉及到不同的数据挖掘任务,如分类、聚类或预测。 4. 第二问第二小问.zip:对应第二部分的第二个问,可能需要参赛者进行更深入的分析,如异常检测、关联规则学习或者时间序列分析。 5. 问二-异常时间点分析 (1).ipynb:这是一个Jupyter Notebook文件,专门针对问二中的异常时间点分析,可能包含了数据可视化、统计测试和异常检测算法的实现。 综合以上信息,我们可以了解到这个压缩包是围绕数据挖掘挑战赛的解过程,涉及到多个阶段的问解决,涵盖数据预处理、建模、模型评估和异常检测等核心步骤。参赛者可能使用了Python等编程语言,利用了如Pandas、Numpy、Scikit-learn等库进行数据分析和建模。通过研究这些文件,学习者可以深入理解如何在实际问中应用数据挖掘技术,并且能学习到如何组织和呈现一个完整的数据挖掘项目。
### 回答1: 保险反欺诈预测是金融数据分析的重要应用之一。该赛是基于保险数据集,旨在通过分析和挖掘数据特征,建立一个反欺诈预测模型的基准线。 首先,我们需要对保险数据集进行预处理和清洗,包括处理缺失值、异常值和重复值等。然后,我们可以进行特征工程,提取出与反欺诈相关的特征。常见的特征可以包括被保险人的年龄、职业、保险金额、历史理赔记录等信息。 接下来,我们可以选择合适的机器学习算法来构建预测模型。常用的算法包括逻辑回归、决策树、随机森林等。在构建模型之前,我们需要将数据集划分为训练集和测试集,用训练集进行模型训练,然后用测试集评估模型的性能。 评估模型的性能可以使用常见的指标,如准确率、精确率、召回率和F1值等。这些指标可以帮助我们评估模型的预测能力和误判率。 最后,我们需要对模型进行优化和改进。可以通过调整模型的参数、增加更多的特征或者尝试其他的机器学习算法来提高模型的预测性能。同时,对于不平衡样本问,可以采用欠采样、过采样或者集成学习等方法来解决。 总结起来,保险反欺诈预测的baseline建立包括数据预处理、特征工程、模型构建和优化等步骤。通过不断地优化和改进,我们可以建立一个有效的反欺诈预测模型,提高保险公司的风险控制能力。 ### 回答2: 金融数据分析2: 保险反欺诈预测baseline是指在保险领域中,利用金融数据分析的方法来预测保险反欺诈的基础模型。 保险反欺诈预测是指利用大数据和机器学习算法等技术手段,对保险投保人的风险进行分析和预测,从而提高保险公司的风险管理能力,减少保险欺诈行为。 基于金融数据分析的保险反欺诈预测baseline主要包括以下几个步骤: 1. 数据收集:收集与保险欺诈相关的数据,包括投保人的基本信息、历史保险记录、理赔记录等,以及其他与保险欺诈相关的非保险数据。 2. 数据清洗和预处理:对收集到的数据进行清洗和预处理,包括去除异常值、缺失值处理、数据标准化等。确保数据的质量和可用性。 3. 特征工程:根据业务需求和领域知识,对数据进行特征提取和构建。包括基本特征、组合特征和衍生特征等。 4. 模型选择和训练:选择适用于保险反欺诈预测的机器学习模型,例如逻辑回归、决策树、支持向量机等。通过训练数据拟合模型,并进行调参和验证,得到最佳模型。 5. 模型评估和优化:利用评价指标如准确率、召回率、F1值等对模型进行评估,并进行模型优化和调整,提高模型的预测性能。 6. 模型应用和部署:将优化后的模型应用于实际场景,进行实时预测和反欺诈行为识别。并对模型进行监测和更新,保持模型的准确性和稳定性。 基于以上步骤,金融数据分析2的保险反欺诈预测baseline可以建立一个初步的保险反欺诈预测模型,并得到一组基本的预测结果。然后可以根据比赛的具体要求和模型效果进行进一步的改进和优化,提高保险反欺诈预测的准确性和稳定性。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Better Bench

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值