1. Day1学习笔记先行
1.1. 认识需要用到的第三方库
import pandas as pd # 用于处理数据的工具
import lightgbm as lgb # 机器学习模型 LightGBM
from sklearn.metrics import mean_absolute_error # 评分 MAE 的计算函数
from sklearn.model_selection import train_test_split # 拆分训练集与验证集工具
from tqdm import tqdm # 显示循环的进度条工具
1.1.1. pandas:
-
简介:
pandas是一个开源的 Python 数据分析库,提供了快速、灵活和富有表现力的数据结构,设计目的是为了简单、高效地处理结构化的大型数据集,比如时间序列数据、表格数据等。 -
主要特点:
-
提供了两种主要的数据结构:
Series和DataFrame。 -
提供了大量方法对数据进行过滤、聚合、变换等操作。
-
支持时间序列数据。
-
提供数据对齐和缺失数据的处理能力。
1.1.2. lightgbm (Light Gradient Boosting Machine) :
-
简介:
LightGBM是一个梯度提升框架,使用基于学习算法的决策树。它被设计为分布式的,高效的,并且是专门针对大数据而设计的。 -
主要特点:
-
更快的训练速度和更高的效率。
-
使用直方图分箱算法,对数据集进行压缩,加速和减少内存使用。
-
支持并行和 GPU 学习。
-
可以处理大规模数据。
1.1.3. sklearn (scikit-learn) :
-
简介:
scikit-learn是一个开源的 Python 机器学习库,包括简单高效的数据挖掘和数据分析工具。 -
主要特点:
-
包含许多监督和无监督的学习算法。
-
提供了数据预处理、特征选择、模型选择等实用工具。
-
train_test_split用于随机拆分数据集为训练集和测试集。 -
提供了各种模型的评估、验证和比较工具。
1.1.4. tqdm:
-
简介:
tqdm是一个 Python 进度条库,可以在 Python 长循环中添加一个进度提示信息,用户只需要封装任意的迭代器tqdm(iterator)。 -
主要特点:
-
可以与任何可迭代的对象(例如列表、字典、文件等)一起使用。
-
支持多线程和多进程。
-
可以定制进度条的显示格式。
1.2. 新建数据准备
首先设置和数据加载的前期准备工作,接下来通常会进行特征工程、模型训练、评估和预测等步骤。
- 数据加载:
train_dataset = pd.read_csv("./data/train.csv") # 原始训练数据。
test_dataset = pd.read_csv("./data/test.csv") # 原始测试数据(用于提交)。
这部分从指定路径加载训练和测试数据集,并将其存储在两个不同的 DataFrame 中。
- 准备提交数据结构:
submit = pd.DataFrame() # 定义提交的最终数据。
submit["序号"] = test_dataset["序号"] # 对齐测试数据的序号。
这里初始化了一个名为 submit 的空 DataFrame,并为其分配了一个名为“序号”的列,该列与 test_dataset 中的“序号”列相对应。这通常是为了满足某些竞赛或评估框架的提交格式要求。
- 初始化评分存储:
MAE_scores = dict() # 定义评分项。
初始化了一个字典用于后续存储模型的评分。
- 指定预测 标签:
pred_labels = list(train_dataset.columns[-34:]) # 需要预测的标签。
这里定义了一个变量 pred_labels,它包含 train_dataset 最后的34个列名,这意味着预测任务可能是多标签预测,需要对这34个标签进行预测。
- 拆分训练集与验证集:
train_set, valid_set = train_test_split(train_dataset, test_size=0.2) # 拆分数据集。
使用 train_test_split 方法将原始训练数据集分割成两部分:训练集 (train_set) 和验证集 (valid_set)。其中验证集占原始训练数据的20%。
- 设置 LightGBM 参数:
lgb_params = { ... }
这部分设置了 LightGBM 模型的参数。例如,'boosting_type': 'gbdt' 表示使用 GBDT(梯度提升决策树)算法,'metric': 'mae' 表示模型的评估标准为平均绝对误差 (Mean Absolute Error) 等等。具体参数的意义可以在 LightGBM 的官方文档中查阅。
- 禁用训练日志输出:
no_info = lgb.callback.log_evaluation(period=-1) # 禁用训练日志输出。
这一步是为了在训练 LightGBM 模型时禁用日志输出,以便于阅读和分析。
-
构建时间特征函数
这个函数是一个特征工程的函数,专门用于从数据的“时间”列中提取出多个时间相关的特征。下面我为你一步步解读这个函数:
- 函数定义:
def time_feature(data: pd.DataFrame, pred_labels: list=None) -> pd.DataFrame:
函数名为time_feature,有两个参数:data是需要处理的DataFrame数据,pred_labels是需要预测的标签列表,默认为None。
- 函数文档:
函数的文档字符串简要描述了函数的功能、输入参数和输出结果。
- 数据复制:
data = data.copy()
这里先复制一份输入数据,以避免在函数内部对原始数据进行任何意外的修改。
- 删除“序号”列:
data = data.drop(columns=["序号"])
这一步去掉了“序号”这一特征,因为对于模型训练来说,序号可能没有实际意义。
- 提取时间特征:
下面的几行代码都在从“时间”这一列中提取时间相关的特征。
data["时间"] = pd.to_datetime(data["时间"])
首先将时间列的数据转换为pandas可以处理的日期时间格式。
data["month"] = data["时间"].dt.month
data["day"] = data["时间"].dt.day
data["hour"] = data["时间"].dt.hour
data["minute"] = data["时间"].dt.minute
data["weekofyear"] = data["时间"].dt.isocalendar().week.astype(int)
data["dayofyear"] = data["时间"].dt.dayofyear
data["dayofweek"] = data["时间"].dt.dayofweek
data["is_weekend"] = data["时间"].dt.dayofweek // 6
上述代码主要通过pandas的dt属性,提取了月份、日期、小时、分钟、当年第几周、当年第几日、当周第几日、是否为周末等多个时间相关的特征。
- 删除原始“时间”列:
data = data.drop(columns=["时间"])
由于原始的“时间”特征已经被多个新的特征所体现,而且LightGBM无法直接处理这种日期时间格式,所以直接删除了。
- 删除预测 标签:
if pred_labels:
data = data.drop(columns=[*pred_labels])
如果函数被提供了pred_labels参数,即需要预测的标签,那么会从数据中删除这些列。这可能是为了确保在进行模型训练时,不会使用这些标签作为特征。
- 返回处理后的数据:
return data
最后,返回经过上述处理的数据。
-
开始训练模型
这段代码的目的是为了使用LightGBM模型对数据集进行训练,并对测试集进行预测。下面我为你分步解析这段代码:
- 处理测试集时间特征:
test_features = time_feature(test_dataset)
对测试集使用前面定义的time_feature函数来提取时间特征。
- 循环预测 标签:
for pred_label in tqdm(pred_labels):
使用tqdm为循环提供进度条。在循环内部,将对每一个在pred_labels列表中的标签进行训练和预测。
- 处理训练集时间特征与标签:
train_features = time_feature(train_set, pred_labels=pred_labels)
train_labels = train_set[pred_label]
train_data = lgb.Dataset(train_features, label=train_labels)
首先,从训练集中提取时间特征。然后,获取当前预测标签的数据。最后,将特征和标签转化为LightGBM可以接受的数据格式。
- 处理验证集时间特征与 标签:
valid_features = time_feature(valid_set, pred_labels=pred_labels)
valid_labels = valid_set[pred_label]
valid_data = lgb.Dataset(valid_features, label=valid_labels)
与训练集的处理方式相同,处理验证集的数据。
- 模型训练:
model = lgb.train(lgb_params, train_data, 200, valid_sets=valid_data, callbacks=[no_info])
使用lgb.train函数训练模型。这里设置了模型的参数、使用的数据、迭代的次数、验证集、以及回调函数(用于禁止日志输出)。
- 预测验证集与测试集:
valid_pred = model.predict(valid_features, num_iteration=model.best_iteration)
test_pred = model.predict(test_features, num_iteration=model.best_iteration)
使用训练好的模型预测验证集和测试集的结果。这里选择了模型效果最好的迭代次数进行预测。
- 计算预测效果:
MAE_score = mean_absolute_error(valid_pred, valid_labels)
MAE_scores[pred_label] = MAE_score
使用mean absolute error (MAE)计算验证集的预测效果,然后将该评分保存到MAE_scores字典中。
- 保存测试集预测结果:
submit[pred_label] = test_pred
将测试集的预测结果保存到submit DataFrame中。
如上解决后,我们就可以愉快地保存结果并上传科大讯飞平台看看分数啦~
-
夏令营介绍
- 机器学习实践
-
学习亮点
内容:
-
参与顶级赛事:科大讯飞 与 阿里云天池 联合举办的“锂离子电池生产参数调控及生产温度预测挑战赛”
-
竞赛实践:跟datawhale团队进行ML的实践学习,参与科大讯飞挑战赛。并提供baseline代码加以学习,可以一键跑通尝试,再看看baseline的代码逐行解读。
支持:
-
全程直播
-
刻意练习
-
开源学习
-
如何学习
-
必修:
-
三次作业,打卡三次
-
3-5场直播
-
选修:
-
每次选修直播后第二天有小测验
-
小测验满分可参与抽奖
-
学习奖励
个人实践榜单
-
每天一次,Top10、前40%、笔记精选有奖学金与证书。
高校参与排行榜
暑期实践证明
-
优秀笔记分享者
-
某方向Top10%
-
全能奖:不少于2个方向,其一拿到3等奖
实习证明:
-
参与高校宣传,被评为宣传大使
-
参与开源贡献
谁和你一起学习?
4453人参与,205位宣传大使,武大参与人数最多:125人