Datawhale学习笔记AI +新能源:电动汽车充电站充电量预测

news2024/12/24 4:03:06

赛题介绍

建立站点充电量预测模型,根据充电站的相关信息和历史电量数据,准确预测未来某段时间内充电站的充电量需求。
在赛题数据中,我们提供了电动汽车充电站的场站编号、位置信息、历史电量等基本信息。我们鼓励参赛选手在已有数据的基础上补充或构造额外的特征,以获得更好的预测性能

赛题任务

根据赛题提供的电动汽车充电站多维度脱敏数据,构造合理特征及算法模型,预估站点未来一周每日的充电量。(以天为单位),属于典型的回归问题。

数据集

本赛题提供的数据集包含三张数据表。
其中,power_forecast_history.csv 为站点运营数据,power.csv为站点充电量数据,stub_info.csv为站点静态数据,训练集为历史一年的数据,测试集为未来一周的数据。
以下是本次赛题数据集的字段说明:
在这里插入图片描述
数据集下载
在这里插入图片描述

评估指标

评估指标:RMSE(均方根误差)
在这里插入图片描述
均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根。
衡量的是预测值与真实值之间的偏差,并且对数据中的异常值较为敏感,受异常值的影响更大,所以要想好如何处理异常值上分。
常用于评测回归任务,常用来作为机器学习模型预测结果衡量的标准。
与MSE的区别
MSE是真实值与预测值的差值的平方然后求和平均。通过平方的形式便于求导,所以常被用作线性回归的损失函数。
MAE对异常值不敏感,但它不能反映预测误差的分布情况。
RMSE放大了较大误差之间的差距,此外,RMSE计算后的结果与实际值的单位相同,而MSE的结果是实际值单位的平方。因此,如果我们要直观地了解模型的预测误差,通常会使用RMSE作为指标。

提交示例

在这里插入图片描述

过拟合与欠拟合

在这里插入图片描述
第一个欠拟合,第二个正常,第三个过拟合
欠拟合:欠拟合是指模型不能在训练集上获得足够低的误差。换句换说,就是模型复杂度低,模型在训练集上就表现很差,没法学习到数据背后的规律。
如何解决欠拟合?
欠拟合基本上都会发生在训练刚开始的时候,经过不断训练之后欠拟合应该不怎么考虑了。但是如果真的还是存在的话,可以通过增加网络复杂度或者在模型中增加特征,这些都是很好解决欠拟合的方法。
过拟合:过拟合是指训练误差和测试误差之间的差距太大。换句换说,就是模型复杂度高于实际问题,模型在训练集上表现很好,但在测试集上却表现很差。模型对训练集"死记硬背"(记住了不适用于测试集的训练集性质或特点),没有理解数据背后的规律,泛化能力差
为什么会出现过拟合现象?
造成原因主要有以下几种:

  • 训练数据集样本单一,样本不足。如果训练样本只有负样本,然后那生成的模型去预测正样本,这肯定预测不准。所以训练样本要尽可能的全面,覆盖所有的数据类型。
  • 训练数据中噪声干扰过大。噪声指训练数据中的干扰数据。过多的干扰会导致记录了很多噪声特征,忽略了真实输入和输出之间的关系。
  • 模型过于复杂。模型太复杂,已经能够“死记硬背”记下了训练数据的信息,但是遇到没有见过的数据的时候不能够变通,泛化能力太差。我们希望模型对不同的模型都有稳定的输出。模型太复杂是过拟合的重要因素。

如何解决过拟合?
要想解决过拟合问题,就要显著减少测试误差而不过度增加训练误差,从而提高模型的泛化能力。我们可以使用正则化(Regularization)方法。

常用的正则化方法根据具体的使用策略不同可分为:(1)直接提供正则化约束的参数正则化方法,如L1/L2正则化;(2)通过工程上的技巧来实现更低泛化误差的方法,如提前终止(Early stopping)和Dropout;(3)不直接提供约束的隐式正则化方法,如数据增强等。
正常拟合:模型的正常拟合是指训练得到的模型,可以从训练数据集上学习得到了泛化能力强、预测误差小的模型,同时该模型还可以针对待测试的数据进行良好的预测,获得令人满意的预测效果。
三种情况在训练数据集上的预测误差的表现形式为:欠拟合>正常拟合>过拟合;而在测试集上的预测误差形式为:欠拟合>过拟合>正常拟合。

所以下面这张也是第一个欠拟合,第二个正常拟合,第三个过拟合
在这里插入图片描述

在机器学习中,以下哪些技术是数据清洗的相关技术?
A去除重复数据
B处理缺失数据
C异常值处理
D数据标准化/归一化
数据清洗是将重复、多余的数据筛选清除,将缺失的数据补充完整,将错误的数据纠正或者删除,最后整理成为我们可以进一步加工、使用的数据。
数据清洗的一般步骤:分析数据、缺失值处理、异常值处理、去重处理、噪音数据处理。在大数据生态圈,有很多来源的数据ETL工具,但是对于公司内部来说,稳定性、安全性和成本都是必须考虑的。

baseline解读

对于常见的时序问题,我们可以采用历史平移、滑窗统计,尽可能的提取时间特征等方法进行特征工程。
在这里插入图片描述

增加工作日非工作日特征

df['weekday'] = df_copy[col].dt.weekday
df['is_weekend'] = df['weekday'].isin([5, 6]).astype(int)
df['is_workday'] = (df['weekday'] < 5).astype(int)

增加小时,分钟特征

df_copy[prefix + 'hour'] = df_copy[col].dt.hour
df_copy[prefix + 'minute'] = df_copy[col].dt.minute

相对时间差特征

df['diff_from_start'] = (df_copy[col] - df_copy[col].iloc[0]).dt.days
df['diff_to_end'] = (df_copy[col].iloc[-1] - df_copy[col]).dt.days

构建了历史平移特征、差分特征、和窗口统计特征
(1)历史平移特征:通过历史平移获取上个阶段的信息;

(2)差分特征:可以帮助获取相邻阶段的增长差异,描述数据的涨减变化情况。在此基础上还可以构建相邻数据比值变化、二阶差分等;

(3)窗口统计特征:窗口统计可以构建不同的窗口大小,然后基于窗口范围进统计均值、最大值、最小值、中位数、方差的信息,可以反映最近阶段数据的变化情况。

# 合并训练数据和测试数据
df = pd.concat([train_df, test_df], axis=0).reset_index(drop=True)

# 历史平移
for i in range(7,36):
    df[f'power_shift{i}'] = df.groupby('id_encode')['power'].shift(i)
    window_size = 7


# 历史平移 + 差分特征
for i in range(1,4):
    df[f'power_shift7_diff{i}'] = df.groupby('id_encode')['power_shift7'].diff(i)
    
# 窗口统计
for win in [7,14,28,35,50,70]:
    df[f'power_win{win}_mean'] = df.groupby('id_encode')['power'].rolling(window=win, min_periods=3, closed='left').mean().values
    df[f'power_win{win}_median'] = df.groupby('id_encode')['power'].rolling(window=win, min_periods=3, closed='left').median().values
    df[f'power_win{win}_max'] = df.groupby('id_encode')['power'].rolling(window=win, min_periods=3, closed='left').max().values
    df[f'power_win{win}_min'] = df.groupby('id_encode')['power'].rolling(window=win, min_periods=3, closed='left').min().values
    df[f'power_win{win}_std'] = df.groupby('id_encode')['power'].rolling(window=win, min_periods=3, closed='left').std().values

# 历史平移 + 窗口统计
for win in [7,14,28,35,50,70]:
    df[f'power_shift7_win{win}_mean'] = df.groupby('id_encode')['power_shift7'].rolling(window=win, min_periods=3, closed='left').mean().values
    df[f'power_win{win}_median'] = df.groupby('id_encode')['power'].rolling(window=win, min_periods=3, closed='left').median().values
    df[f'power_shift7_win{win}_max'] = df.groupby('id_encode')['power_shift7'].rolling(window=win, min_periods=3, closed='left').max().values
    df[f'power_shift7_win{win}_min'] = df.groupby('id_encode')['power_shift7'].rolling(window=win, min_periods=3, closed='left').min().values
    df[f'power_shift7_win{win}_sum'] = df.groupby('id_encode')['power_shift7'].rolling(window=win, min_periods=3, closed='left').sum().values
    df[f'power_shift7_win{win}_std'] = df.groupby('id_encode')['power_shift7'].rolling(window=win, min_periods=3, closed='left').std().values

lgbm参数详解

# 定义lightgbm参数
        params = {
            'boosting_type': 'gbdt',#提升树的类型。值为 'gbdt' 表示梯度提升决策树
            'objective': 'regression',#损失函数。这里是回归问题,所以选用回归损失函数,即 'regression'。
            'metric': 'rmse',#评价指标。衡量模型性能的指标,这里使用均方根误差(RMSE)作为评价指标。
            'min_child_weight': 5,#一个叶子节点最小的样本权重和。用来控制过拟合。如果这个值过高,则会导致欠拟合,反之则会导致过拟合。
            'num_leaves': 2 ** 5,#决策树上的叶子节点数。这个参数通常比较敏感,其值越大,模型越复杂,容易过拟合。
            'lambda_l2': 10,#L2 正则化系数。增加这个值可以减少模型的复杂度,防止过拟合。
            'feature_fraction': 0.8,#训练每棵树时,使用的特征比例。设置该参数可以防止过拟合,提高模型的泛化能力。
            'bagging_fraction': 0.8,#构造每棵树所使用的数据比例,通常选取比较小的值,和 feature_fraction 一起使用,可以控制模型的复杂度。
            'bagging_freq': 4,#执行 bagging 操作的频率。设置为 0 表示不使用 bagging 操作。
            'learning_rate': 0.05,#学习率。控制每次迭代调整的步长。如果设置的学习率过大,则可能无法收敛,如果设置的学习率过小,则可能需要较长时间才能得到最终结果。
            'seed': 2023,#随机种子。设定一个随机种子,可以保证结果的可重复性。
            'nthread' : 16,#线程数。LGBM 中多线程并行计算提高了训练速度,该参数用来指定线程数。
            'verbose' : -1,#是否打印调试信息。设置为 -1 时不打印任何信息。
            # 'device':'gpu'
        }

lgbm参数详解

pandas_profiling简介

python库:pandas_profiling,这个库只需要一行代码就可以生成数据EDA报告。
基于pandas的DataFrame数据类型,可以简单快速地进行探索性数据分析
对于数据集的每一列,pandas_profiling会提供以下统计信息:
1、概要:数据类型,唯一值,缺失值,内存大小
2、分位数统计:最小值、最大值、中位数、Q1、Q3、最大值,值域,四分位
3、描述性统计:均值、众数、标准差、绝对中位差、变异系数、峰值、偏度系数
4、最频繁出现的值,直方图/柱状图
5、相关性分析可视化:突出强相关的变量,Spearman, Pearson矩阵相关性色阶图

并且这个报告可以导出为HTML,非常方便查看。对不太熟悉python数据分析的新手来说十分友好。
安装:

pip install pandas-profiling

使用pandas_profiling生成数据探索报告:

report = pp.ProfileReport(data)
report

导出为html文件

report.to_file('report.html')

“H3” 是一个用于地理空间索引和网格系统的开源库。它将地球表面划分为一系列分辨率逐渐变粗的六边形单元格,每个单元格都有唯一的标识符,称为 H3 地址。H3 地址可以表示不同级别的地理区域,例如国家、城市、街区等。

要将 H3 地址转换为地理坐标(经度和纬度),可以使用 H3 库中的函数
安装

pip install h3-python

示例代码

import h3

h3_address = '8928308280fffff'  # 示例 H3 地址

coordinates = h3.h3_to_geo(h3_address)

latitude = coordinates[0]
longitude = coordinates[1]

print("Latitude:", latitude)
print("Longitude:", longitude)

数据探索

fromDatawhale直播一禧助教

df['new_date'] = pd.to_datetime(df['ds']* 100 + df['ds_hour'].astype(int), format='%Y%m%d%H')
df['ds_date'] = df['new_date'].dt.date
############################ 绘图函数
def my_plot(df, id_encode, start_date, end_date, groupby, predict=False): 
    # 绘制折线图
    fig = plt.figure(figsize=(20,10))
    df = df.loc[(df['ds'] >= start_date) & (df['ds'] <= end_date)]
    if id_encode > -1:
        df = df.loc[df['id_encode'] == id_encode]
    else:
        pass
    if groupby == 'hour':
        plt.plot(df['new_date'], df['power'], color = 'blue')
        if predict == True:
            plt.plot(df['new_date'], df['power_pre'], color = 'red')
        try:
            plt.plot(df['new_date'], df['temp_max'], color = 'brown')
            plt.plot(df['new_date'], df['temp_min'], color = 'green')
        except:
            pass
    elif groupby == 'day':
        df_power = df.groupby(by = 'ds_date')['power'].sum().reset_index()
        plt.plot(df_power['ds_date'], df_power['power'], color = 'blue')
        if predict == True:
            df_power_pre = df.groupby(by = 'ds_date')['power_pre'].sum().reset_index()
            plt.plot(df_power_pre['ds_date'], df_power_pre['power_pre'], color = 'red')
            
    # 添加标题和轴标签
    plt.title('Power vs Date')
    plt.xlabel('Date')
    plt.ylabel('Power')

    # 显示图形
    plt.show()

我这里按照助教说的画了两个图

my_plot(df, id_encode=-1, start_date=20220401, end_date=20230610, groupby='day')

在这里插入图片描述
202301应该是春节期间大年30大家都回乡下城市的充电量下降

my_plot(df, id_encode=-1, start_date=20230301, end_date=20230610, groupby='day')

在这里插入图片描述
20230322是因为寒潮所以有所下降

然后助教还说了可以将h3转换为经纬度,但因为我这边不太懂暂时还没有尝试这种方法
我这边使用sklearn库中的LabelEncoder类来对数据进行标签编码(Label Encoding)操作

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
train_df['h3'] = le.fit_transform(train_df['h3'])
test_df['h3'] = le.fit_transform(test_df['h3'])

但是似乎效果不是特别好

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1106298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++初阶】引用内联函数auto关键字范围for循环nullptr

个人主页还有更多系列专栏&#xff1a;小白不是程序媛 我的小仓库&#xff1a;Gitee C系列专栏&#xff1a;C头疼记 目录 前言 引用 概念 引用的特点 常引用 引用的使用场景 做参数 做返回值 引用和指针的区别 引用和指针的不同点&#xff1a; 内联函数 内联函数…

【LeetCode刷题(数据结构与算法)】:二叉搜索树的范围和

一、什么是二叉搜索树 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;&#xff0c;也称二叉排序树或二叉查找树 二叉搜索树&#xff1a;一棵二叉树&#xff0c;可以为空&#xff1b;如果不为空&#xff0c;满足以下性质 非空左子树的所有键值小于其根结…

Typora使用教程

相关介绍 Typora是一款所写即所得的Markdown编辑器&#xff0c;支持跨平台Window,Linux和Mac都可以。 相关链接 Typora安装包历史版本地址&#xff1a;官网历史版本地址 问题及知识点汇总 关于图片的问题-设置图像自动复制到自己指定文件夹下 问题描述 在写笔记的过程中&am…

Write-Ahead Log(PostgreSQL 14 Internals翻译版)

日志 如果发生停电、操作系统错误或数据库服务器崩溃等故障&#xff0c;RAM中的所有内容都将丢失&#xff1b;只有写入磁盘的数据才会被保留。要在故障后启动服务器&#xff0c;必须恢复数据一致性。如果磁盘本身已损坏&#xff0c;则必须通过备份恢复来解决相同的问题。 理论…

C++ 类和对象(上)------超详细解析,小白必看系列

目录 一、前言 二、面向过程和面向对象初步认识 三、类的引入 三、类的定义 四、类的访问限定符及封装 &#x1f4a6;访问限定符 &#xff08;重点&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; &#x1f4a6;封装 五、类的作用域 六、类的实例化 …

算法--排序算法效率比较

《算法设计与分析》课程实验报告 &#xff08; 实验一&#xff09; 实验名称&#xff1a;排序算法效率比较 实验地点&#xff1a; 所使用的开发工具及环境&#xff1a; PC机&#xff0c;DEV 一、实验目的&#xff1a; 比较至少 4 种排序&#xff08;从小到大排&#xff09…

从十月稻田,看大米为何能卖出200亿市值?

国无农不稳&#xff0c;民无粮不安。新时代的农村农民&#xff0c;需要现代化的农业作依托&#xff0c;而在农业现代化的过程中&#xff0c;品牌化、数字化成为至关重要的一环。 金秋十月&#xff0c;从南到北&#xff0c;从东到西&#xff0c;中国农村的每一块土地都洋溢着丰…

【运筹优化】运筹学导论:线性规划导论

文章目录 一、原形范例&#xff08;Wyndor Glass 公司&#xff09;1.1 线性规划模型构建1.2 图解法1.3 结论 二、线性规划模型2.1 线性规划模型的标准形式2.2 其他形式2.3 模型解的术语 三、有关线性规划的假设3.1 比例性3.2 可加性3.3 可分割性3.4 确定性 四、补充例子4.1 放射…

ant的basedir内置属性

basedir是ant的内置属性&#xff0c;代表项目基础路径的绝对路径。它的默认值等于build文件的父目录。当然&#xff0c;可以通过project 的basedir 属性、或者单独的basedir 属性来覆盖。 例如&#xff0c;在工程的根目录下有个build.xml文件&#xff1a; build.xml文件的内…

java springboot 实现 对象或对象数组 转为 前端可解析的JSON字符串格式

这是我的接口代码 逻辑就是 通过 IBookService对象中的 list 函数获取数据列表 然后定义 state(响应状态) message(提示信息) 最后将这三个信息 做成对象返回给前端 接口访问结果 但是这种对象数组对存储空间消耗肯定是比字符串大很多的 所以 我们来尝试 将json数组转成字符…

JOSEF约瑟 漏电继电器 JHOK-ZBG1 φ25mm AC220V 0.1A/0.1S 分体式

系列型号 JHOK-ZBG1 φ25mm漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBG2 φ25mm漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBG1 φ45mm漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBG2 φ45mm 漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBG1 φ100mm漏电&a…

广西建筑模板厂家批发——能强优品木业

随着建筑业的蓬勃发展&#xff0c;建筑模板作为不可或缺的基础材料&#xff0c;在工程施工中扮演着重要的角色。在广西&#xff0c;能强优品木业有限公司作为一家备受瞩目的建筑模板厂家批发商&#xff0c;以其卓越的产品品质和优质的服务在行业中脱颖而出。 实力厂家扎根广西 …

电影《前任4:英年早婚》观后感

刚刚国庆节后&#xff0c;没有什么上新电影&#xff0c;只能看国庆节时的电影了&#xff0c;于是选择了这部《前任4&#xff1a;英年早婚》&#xff0c;原本是非常抗拒看这样的电影了&#xff0c;毕竟自己作为单身狗&#xff0c;还是不喜欢吃狗粮的&#xff0c;不过从另一方面讲…

JOSEF约瑟 轨道继电器 CSN-11 DC220V 二转换 35mm导轨安装 大功率启动大于5W

CSN-11轨道继电器 一、用途 该继电器用于电力系统接口设备可与保护装置&#xff0c;安全自动装置等设备接口实现开入隔离&#xff0c;开出重动功能&#xff0c;用于开关量的隔离及转换。CSN-11继电器特点是启动功率大抗力强。采用标准35mm导轨安装。 二、技术参数 1.额定电…

C++算法:给表达式添加运算符

题目 给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target &#xff0c;在 num 的数字之间添加 二元 运算符&#xff08;不是一元&#xff09;、- 或 * &#xff0c;返回 所有 能够得到 target 的表达式。 注意&#xff0c;返回表达式中的操作数 不应该 包含前导零。…

行情分析——加密货币市场大盘走势(10.18)

大饼昨日小幅度的下跌回调了&#xff0c;很快又上涨。目前看下来震荡向下刚刚开始&#xff0c;可以关注后续情况。大饼依然保持看空不做空&#xff0c;目前除了独立行情的币&#xff0c;就大饼非常强势。目前从MACD日线来看&#xff0c;还是保持多头趋势&#xff0c;预计明后两…

6-2 进制转换 分数 10

Status SPush(SqStack& s, ElemType x) {if (s.top s.stacksize) //栈满return ERROR;s.data[s.top] x;s.top;//1条或2条语句均可return OK; } Status SPop(SqStack& s, int& e) {if (s.top 0) //栈空return ERROR;s.top--; //S.top下移e s.data[s.top]; //把…

WhatsApp 私域营销指南

当涉及到WhatsApp私域营销时&#xff0c;企业正逐渐意识到这个强大工具的潜力&#xff0c;为建立与用户之间更紧密的关系、提供个性化的服务和推广&#xff0c;以及增加用户忠诚度&#xff0c; WhatsApp已成为一个不可或缺的营销渠道。在如今竞争激烈的市场中&#xff0c;私域营…

SSTI模板注入(flask) 学习总结

文章目录 Flask-jinja2 SSTI 一般利用姿势SSTI 中常用的魔术方法内建函数 利用 SSTI 读取文件Python 2Python 3 利用 SSTI 执行命令寻找内建函数 eval 执行命令寻找 os 模块执行命令寻找 popen 函数执行命令寻找 importlib 类执行命令寻找 linecache 函数执行命令寻找 subproce…