数据重塑
tidymodels
The tidymodels framework is a collection of packages for modeling and machine learning using tidyverse principles.
tidymodels 系列包提供了数据建模与分析的一整套流程. 主要的包包括:
- recipes: 数据预处理与特征工程
- parsnip: 接口/后端分离的模型指定
- yardstick: 提供各种模型性能指标
- rsample: 基于重采样的模型评估 (如 bootstrap, cross-validation)
- tune: 模型超参数调优
- workflows: 将预处理/建模打包为工作流
recipes
recipes 包用于以声明式 (declarative) 语法组织数据预处理流程. 其基本思想是将”对数据做什么变换”与”何时真正执行这些变换”分离. 现介绍其基本用法
我们先利用 rsample 包切分出训练集和测试集
接下来, 我们基于训练集创建一个 recipe 对象, 并为其添加想要的 step.
此时我们已经完成了一份菜谱, 其中记录了烹饪的步骤. 接下来, 我们需要为其准备调料, 比如中心化和标准化中需要计算出均值和标准差作为调料.
最后, 我们基于这些烹饪步骤和佐料, 真正对数据进行预处理.
之所以要将预处理拆分为 prep()/bake() 是为了将同一套预处理流程用于多个数据集. 比如, 为了防止测试集信息泄露, 在中心化/标准化时应只使用训练集的均值和标准差, 对测试集预处理时也应使用训练集的归一化参数. 这与 sklearn 中 fit_transform 和 transform 方法的设计原则类似.
特征衍生
recipes 提供了一系列特征工程工具:
- step_poly(): 多项式特征
- step_ns(): 自然样条特征
- step_pca(): 主成分特征
- step_interact(): 生成特征交互项
- …
这里以 step_poly() 为例, 在 mtcars 数据集中生成 mpg 的二次项:
类别不平衡问题
themis 包对 recipe 包作补充, 提供了一系列处理不平衡数据的 step.
- 过采样
- step_upsample(): 简单过采样
- step_smote(): SMOTE 算法
- step_smotenc(): SMOTENC 算法
- step_bsmote(): borderline-SMOTE 算法
- step_adasyn(): ADASYN 算法
- step_rose(): ROSE 算法
- 欠采样
- step_downsample(): 简单欠采样
- step_nearmiss(): NearMiss 算法
- step_tomek(): Tomek Links 算法
其和 recipes 中的用法完全一致:
练习
练习 1
使用 ggplot2::mpg 完成以下任务:
- 选择
manufacturer、model、class、year、cty和hwy这几个变量,生成一个新的数据框 - 使用
stringr包中的函数,新建一列class_group- 若
class中包含"suv",则记为"SUV" - 若
class中包含"compact",则记为"Compact" - 其余车型记为
"Other"
- 若
- 仅保留
class_group不为"Other"的观测 - 使用
pivot_longer()将cty和hwy两列整理为长格式,生成新列mileage_type和mpg_value - 将
mileage_type中的值改为更易理解的形式:cty改为"City"hwy改为"Highway"
- 按
manufacturer、class_group和mileage_type分组, 计算每组的:- 样本量
n - 平均油耗水平
mean_mpg - 最大油耗水平
max_mpg
- 样本量
- 仅保留样本量不少于 3 的组别
- 将结果按
mean_mpg从高到低排序
练习 2
使用 modeldata::ames 完成以下任务:
- 划分训练集与测试集
- 以训练集为基础,建立一个以
Sale_Price作为响应变量,以Gr_Liv_Area,Year_Built,Full_Bath,Neighborhood,Bldg_Type作为预测变量的recipe对象 - 对 Gr_Liv_Area 构造二阶多项式特征
- 构造比例特征
bath_ratio = Full_Bath / Gr_Liv_Area - 使用 step_interact() 添加
Gr_Liv_Area:Year_Built交互项 prep()后处理训练集与测试集
练习 3
使用 modeldata::cells 完成以下任务:
- 将
class作为响应变量 - 按
class分层切分训练集与测试集 - 以训练集为基础,建立一个以 class 为响应变量、其余变量为预测变量的基础 recipe
- 将
case变量的 role 设为id - 分别基于同一个基础
recipe添加以下 step, 形成 4 个不同的 recipe 对象:step_upsample(class)step_downsample(class)step_smote(class)step_rose(class)
prep()后得到各自处理后的训练集- 统计原始训练集与 4 种重采样结果中
class的类别分布
tidyverse, ggplot2 以及数据重塑相关的全部练习为第一次作业.