task1
一、代码
import pandas as pd
import numpy as np
train = pd.read_csv('train.csv')
test = pd.read_csv('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)
二、代码解释
-
导入库:首先,代码导入了需要用到的库,包括
pandas
(用于数据处理和分析)。 -
读取数据:代码通过使用
pd.read_csv
函数从文件中读取训练集和测试集数据,并将其存储在train.csv
和test.csv
两个数据框中。 -
计算最近时间的用电均值:计算训练数据最近11-20单位时间内对应id的目标均值,可以用来反映最近的用电情况。
-
将用电均值直接作为预测结果:这里使用
merge
函数根据'id'
列将test
和target_mean
两个DataFrame进行左连接,这意味着测试集的所有行都会保留。 -
保存结果文件到本地: 使用
to_csv()
函数将测试集的'id'
、'dt'
和'target'
列保存为CSV文件,文件名为'submit.csv'
。index=None
参数表示在保存时不包含行索引。
三、本赛题是一个典型的时间序列问题
时间序列问题是指对按时间顺序排列的数据点进行分析和预测的问题,往往用来做未来的趋势预测。比如,基于历史股票每天的股价,预测未来股票的价格走向。简单来说,本次赛题的目标很简单清晰——【训练 时序预测模型 助力电力需求预测】电力需求的准确预测对于电网的稳定运行、能源的有效管理以及可再生能源的整合至关重要。
四、常见的时间序列场景有:
-
金融领域:股票价格预测、利率变动、汇率预测等。
-
气象领域:温度、降水量、风速等气候指标的预测。
-
销售预测:产品或服务的未来销售额预测。
-
库存管理:预测库存需求,优化库存水平。
-
能源领域:电力需求预测、石油价格预测等。
-
医疗领域:疾病爆发趋势预测、医疗资源需求预测。
五、时间序列问题的数据往往有如下特点:
-
时间依赖性:数据点之间存在时间上的连续性和依赖性。
-
非平稳性:数据的统计特性(如均值、方差)随时间变化。
-
季节性:数据表现出周期性的模式,如年度、月度或周度。
-
趋势:数据随时间推移呈现长期上升或下降的趋势。
-
周期性:数据可能存在非固定周期的波动。
-
随机波动:数据可能受到随机事件的影响,表现出不确定性。
六、总结
基本了解了大致的流程,知道task1 是采用的传统的时间序列问题的解决方法,通过参与此次电力需求预测项目,我深刻体会到了传统时间序列分析方法在处理这类问题时的独特优势。然而,我也意识到传统方法在某些方面可能存在一定的局限性,如难以处理非线性关系和大规模数据等。因此,在未来的学习和工作中,我将继续探索机器学习等新技术在电力需求预测中的应用,并结合传统方法形成更加全面和有效的解决方案。总之,Datawhale AI 夏令营的电力需求预测项目是一次非常有价值的学习经历。它不仅让我掌握了传统时间序列分析的基本方法和技巧,还激发了我对机器学习等新技术在能源领域应用的浓厚兴趣。我相信这些经验和收获将对我未来的学习和工作产生积极的影响。
task2
本Task中,我们的任务是使用进阶的机器学习模型lightgbm解决本次问题,以达到更好的预测效果。
一、机器学习相关知识
1.机器学习最主要的类别有:监督学习、无监督学习和强化学习
问题
分类问题
分类问题是机器学习非常重要的一个组成部分。它的目标是根据已知样本的某些特征,判断一个新的样本属于哪种已知的样本类。分类问题可以细分如下:
二分类问题:是最简单的分类问题,其中输出标签只有两个类别。例如,判断一封电子邮件是否为垃圾邮件(是/否)、判断一个图像是否包含猫(是/否)等。在二分类问题中,常用的算法包括逻辑回归、支持向量机(SVM)、决策树、随机森林和神经网络等。
多类分类问题:涉及将输入数据分配给多个类别中的一个。例如,手写数字识别(0-9)、图像分类(狗、猫、鸟等)、文本情感分析(正面、中性、负面)等。在处理多分类问题时,一些算法可以直接应用(如决策树、随机森林、神经网络),而一些原本用于二分类的算法(如逻辑回归、SVM)则需要通过一些策略(如一对多、一对一等)来扩展到多分类问题。
多标签分类问题:多标签分类问题是指一个输入数据可以同时属于多个类别。这与多分类问题不同,后者要求每个输入数据只能属于一个类别。例如,一篇新闻文章可以同时被标记为“政治”和“经济”两个类别。处理多标签分类问题通常需要特殊的算法或策略,如将问题转换为多个二分类问题、使用链式分类器或采用特殊的神经网络架构(如多标签神经网络)。
回归问题
定义:是一种有监督学习问题,其中模型的训练数据由一系列的特征(自变量)和对应的连续值目标(因变量)组成。
类型:线性回归和非线性回归
聚类问题
一种无监督学习问题,其目标是将数据集中的样本划分为若干个组或簇(clusters),使得同一簇内的样本相似度较高,而不同簇之间的样本相似度较低。聚类问题不需要事先定义好类别标签,而是根据数据本身的特性自动发现数据的内在结构和分布规律。
聚类算法可以根据不同的标准和原则进行分类,常见的分类方式包括:
- 基于划分的聚类
- 基于层次的聚类
- 基于密度的聚类
- 基于网格的聚类
- 基于模型的聚类
降维问题
降维方法分类
降维方法可以分为线性和非线性两大类:
- 线性降维方法:
- 主成分分析(PCA):通过线性变换将原始数据映射到由主成分构成的低维空间中,每个主成分都是原始数据的一个线性组合,且各主成分之间互不相关。
- 线性判别分析(LDA):一种有监督的降维方法,通过最大化类间散度与类内散度的比值来找到最佳的投影方向,使得投影后的数据在同类样本之间尽可能接近,在不同类样本之间尽可能远离。
- 非线性降维方法:
- t-分布邻域嵌入(t-SNE):通过计算数据点之间的相似度并将其映射到低维空间中,使得在高维空间中相似的数据点在低维空间中仍然保持相似。适合于可视化高维数据的复杂结构。
- 局部线性嵌入(LLE):假设每个数据点都可以由其邻近数据点的线性组合来近似表示,通过保持这种局部线性关系来将数据映射到低维空间。
过拟合
过拟合,指的是模型在训练集上表现的很好,但是在交叉验证集合测试集上表现一般。
使用机器学习方法有哪几个步骤?
一般的使用机器学习模型解决问题的主要步骤为探索性数据分析、数据预处理、提取特征、切分训练集与验证集、训练模型、预测结果。
LightGBM
LightGBM(Light Gradient Boosting Machine)是一个实现GBDT算法的框架,支持高效率的并行训练,并且具有更快的训练速度、更低的内存消耗、更好的准确率、支持分布式可以快速处理海量数据等优点。
LightGBM 框架中还包括随机森林和逻辑回归等模型。通常应用于二分类、多分类和排序等场景。
二、代码
全部代码
import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.metrics import mean_squared_log_error, mean_absolute_error, mean_squared_error
import tqdm
import sys
import os
import gc
import argparse
import warnings
warnings.filterwarnings('ignore')
train = pd.read_csv('./data/data283931/train.csv')
test = pd.read_csv('./data/data283931/test.csv')
import matplotlib.pyplot as plt
# 不同type类型对应target的柱状图
type_target_df = train.groupby('type')['target'].mean().reset_index()
plt.figure(figsize=(8, 4))
plt.bar(type_target_df['type'], type_target_df['target'], color=['blue', 'green'])
plt.xlabel('Type')
plt.ylabel('Average Target Value')
plt.title('Bar Chart of Target by Type')
plt.show()
specific_id_df = train[train['id'] == '00037f39cf']
plt.figure(figsize=(10, 5))
plt.plot(specific_id_df['dt'], specific_id_df['target'], marker='o', linestyle='-')
plt.xlabel('DateTime')
plt.ylabel('Target Value')
plt.title("Line Chart of Target for ID '00037f39cf'")
plt.show()
# 合并训练数据和测试数据,并进行排序
data = pd.concat([test, train], axis=0, ignore_index=True)
data = data.sort_values(['id','dt'], ascending=False).reset_index(drop=True)
# 历史平移
for i in range(10,30):
data[f'last{i}_target'] = data.groupby(['id'])['target'].shift(i)
# 窗口统计
data[f'win3_mean_target'] = (data['last10_target'] + data['last11_target'] + data['last12_target']) / 3
# 进行数据切分
train = data[data.target.notnull()].reset_index(drop=True)
test = data[data.target.isnull()].reset_index(drop=True)
# 确定输入特征
train_cols = [f for f in data.columns if f not in ['id','target']]
def time_model(lgb, train_df, test_df, cols):
# 训练集和验证集切分
trn_x, trn_y = train_df[train_df.dt>=31][cols], train_df[train_df.dt>=31]['target']
val_x, val_y = train_df[train_df.dt<=30][cols], train_df[train_df.dt<=30]['target']
# 构建模型输入数据
train_matrix = lgb.Dataset(trn_x, label=trn_y)
valid_matrix = lgb.Dataset(val_x, label=val_y)
# lightgbm参数
lgb_params = {
'boosting_type': 'gbdt',
'objective': 'regression',
'metric': 'mse',
'min_child_weight': 5,
'num_leaves': 2 ** 5,
'lambda_l2': 10,
'feature_fraction': 0.8,
'bagging_fraction': 0.8,
'bagging_freq': 4,
'learning_rate': 0.05,
'seed': 2024,
'nthread' : 16,
}
# 训练模型
callbacks = [lgb.early_stopping(stopping_rounds=500, verbose=1)]
model = lgb.train(lgb_params, train_matrix, 50000, valid_sets=[valid_matrix],
categorical_feature=[], callbacks=callbacks)
# 验证集和测试集结果预测
val_pred = model.predict(val_x, num_iteration=model.best_iteration)
test_pred = model.predict(test_df[cols], num_iteration=model.best_iteration)
# 离线分数评估
score = mean_squared_error(val_pred, val_y)
print(score)
return val_pred, test_pred
lgb_oof, lgb_test = time_model(lgb, train, test, train_cols)
# 保存结果文件到本地
test['target'] = lgb_test
test[['id','dt','target']].to_csv('submit.csv', index=None)
运行结果:
提交结果评分:
遇到的问题及解决方法:找不到lightgbm库 下载命令pip install lightgbm