Datawhale AI 夏令营——电力需求挑战赛学习笔记

一、赛事任务

给定多个房屋对应电力消耗历史N天的相关序列数据等信息,预测房屋对应电力的消耗。

1.数据说明

赛题数据由训练集和测试集组成,为了保证比赛的公平性,将每日日期进行脱敏,用1-N进行标识,即1为数据集最近一天,其中1-10为测试集数据。数据集由字段id(房屋id)、 dt(日标识)、type(房屋类型)、target(实际电力消耗)组成。

特征字段字段描述
id房屋id
dt日标识
type房屋类型
target实际电力消耗,预测目标

训练集如下:

测试集如下:

2.评审规则

预测结果以 mean square error 作为评判标准,具体公式如下:

\frac1n\sum_{n=1}^n{(y_i-\bar{y_i})^2},其中y_{i}是真实电力消耗,\bar{y_i}是预测电力消耗。

二、Baseline代码学习笔记

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()#首先,从 train 中筛选出 dt 列的值小于或等于 20 的所有行。然后,按 id 列进行分组。分组后,对于每个 id 对应的组,计算 target 列的均值。最后,通过 reset_index() 方法将分组后的结果转换为一个新的 DataFrame。
test = test.merge(target_mean, on=['id'], how='left')#使用merge函数将target_mean DataFrame与test DataFrame进行合并。合并的依据是id列,合并的方式是左连接。
test[['id','dt','target']].to_csv('submit.csv', index=None)#设置index=None以避免将索引也写入到CSV文件中。

数据和特征决定机器学习的上限,模型和算法逼近上限。

一般的使用机器学习模型解决问题的主要步骤为:探索性数据分析、数据预处理、提取特征、切分训练集与验证集、训练模型、预测结果。

GBDT(梯度提升决策树)

GBDT (Gradient Boosting Decision Tree) 是机器学习中的一个模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。其在工业界应用广泛,通常被用于多分类、点击率预测、搜索排序等任务;在各种数据挖掘竞赛中也是致命武器。

LightGBM

LightGBM(Light Gradient Boosting Machine)是一个实现GBDT算法的框架,支持高效率的并行训练,并且具有更快的训练速度、更低的内存消耗、更好的准确率、支持分布式可以快速处理海量数据、不用手动处理缺失值等优点。LightGBM 框架中还包括随机森林和逻辑回归等模型。通常应用于二分类、多分类和排序等场景。

三、进阶代码学习笔记

库的下载和调用

!pip install lightgbm == 3.3.0
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#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/train.csv')
test = pd.read_csv('./data/test.csv')

数据可视化处理

import matplotlib.pyplot as plt
type_target_df = train.groupby('type')['target'].mean().reset_index()#按type进行分组,并计算每个组的target列的平均值
plt.figure(figsize=(8, 4))#创建一个8英寸宽、4英寸高的图形窗口
plt.bar(type_target_df['type'], type_target_df['target'], color=['blue', 'green'])#创建一个条形图,横轴分别为type和target的值
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='-')#创建一个折线图,横轴分别为dt和target,指定数据点用圆圈表示,线性类型为实线
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)#按照id和dt列进行降序排序,然后重置索引。    
for i in range(10,30):
    data[f'last{i}_target'] = data.groupby(['id'])['target'].shift(i)# 历史平移特征,在data中循环创建last{i}_target列,每列按照id分组,并且每组target前移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']]# 确定输入特征

模型训练与测试集预测(Lightgbm)

def time_model(lgb, train_df, test_df, cols):#函数time_model接收LightGBM(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']#按时间dt划分训练集和验证集。dt值大于等于31的作为训练集(trn_x, trn_y),小于等于30的作为验证集(val_x, val_y)。因为数据存在时序关系,所以需要严格按照时序进行切分,这里选择原始给出训练数据集中dt为30之后的数据作为训练数据,之前的数据作为验证数据,这样保证了数据不存在穿越问题(不使用未来数据预测历史数据)。
    train_matrix = lgb.Dataset(trn_x, label=trn_y)
    valid_matrix = lgb.Dataset(val_x, label=val_y)#将训练和验证数据转换为LightGBM数据格式 Dataset
    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,
        'verbose' : -1,
    }#定义LightGBM的训练参数。
    model = lgb.train(lgb_params, train_matrix, 50000, valid_sets=[train_matrix, valid_matrix], categorical_feature=[], verbose_eval=500, early_stopping_rounds=500)#使用设定的参数和数据集进行训练。early_stopping_rounds=500表示如果验证集误差在500轮内没有改善,那么停止训练。
    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)#计算验证集上的均方误差(MSE),并打印出来。
    return val_pred, test_pred    
lgb_oof, lgb_test = time_model(lgb, train, test, train_cols)
test['target'] = lgb_test #将测试集上的预测结果 lgb_test 保存到 test 数据集中
test[['id','dt','target']].to_csv('submit.csv', index=None)

四、思考

1.数据预处理方面可以多做些统计,比如窗口数量、最大值、最小值、方差、差分等

2.如果数据不方穿越的话模型可以按照k-交叉验证式处理

3.用模型融合的方式优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值