DataWhale ML Day1 笔记——by Mr_Darcy

381 阅读8分钟

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 数据分析库,提供了快速、灵活和富有表现力的数据结构,设计目的是为了简单、高效地处理结构化的大型数据集,比如时间序列数据、表格数据等。

  • 主要特点

  • 提供了两种主要的数据结构:SeriesDataFrame

  • 提供了大量方法对数据进行过滤、聚合、变换等操作。

  • 支持时间序列数据。

  • 提供数据对齐和缺失数据的处理能力。

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. 新建数据准备

首先设置和数据加载的前期准备工作,接下来通常会进行特征工程、模型训练、评估和预测等步骤。

  1. 数据加载:
train_dataset = pd.read_csv("./data/train.csv") # 原始训练数据。
test_dataset = pd.read_csv("./data/test.csv")  # 原始测试数据(用于提交)。

这部分从指定路径加载训练和测试数据集,并将其存储在两个不同的 DataFrame 中。

  1. 准备提交数据结构:
 submit = pd.DataFrame() # 定义提交的最终数据。
 submit["序号"] = test_dataset["序号"] # 对齐测试数据的序号。

这里初始化了一个名为 submit 的空 DataFrame,并为其分配了一个名为“序号”的列,该列与 test_dataset 中的“序号”列相对应。这通常是为了满足某些竞赛或评估框架的提交格式要求。

  1. 初始化评分存储:
MAE_scores = dict() # 定义评分项。

初始化了一个字典用于后续存储模型的评分。

  1. 指定预测 标签:
pred_labels = list(train_dataset.columns[-34:]) # 需要预测的标签。

这里定义了一个变量 pred_labels,它包含 train_dataset 最后的34个列名,这意味着预测任务可能是多标签预测,需要对这34个标签进行预测。

  1. 拆分训练集与验证集:
train_set, valid_set = train_test_split(train_dataset, test_size=0.2) # 拆分数据集。

使用 train_test_split 方法将原始训练数据集分割成两部分:训练集 (train_set) 和验证集 (valid_set)。其中验证集占原始训练数据的20%。

  1. 设置 LightGBM 参数:
lgb_params = { ... }

这部分设置了 LightGBM 模型的参数。例如,'boosting_type': 'gbdt' 表示使用 GBDT(梯度提升决策树)算法,'metric': 'mae' 表示模型的评估标准为平均绝对误差 (Mean Absolute Error) 等等。具体参数的意义可以在 LightGBM 的官方文档中查阅。

  1. 禁用训练日志输出:
no_info = lgb.callback.log_evaluation(period=-1) # 禁用训练日志输出。

这一步是为了在训练 LightGBM 模型时禁用日志输出,以便于阅读和分析。

  1. 构建时间特征函数

这个函数是一个特征工程的函数,专门用于从数据的“时间”列中提取出多个时间相关的特征。下面我为你一步步解读这个函数:

  1. 函数定义:
def time_feature(data: pd.DataFrame, pred_labels: list=None) -> pd.DataFrame:

函数名为time_feature,有两个参数:data是需要处理的DataFrame数据,pred_labels是需要预测的标签列表,默认为None。

  1. 函数文档:

函数的文档字符串简要描述了函数的功能、输入参数和输出结果。

  1. 数据复制:
data = data.copy() 

这里先复制一份输入数据,以避免在函数内部对原始数据进行任何意外的修改。

  1. 删除“序号”列:
data = data.drop(columns=["序号"])

这一步去掉了“序号”这一特征,因为对于模型训练来说,序号可能没有实际意义。

  1. 提取时间特征:

下面的几行代码都在从“时间”这一列中提取时间相关的特征。

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属性,提取了月份、日期、小时、分钟、当年第几周、当年第几日、当周第几日、是否为周末等多个时间相关的特征。

  1. 删除原始“时间”列:
data = data.drop(columns=["时间"])

由于原始的“时间”特征已经被多个新的特征所体现,而且LightGBM无法直接处理这种日期时间格式,所以直接删除了。

  1. 删除预测 标签:
if pred_labels:
    data = data.drop(columns=[*pred_labels])

如果函数被提供了pred_labels参数,即需要预测的标签,那么会从数据中删除这些列。这可能是为了确保在进行模型训练时,不会使用这些标签作为特征。

  1. 返回处理后的数据:
return data

最后,返回经过上述处理的数据。

  1. 开始训练模型

这段代码的目的是为了使用LightGBM模型对数据集进行训练,并对测试集进行预测。下面我为你分步解析这段代码:

  1. 处理测试集时间特征:
test_features = time_feature(test_dataset)

对测试集使用前面定义的time_feature函数来提取时间特征。

  1. 循环预测 标签:
for pred_label in tqdm(pred_labels):

使用tqdm为循环提供进度条。在循环内部,将对每一个在pred_labels列表中的标签进行训练和预测。

  1. 处理训练集时间特征与标签:
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可以接受的数据格式。

  1. 处理验证集时间特征与 标签:
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)

与训练集的处理方式相同,处理验证集的数据。

  1. 模型训练:
model = lgb.train(lgb_params, train_data, 200, valid_sets=valid_data, callbacks=[no_info])

使用lgb.train函数训练模型。这里设置了模型的参数、使用的数据、迭代的次数、验证集、以及回调函数(用于禁止日志输出)。

  1. 预测验证集与测试集:
valid_pred = model.predict(valid_features, num_iteration=model.best_iteration)
test_pred = model.predict(test_features, num_iteration=model.best_iteration)

使用训练好的模型预测验证集和测试集的结果。这里选择了模型效果最好的迭代次数进行预测。

  1. 计算预测效果:
MAE_score = mean_absolute_error(valid_pred, valid_labels)
MAE_scores[pred_label] = MAE_score

使用mean absolute error (MAE)计算验证集的预测效果,然后将该评分保存到MAE_scores字典中。

  1. 保存测试集预测结果:
submit[pred_label] = test_pred

将测试集的预测结果保存到submit DataFrame中。

如上解决后,我们就可以愉快地保存结果并上传科大讯飞平台看看分数啦~

image.png

  1. 夏令营介绍

  • 机器学习实践
  1. 学习亮点

内容:

  • 参与顶级赛事:科大讯飞 与 阿里云天池 联合举办的“锂离子电池生产参数调控及生产温度预测挑战赛”

  • 竞赛实践:跟datawhale团队进行ML的实践学习,参与科大讯飞挑战赛。并提供baseline代码加以学习,可以一键跑通尝试,再看看baseline的代码逐行解读。

支持:

  • 全程直播

  • 刻意练习

  • 开源学习

  1. 如何学习

  • 必修:

  • 三次作业,打卡三次

  • 3-5场直播

  • 选修:

  • 每次选修直播后第二天有小测验

  • 小测验满分可参与抽奖

  1. 学习奖励

个人实践榜单

  • 每天一次,Top10、前40%、笔记精选有奖学金与证书。

高校参与排行榜

暑期实践证明

  • 优秀笔记分享者

  • 某方向Top10%

  • 全能奖:不少于2个方向,其一拿到3等奖

实习证明:

  • 参与高校宣传,被评为宣传大使

  • 参与开源贡献

谁和你一起学习?

4453人参与,205位宣传大使,武大参与人数最多:125人