数据重塑

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_transformtransform 方法的设计原则类似.

特征衍生

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 完成以下任务:

  • 选择 manufacturermodelclassyearctyhwy 这几个变量,生成一个新的数据框
  • 使用 stringr 包中的函数,新建一列 class_group
    • class 中包含 "suv",则记为 "SUV"
    • class 中包含 "compact",则记为 "Compact"
    • 其余车型记为 "Other"
  • 仅保留 class_group 不为 "Other" 的观测
  • 使用 pivot_longer()ctyhwy 两列整理为长格式,生成新列 mileage_typempg_value
  • mileage_type 中的值改为更易理解的形式:
    • cty 改为 "City"
    • hwy 改为 "Highway"
  • manufacturerclass_groupmileage_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 以及数据重塑相关的全部练习为第一次作业.

Back to top