从零入门机器学习竞赛 是 Datawhale 2024 年 AI 夏令营第二期的学习活动(“机器学习”方向),基于讯飞开放平台“电力需求预测挑战赛”开展的实践学习——适合想入门并实践 机器学习算法、用AI解决时序问题、电力需求预测 的学习者参与
赛题分析
本赛题是一个典型的时间序列问题。
时间序列问题是指对按时间顺序排列的数据点进行分析和预测的问题,往往用来做未来的趋势预测。比如,基于历史股票每天的股价,预测未来股票的价格走向。
简单来说,本次赛题的目标很简单清晰——【训练时序预测模型助力电力需求预测】
电力需求的准确预测对于电网的稳定运行、能源的有效管理以及可再生能源的整合至关重要。
常见的时间序列场景有:
金融领域:股票价格预测、利率变动、汇率预测等。
气象领域:温度、降水量、风速等气候指标的预测。
销售预测:产品或服务的未来销售额预测。
库存管理:预测库存需求,优化库存水平。
能源领域:电力需求预测、石油价格预测等。
医疗领域:疾病爆发趋势预测、医疗资源需求预测。
时间序列问题的数据往往有如下特点:
时间依赖性:数据点之间存在时间上的连续性和依赖性。
非平稳性:数据的统计特性(如均值、方差)随时间变化。
季节性:数据表现出周期性的模式,如年度、月度或周度。
趋势:数据随时间推移呈现长期上升或下降的趋势。
周期性:数据可能存在非固定周期的波动。
随机波动:数据可能受到随机事件的影响,表现出不确定性。
Baseline代码
Task1中的baseline使用python代码构建了一个经验模型(使用均值作为结果数据)
import pandas as pd
import numpy as np
train = pd.read_csv('./data/data283931/train.csv')
test = pd.read_csv('./data/data283931/test.csv')
target_mean = train[train['dt']<=20].groupby(['id'])['target'].mean().reset_index()
test = test.merge(target_mean, on=['id'], how='left')
test[['id','dt','target']].to_csv('submit.csv', index=None)
代码解析
1、导入相关库
import pandas as pd
import numpy as np
pandas
(pd
别名):用于数据处理和分析,主要操作 DataFrame 和 Series。numpy
(np
别名):用于科学计算和多维数组操作,特别适合对大数据集进行数值运算。
2、读取训练集和测试集数据
train = pd.read_csv('./data/data283931/train.csv')
test = pd.read_csv('./data/data283931/test.csv')
pd.read_csv()
:Pandas 函数,用于从 CSV 文件中读取数据并创建 DataFrame。
3、计算训练数据最近11-20单位时间内对应id的目标均值
target_mean = train[train['dt'] <= 20].groupby(['id'])['target'].mean().reset_index()
train[train['dt'] <= 20]
:通过布尔索引选取训练集中时间列(dt
)小于等于 20 的数据。.groupby(['id'])['target'].mean()
:按照id
列分组,并计算每组中target
列的均值。.reset_index()
:将分组后的结果重置索引,生成新的 DataFrame
4、将 target_mean
作为测试集结果进行合并
test = test.merge(target_mean, on=['id'], how='left')
test.merge()
:Pandas 的合并操作,将target_mean
DataFrame 根据id
列与测试集进行左连接(left
join),将计算的均值结果合并到测试集中。
5、保存结果文件到本地
test[['id','dt','target']].to_csv('submit.csv', index=None)
test[['id','dt','target']]
:选取测试集中的id
、dt
和合并后的target
列。.to_csv('submit.csv', index=None)
:将选取的列数据保存为 CSV 文件,不保存行索引。
Pandas库
Pandas 是基于 NumPy 的一个数据分析和操作库,提供了快速、灵活和表达力强的数据结构,旨在使数据清洗和分析工作变得更加简单易行。
1、数据结构
- Series:一维标记数组,可以包含任意类型的数据。
- DataFrame:二维标记数据结构,类似于电子表格或 SQL 数据表,具有灵活的行和列索引。
2、数据操作
- 数据的读取和写入:从多种文件格式(如 CSV、Excel、SQL 数据库、JSON 等)读取数据,或将数据写入这些格式。
- 数据选择和过滤:使用类似 SQL 的语法对数据进行选择和过滤。
- 数据清洗:处理缺失值、重复值和异常值。
- 数据转换:例如合并、连接、重塑和透视表操作。
- 数据分组和聚合:对数据进行分组并应用聚合函数,生成汇总结果。
3、时间序列处理
-
Pandas 对时间序列数据有良好的支持,可以轻松进行时间重采样、时区表示和时间序列生成。
4、灵活性和性能
-
Pandas 结合了 NumPy 的高性能数组计算功能,能够高效处理数十万到数百万行的数据。
5、集成性
-
Pandas 可与其它数据分析库(如 NumPy、SciPy 和 Matplotlib)很好地集成使用,使得数据分析工作更加流畅和高效。
Datawhale有一个开源教程项目
NumPy库
NumPy 提供了多维数组对象、派生对象(如掩码数组和矩阵)以及用于快速操作数组的各种例程,包括数学、逻辑、形状操作、排序、选择、I/O、离散傅立叶变换、基本线性代数、基本统计运算、随机模拟等等。
1、多维数组对象(ndarray)
-
NumPy 的核心是 ndarray 对象,是一个具有相同数据类型和固定大小的多维数组。ndarray 支持矢量化操作,这意味着对整个数组执行操作,而不是单个元素,从而提高了计算效率。
2、数学函数
-
NumPy 提供了丰富的数学函数库,用于快速操作整个数组,如统计函数(求和、均值、标准差等)、三角函数、指数和对数函数等。
3、广播(Broadcasting)
-
NumPy 支持不同形状的数组之间的算术运算,通过广播机制使得这些运算能够顺利进行,提高了代码的简洁性和可读性。
4、数据操作
-
NumPy 提供了强大的索引和切片功能,允许对数组的部分数据进行操作,包括选择子集、改变数组形状、合并和分割数组等。
5、集成性和性能
-
NumPy 是在底层用 C 语言编写的,因此在处理大型数据集时具有很高的性能。此外,NumPy 与多个 Python 数据科学库(如 SciPy、Pandas、Matplotlib 等)紧密集成,使得数据分析和科学计算更加便捷。
6、随机数生成
-
NumPy 包含用于生成各种概率分布的随机数的函数,如均匀分布、正态分布等,以及用于随机抽样的函数。
7、线性代数运算
-
NumPy 提供了一组线性代数函数,包括矩阵乘法、求逆、解线性方程组、特征值和特征向量计算等。
pd.read_csv()函数
read_csv
是 Pandas 库中用于从 CSV 文件中读取数据并创建 DataFrame 的函数。CSV(Comma-Separated Values)是一种常见的文本文件格式,用于存储表格数据,每行代表数据中的一条记录,每个字段之间由逗号分隔。
1、文件路径或对象
filepath_or_buffer
:指定要读取的 CSV 文件的路径或对象。可以是本地文件路径、URL、文件型对象(如 StringIO 对象)等。
2、分隔符和格式控制
sep
:指定字段之间的分隔符,默认为逗号(,
)。delimiter
:分隔符的别名,与sep
功能相同。header
:指定作为列名的行号,默认为第一行。可以是整数,表示从零开始的行号,或列表,表示多层列索引。names
:指定列名列表,用于替换文件中的列名。如果文件不包含列名行,则设为 None。index_col
:指定用作行索引的列编号或列名。默认为 None,表示不使用任何列作为行索引。
3、数据类型推断和处理
dtype
:指定列的数据类型。可以是字典,将列名映射到数据类型;或者是 None,表示自动推断数据类型。parse_dates
:指定将哪些列解析为日期时间格式。可以是布尔值、列表或字典。
4、缺失值处理
na_values
:指定应视为缺失值的值列表。
5、其他选项
skiprows
、skipfooter
:跳过文件中的行数或尾部行数。nrows
:要读取的行数。chunksize
:分块读取文件,返回迭代器而不是 DataFrame。
6、返回值
DataFrame
对象:包含了从 CSV 文件读取的数据,每个列对应文件中的一个字段。行索引默认为从 0 开始的整数索引,也可以根据参数设置进行自定义。