Datawhale AI夏令营 task2笔记

本任务为使用进阶的机器学习模型lightgbm解决本次问题,以达到更好的预测效果。

涉及的概念

随着大数据时代的到来,机器学习算法在处理海量数据、解决复杂问题上展现出巨大潜力。

其中,梯度提升决策树(Gradient Boosting Decision Trees, GBDT)作为一种集成学习方法,因其卓越的预测性能和泛化能力在诸多领域得到广泛应用。

然而,传统的GBDT算法在处理大规模数据、高维度特征时,往往面临训练效率低下、内存占用过大等问题。为应对这些挑战,微软亚洲研究院于2017年推出LightGBM(Light Gradient Boosting Machine),以其独特的设计和高效的实现,迅速成为业界广受欢迎的GBDT框架。

本次任务也将运用LightGBM来解决问题

1.配置LightGBM环境

!pip install lightgbm==3.3.0

2.导入库

​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')

​

NumPy :

  • 提供支持大型多维数组和矩阵的高性能数学计算
  • 包含大量的数学函数库,用于对数组进行操作

Pandas :

  • 提供数据结构和数据分析工具,特别是用于处理表格数据(如 DataFrame
  • 方便进行数据清洗、转换和分析

LightGBM:

  • 一种高效的梯度提升框架,用于分类、回归和排序任务
  • 在处理大规模数据集时表现优异

Scikit-learn:

  • 提供简单高效的工具,用于数据挖掘和数据分析
  • mean_squared_log_errormean_absolute_errormean_squared_error 是用于评估模型性能的指标,分别计算均方对数误差、平均绝对误差和均方误差

TQDM :

  • 用于显示进度条,便于在循环或长时间运行的任务中查看进度

Sys:

  • 提供对 Python 解释器的访问,可以处理命令行参数和系统特性

OS :

  • 提供与操作系统交互的功能,如文件和目录操作

GC :

  • 提供对垃圾回收器的访问,可以手动控制内存的回收

Argparse :

  • 用于解析命令行参数,使得程序可以从命令行接收输入

Warnings :
- 用于控制警告信息的显示,常用于忽略不必要的警告。

3.数据可视化

  • 通过 pd.read_csv 读取训练数据 train.csv 和测试数据 test.csv
  • 使用 matplotlib.pyplot 绘制了两幅图表:
    1.第一幅图是不同类型 (type) 对应目标变量 (target) 的柱状图
    2.第二幅图是特定ID (00037f39cf) 对应时间 (dt) 和目标值 (target) 的折线图

4.特征工程

特征工程是数据分析中最耗时间和精力的一部分工作。数据和特征决定了机器学习的上限,而模型和算法则是逼近这个上限。因此,特征工程就变得尤为重要了。特征工程的主要工作就是对特征的处理,包括数据的采集,数据预处理,特征选择,甚至降维技术等跟特征有关的工作。

​train = pd.read_csv('./data/data283931/train.csv')
test = pd.read_csv('./data/data283931/test.csv')
#不同type类型对应target的柱状图
import matplotlib.pyplot as plt
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()

​

这里主要构建了 历史平移特征 和 窗口统计特征
1.历史平移特征
历史平移特征指的是将某个特征的过去时间点的值作为新的特征输入到模型中。在时间序列预测任务中,我们可以根据历史数据的值来构造不同时间窗口的特征,比如过去几天、几周或几个月的数据值

而在代码中,通过循环对数据进行历史平移,创建了多个新的特征列,如 last10_target, last11_target 等,这些列分别代表了过去10至29个时间步的目标变量值

2.窗口统计特征
窗口统计特征是指在一定时间窗口内计算数据的统计量,如平均值、最大值、最小值等,并将其作为新的特征加入模型中。通过窗口统计特征,可以捕捉到数据在不同时间跨度内的统计分布,有助于模型更好地理解时间序列数据的整体趋势和周期性

而在代码中,通过计算过去三个时间步目标变量的平均值,生成了一个新的特征列 win3_mean_target,这个特征反映了目标值在时间上的平均变化趋势

然后,将合并后的数据划分为训练集 (train) 和测试集 (test),其中训练集中的 target 不为空,测试集中的 target 为空

5.模型训练与测试集预测

这里选择使用Lightgbm模型,也是通常作为数据挖掘比赛的基线模型,在不需要过程调参的情况的也能得到比较稳定的分数。

  • 在 time_model 函数中,将训练集划分为训练集和验证集,设置了 LightGBM 的参数 (lgb_params),并进行模型训练
  • 使用验证集评估模型效果,并对测试集进行预测
  • 输出验证集的均方误差 (MSE)
​def time_model(clf, 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 = clf.Dataset(trn_x, label=trn_y)
valid_matrix = clf.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,
'verbose' : -1,
}
# 训练模型
model = clf.train(lgb_params, train_matrix, 50000, valid_sets=[train_matrix, valid_matrix], categorical_feature=[], callbacks=[lgb.early_stopping(500), lgb.log_evaluation(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)
return val_pred, test_pred
lgb_oof, lgb_test = time_model(lgb, train, test, train_cols)

​

PS:在训练集和验证集的构建中,由于数据存在时序关系,因此需要严格按照时序进行切分

最后,将测试集的预测结果保存到 submit.csv 文件中,包括 iddttarget 三列

# 保存结果文件到本地
test['target'] = lgb_test
test[['id','dt','target']].to_csv('submit.csv', index=None)

总结:

在代码中学习并使用了lightgbm实现基本的模型训练,并添加了时序问题中常见的特征提取方式,进一步的完成了给定多个房屋对应电力消耗历史N天的相关序列数据等信息,预测房屋对应电力的消耗的任务,也进一步深化了对机器学习的了解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值