3 min read

技术:建模流程实战

技术 系列导航

1 技术:Poisson分布、回归Python实现 2017-12-20
2 技术:beta系数理解 2017-12-21
3 技术:Python List剔除重复值 2017-12-21
4 技术:t-SNE处理高维数据可视化 2017-12-21
5 技术:用R语言进行文件系统管理 2017-12-21
6 技术:fct_lump分箱使用方法 2017-12-22
7 技术:F1分数为什么可以看不平衡样本的预测能力 2017-12-27
8 技术:Fisher的一个矩阵预算 2017-12-27
9 技术:case_when使用方法 2017-12-28
10 技术:Python接口函数 2017-12-28
11 技术:fct_relevel调整对照组,批量的方案 2017-12-30
12 技术:python中变量批量处理集成方案 2017-12-30
13 技术:Python接口函数-中台 2018-01-03
14 技术:使用pbd包进行debug 2018-01-03
15 技术:R实现随机分组 2018-01-04
16 技术:jiebaR包做文本清洗 2018-01-05
17 技术:r_WACC使用说明 2018-01-05
18 技术:使用switchhost安装host 2018-01-05
19 技术:Git的下载问题 2018-01-06
20 技术:新闻爬虫 2018-01-07
21 技术:Scalable Data Processing in R 2018-01-08
22 技术:使用git创建一个自己的本地仓库 2018-01-11
23 技术:dashboard构建,来自yihui的包 2018-01-12
24 技术:最大似然估计再理解 2018-01-12
25 技术:itchat包提取微信好友公开数据 2018-01-13
26 技术:do函数和biglm包 2018-01-17
27 技术:Imputer后X少了一列 2018-01-18
28 技术:mac连接mysql,理论上win7也可以 2018-01-19
29 技术:ggpubr提高作图效率 2018-01-20
30 技术:t-SNE理论部分补充 2018-01-22
31 技术:RMarkdown的使用技巧 2018-01-30
32 技术:通过anova检验,理解R2、R_adj.2、F值 2018-01-31
33 技术:ggridges 山峦图 学习笔记 2018-02-02
34 技术:Tidyverse使用技巧 2018-02-02
35 技术:XGBoost 学习笔记 2018-02-02
36 技术:分布变离散,或者纠正skew 2018-02-02
37 技术:rsq在R中自定义函数 2018-02-03
38 技术:Jupyter实战 2018-02-13
39 技术:美化与定制 2018-02-21
40 技术:数据对比可视化指南 2018-02-22
41 技术:功能体验 2018-02-26
42 技术:高效数据处理 2018-02-27
43 技术:模型优化技巧 2018-03-05
44 技术:原理与应用 2018-03-06
45 技术:模型与可视化 2018-03-08
46 技术:美化与交互指南 2018-03-11
47 技术:高效操作指南 2018-03-14
48 技术:用法与优化技巧 2018-03-17
49 技术:效率提升指南 2018-03-18
50 技术:问题排查技巧 2018-03-18
51 技术:高效操作指南 2018-03-19
52 技术:方法与代码示例 2018-03-21
53 技术:进阶技巧与优化 2018-03-21
54 技术:实战示例 2018-03-22
55 技术:效率与规范指南 2018-03-24
56 技术:dplython包测评 2018-03-25
57 技术:原理与实现 2018-04-02
58 技术:原理与应用解析 2018-04-03
59 技术:实战指南 2018-04-05
60 技术:核心语法与函数整理 2018-04-05
61 技术:复利计算与应用 2018-04-08
62 技术:简单规则模型解析 2018-04-14
63 技术:高效代码设计指南 2018-04-25
64 技术:原理与应用学习笔记 2018-04-29
65 技术:实战指南 2018-04-29
66 技术:原理与应用 2018-05-01
67 技术:表格格式化指南 2018-05-02
68 技术:原理与应用介绍 2018-05-08
69 技术:高效文本拼接 2018-05-11
70 技术:方法与实践学习笔记 2018-05-12
71 技术:方法与工具 2018-05-12
72 技术:功能解析 2018-05-17
73 技术:高效数据输入 2018-05-21
74 技术:基础模型与方法 2018-05-22
75 技术:功能与使用体验 2018-05-26
76 技术:特征筛选学习笔记 2018-05-29
77 技术:实战技巧 2018-05-30
78 技术:建模思路解析 2018-06-03
79 技术:策略与实战 2018-06-03
80 技术:数据展示指南 2018-06-04
81 技术:包与环境配置指南 2018-07-14
82 技术:高效操作指南 2018-07-19
83 技术:方法与案例解析 2018-07-24
84 技术:统计建模学习笔记 2018-07-24
85 技术:展示技巧与原则 2018-08-10
86 技术:数据采集实战技巧 2018-08-21
87 技术:指标设计学习笔记 2018-09-20
88 技术:大规模数据探索 2018-10-20
89 技术:文本提取与分析 2018-10-20
90 技术:原理与R实现实战 2018-10-21
91 技术:学习资源获取技巧 2018-10-23
92 技术:深度学习模型实战 2018-10-24
93 技术:实战指南 2018-10-30
94 技术:分析与展示指南 2018-11-03
95 技术:图片编辑与转换 2018-11-03
96 技术:安装与使用基础学习笔记 2018-11-07
97 技术:非结构化数据处理 2018-11-29
98 技术:表格美化技巧 2018-12-13
99 技术:分类数据可视化 2018-12-24
100 技术:流程图绘制技巧 2018-12-24
101 技术:自动化设置 2018-12-28
102 技术:协作与版本控制 2018-12-29
103 技术:pipeline设计 2018-12-30
104 技术:Git历史记录清理 2018-12-31
105 技术:AUC指标对比 2019-01-01
106 技术:时间序列可视化 2019-01-01
107 技术:变量命名工具指南 2019-01-02
108 技术:网页自动化截图 2019-01-02
109 技术:配置与优化 2019-01-03
110 技术:原理与应用 2019-01-07
111 技术:语法与核心概念 2019-01-14
112 技术:R包徽章设计 2019-01-15
113 技术:项目结构设计 2019-01-21
114 技术:文本分类基础任务 2019-01-22
115 技术:线性与非线性模型 2019-01-22
116 技术:有效性验证 2019-01-27
117 技术:评估与应用 2019-01-29
118 技术:循环神经网络入门 2019-01-30
119 技术:长短期记忆网络入门 2019-01-30
120 技术:for循环示例 2019-02-03
121 技术:基础到进阶 2019-02-06
122 技术:查询与整合 2019-02-06
123 技术:方法与案例 2019-02-14
124 技术:R包高效开发指南 2019-02-20
125 技术:解析与操作 2019-02-20
126 技术:训练与预测 2019-02-25
127 技术:原理与代码 2019-02-26
128 技术:GitHub个人访问令牌(PAT)设置 2019-03-04
129 技术:方法与工具 2019-03-07
130 技术:文本特征提取示例 2019-03-08
131 技术:基础任务示例 2019-03-18
132 技术:条形图与表头设计 2019-03-20
133 技术:连续与分类变量差异 2019-03-30
134 技术:思路与方法 2019-04-08
135 技术:方法与工具 2019-04-15
136 技术:多格式读取 2019-04-16
137 技术:方法与工具 2019-05-11
138 技术:Git/GitHub/GitLab 2019-05-13
139 技术:命令与操作 2019-05-19
140 技术:协作与版本控制 2019-05-26
141 技术:语法与实践 2019-06-28
142 技术:功能与API 2019-07-13
143 技术:安装与使用 2019-07-24
144 读《未来简史》:技术与未来 2019-09-14
145 技术:高效数据处理 2019-10-09
146 技术:性能优化技巧 2019-10-12
147 技术:配置与运维 2019-10-29
148 技术:原理与经典模型 2019-12-25
149 技术:构建到发布流程 2019-12-26
150 技术:方法与案例 2019-12-27
151 技术:命令与自动化 2019-12-30
152 技术:Pandas数据处理实战指南 2020-01-19
153 技术:特征工程之目标编码学习笔记 2020-01-20
154 技术:文档编写与美化 2020-01-28
155 技术:核心算法与应用 2020-01-29
156 技术:流程图绘制技巧 2020-01-29
157 技术:DataCamp课程笔记 2020-01-31
158 技术:Python实用代码片段合集 2020-01-31
159 技术:自动化构建流程 2020-02-02
160 技术:自动化工作流配置 2020-02-04
161 技术:高效查找代码与项目 2020-02-11
162 技术:代码环境快速部署 2020-02-24
163 技术:USD数据分析论文收录暨GitBook发布 2020-05-02
164 游记:西安博物院(5)西汉器物工艺到新莽技术应用 2020-10-01
165 技术:Causal Forest 2021-03-18
166 技术小团队人才培养思考:压力・复盘・沉淀 2024-05-21
167 BJ Fogg模型:从说服技术理论到行为设计实践 2024-11-24
168 管理视角:技术团队的核心交付是什么 2025-02-13
169 研读毛选:核心技术三大特征 2025-03-28

本文于2026-03-28更新。 如发现问题或者有建议,欢迎提交 Issue

knitr::opts_chunk$set(warning = FALSE, message = FALSE, eval=F)
library(dlstats)
rsample_download_data <- cran_stats(c('rsample','recipes'))
library(tidyverse)
library(lubridate)
rsample_download_data %>% 
    filter(end < floor_date(now(),unit = 'month')) %>% 
    ggplot(aes(end,downloads)) + 
    geom_line() + 
    facet_wrap(~package,scales = 'free_y') +
    theme_bw() + 
    labs(title = "tidymodel package's downlaod increases by month.")

rsample

Cross Validation

bootstraps函数增加内存很少,如以下这个Github例子。

library(rsample)
library(mlbench) # 提取数据 LetterRecognition
library(pryr) # 使用函数 object_size
data(LetterRecognition)
object_size(LetterRecognition)
set.seed(35222)
boots <- bootstraps(LetterRecognition, times = 50)
object_size(boots)
boots %>% head
as.numeric(object_size(boots)/object_size(LetterRecognition))

splits需要加一个as.data.frame

bootstraps(mtcars,times=2) %>% 
  .$splits %>% 
  .[1] %>% 
  as.data.frame()

数据预处理

The recipes package contains a data preprocessor that can be used to avoid the potentially expensive formula methods as well as providing a richer set of data manipulation tools than base R can provide. [@KuhnRecipes]

recipes包主要是为了

  1. 避免花大量时间构建模型和
  2. 提高很多数据处理的方式

我认为后面一个是非常方便的。

  1. signal extraction using principal component analysis
  2. imputation of missing values
  3. transformations of individual variables (e.g. Box-Cox transformations) [@KuhnRecipes]

recipes包的函数可以对x变量的进行修正,这里进行举例。

library(AmesHousing)
ames <- make_ames()
names(ames)
log10(Sale_Price) ~ Neighborhood + House_Style + Year_Sold + Lot_Area
library(ggplot2)
theme_set(theme_bw())
ggplot(ames, aes(x = Lot_Area)) + 
  geom_histogram(binwidth = 5000, col = "red", fill ="red", alpha = .5)
  1. theme_bw() 这个图看起来很不错。
  2. 有很常见的右偏,可以使用 Box-Cox 方式进行修正。
ggplot(ames, aes(x = Neighborhood)) + geom_bar() + coord_flip() + xlab("")
  1. 可以发现,有些频率小的level,最后都要剔除。

根据以上问题,下面继续数据处理。

library(recipes)

rec <- recipe(Sale_Price ~ Neighborhood + House_Style + Year_Sold + Lot_Area, 
              data = ames) %>%
  # Log the outcome
  step_log(Sale_Price, base = 10) %>%
  # Collapse rarely occurring jobs into "other"
  step_other(Neighborhood, House_Style, threshold = 0.05) %>%
  # Dummy variables on the qualitative predictors
  step_dummy(all_nominal()) %>%
  # 相当于一键 one-hot
  # Unskew a predictor
  step_BoxCox(Lot_Area) %>%
  # Normalize
  step_center(all_predictors()) %>%
  step_scale(all_predictors()) 
rec
  1. recipe(,...,data=)这样会更直接,定义好模型,但是先不定义算法类型,跟符合现实逻辑。
  2. step_other(threshold = )让低频率的并入,这样就可以保证无论之后,开发集产生unknown的level几率会非常小。
  3. step_BoxCox转换成unskew的。
  4. step_centerstep_scale进行标准化。

While the original data object ames is used in the call, it is only used to define the variables and their characteristics so a single recipe is valid across all resampled versions of the data. The recipe can be estimated on the analysis component of the resample. [@KuhnRecipes]

这里解决了一个实际问题。

recipe函数中虽然使用了数据ames,但是只是用来定义变量和变量的特性,因此recipe反馈的规则可以应用到其他的数据集或者resample上。 这点就解决了测试集需要统一的问题。

rec_training_set <- prep(rec, training = ames, retain = TRUE, verbose = TRUE)
rec_training_set

prep函数是对某一个数据执行规则的意思。

bake(rec_training_set, newdata = head(ames))
ames %>% head %>%
    select(Neighborhood,House_Style,Year_Sold,Lot_Area)
  1. bake反馈到处理结果到newdata上。相当于predict
  2. 并且NeighborhoodHouse_Style进行了one-hot
juice(rec_training_set) %>% head
  1. juice相当于fitted

整合进模型训练

library(rsample)
set.seed(7712)
bt_samples <- bootstraps(ames)
bt_samples
bt_samples$splits[[1]]

这是切分点的选取。

library(purrr)

bt_samples$recipes <- map(bt_samples$splits, prepper, recipe = rec, retain = TRUE, verbose = FALSE)
bt_samples

只要rec定义好整个函数是很好理解的。

bt_samples$recipes[[1]]

prepperprep的替代品,主要是为了对split的函数,进行执行变量和变量特性的修改。

fit_lm <- function(rec_obj, ...) 
  lm(..., data = juice(rec_obj, everything()))

bt_samples$lm_mod <- 
  map(
    bt_samples$recipes, 
    fit_lm, 
    Sale_Price ~ .
  )
bt_samples

学习fit_lm的函数中...的构建和位置。

pred_lm <- function(split_obj, rec_obj, model_obj, ...) {
  mod_data <- bake(
    rec_obj, 
    newdata = assessment(split_obj),
    all_predictors(),
    all_outcomes()
  ) 
  
  out <- mod_data %>% select(Sale_Price)
  out$predicted <- predict(model_obj, newdata = mod_data %>% select(-Sale_Price))
  out
}

bt_samples$pred <- 
  pmap(
    lst(
      split_obj = bt_samples$splits, 
      rec_obj = bt_samples$recipes, 
      model_obj = bt_samples$lm_mod
    ),
    pred_lm 
  )
bt_samples
rmse <- function(dat) 
  sqrt(mean((dat$Sale_Price - dat$predicted)^2))
bt_samples$RMSE <- map_dbl(bt_samples$pred, rmse)
summary(bt_samples$RMSE)

技术 系列导航

1 技术:Poisson分布、回归Python实现 2017-12-20
2 技术:beta系数理解 2017-12-21
3 技术:Python List剔除重复值 2017-12-21
4 技术:t-SNE处理高维数据可视化 2017-12-21
5 技术:用R语言进行文件系统管理 2017-12-21
6 技术:fct_lump分箱使用方法 2017-12-22
7 技术:F1分数为什么可以看不平衡样本的预测能力 2017-12-27
8 技术:Fisher的一个矩阵预算 2017-12-27
9 技术:case_when使用方法 2017-12-28
10 技术:Python接口函数 2017-12-28
11 技术:fct_relevel调整对照组,批量的方案 2017-12-30
12 技术:python中变量批量处理集成方案 2017-12-30
13 技术:Python接口函数-中台 2018-01-03
14 技术:使用pbd包进行debug 2018-01-03
15 技术:R实现随机分组 2018-01-04
16 技术:jiebaR包做文本清洗 2018-01-05
17 技术:r_WACC使用说明 2018-01-05
18 技术:使用switchhost安装host 2018-01-05
19 技术:Git的下载问题 2018-01-06
20 技术:新闻爬虫 2018-01-07
21 技术:Scalable Data Processing in R 2018-01-08
22 技术:使用git创建一个自己的本地仓库 2018-01-11
23 技术:dashboard构建,来自yihui的包 2018-01-12
24 技术:最大似然估计再理解 2018-01-12
25 技术:itchat包提取微信好友公开数据 2018-01-13
26 技术:do函数和biglm包 2018-01-17
27 技术:Imputer后X少了一列 2018-01-18
28 技术:mac连接mysql,理论上win7也可以 2018-01-19
29 技术:ggpubr提高作图效率 2018-01-20
30 技术:t-SNE理论部分补充 2018-01-22
31 技术:RMarkdown的使用技巧 2018-01-30
32 技术:通过anova检验,理解R2、R_adj.2、F值 2018-01-31
33 技术:ggridges 山峦图 学习笔记 2018-02-02
34 技术:Tidyverse使用技巧 2018-02-02
35 技术:XGBoost 学习笔记 2018-02-02
36 技术:分布变离散,或者纠正skew 2018-02-02
37 技术:rsq在R中自定义函数 2018-02-03
38 技术:Jupyter实战 2018-02-13
39 技术:美化与定制 2018-02-21
40 技术:数据对比可视化指南 2018-02-22
41 技术:功能体验 2018-02-26
42 技术:高效数据处理 2018-02-27
43 技术:模型优化技巧 2018-03-05
44 技术:原理与应用 2018-03-06
45 技术:模型与可视化 2018-03-08
46 技术:美化与交互指南 2018-03-11
47 技术:高效操作指南 2018-03-14
48 技术:用法与优化技巧 2018-03-17
49 技术:效率提升指南 2018-03-18
50 技术:问题排查技巧 2018-03-18
51 技术:高效操作指南 2018-03-19
52 技术:方法与代码示例 2018-03-21
53 技术:进阶技巧与优化 2018-03-21
54 技术:实战示例 2018-03-22
55 技术:效率与规范指南 2018-03-24
56 技术:dplython包测评 2018-03-25
57 技术:原理与实现 2018-04-02
58 技术:原理与应用解析 2018-04-03
59 技术:实战指南 2018-04-05
60 技术:核心语法与函数整理 2018-04-05
61 技术:复利计算与应用 2018-04-08
62 技术:简单规则模型解析 2018-04-14
63 技术:高效代码设计指南 2018-04-25
64 技术:原理与应用学习笔记 2018-04-29
65 技术:实战指南 2018-04-29
66 技术:原理与应用 2018-05-01
67 技术:表格格式化指南 2018-05-02
68 技术:原理与应用介绍 2018-05-08
69 技术:高效文本拼接 2018-05-11
70 技术:方法与实践学习笔记 2018-05-12
71 技术:方法与工具 2018-05-12
72 技术:功能解析 2018-05-17
73 技术:高效数据输入 2018-05-21
74 技术:基础模型与方法 2018-05-22
75 技术:功能与使用体验 2018-05-26
76 技术:特征筛选学习笔记 2018-05-29
77 技术:实战技巧 2018-05-30
78 技术:建模思路解析 2018-06-03
79 技术:策略与实战 2018-06-03
80 技术:数据展示指南 2018-06-04
81 技术:包与环境配置指南 2018-07-14
82 技术:高效操作指南 2018-07-19
83 技术:方法与案例解析 2018-07-24
84 技术:统计建模学习笔记 2018-07-24
85 技术:展示技巧与原则 2018-08-10
86 技术:数据采集实战技巧 2018-08-21
87 技术:指标设计学习笔记 2018-09-20
88 技术:大规模数据探索 2018-10-20
89 技术:文本提取与分析 2018-10-20
90 技术:原理与R实现实战 2018-10-21
91 技术:学习资源获取技巧 2018-10-23
92 技术:深度学习模型实战 2018-10-24
93 技术:实战指南 2018-10-30
94 技术:分析与展示指南 2018-11-03
95 技术:图片编辑与转换 2018-11-03
96 技术:安装与使用基础学习笔记 2018-11-07
97 技术:非结构化数据处理 2018-11-29
98 技术:表格美化技巧 2018-12-13
99 技术:分类数据可视化 2018-12-24
100 技术:流程图绘制技巧 2018-12-24
101 技术:自动化设置 2018-12-28
102 技术:协作与版本控制 2018-12-29
103 技术:pipeline设计 2018-12-30
104 技术:Git历史记录清理 2018-12-31
105 技术:AUC指标对比 2019-01-01
106 技术:时间序列可视化 2019-01-01
107 技术:变量命名工具指南 2019-01-02
108 技术:网页自动化截图 2019-01-02
109 技术:配置与优化 2019-01-03
110 技术:原理与应用 2019-01-07
111 技术:语法与核心概念 2019-01-14
112 技术:R包徽章设计 2019-01-15
113 技术:项目结构设计 2019-01-21
114 技术:文本分类基础任务 2019-01-22
115 技术:线性与非线性模型 2019-01-22
116 技术:有效性验证 2019-01-27
117 技术:评估与应用 2019-01-29
118 技术:循环神经网络入门 2019-01-30
119 技术:长短期记忆网络入门 2019-01-30
120 技术:for循环示例 2019-02-03
121 技术:基础到进阶 2019-02-06
122 技术:查询与整合 2019-02-06
123 技术:方法与案例 2019-02-14
124 技术:R包高效开发指南 2019-02-20
125 技术:解析与操作 2019-02-20
126 技术:训练与预测 2019-02-25
127 技术:原理与代码 2019-02-26
128 技术:GitHub个人访问令牌(PAT)设置 2019-03-04
129 技术:方法与工具 2019-03-07
130 技术:文本特征提取示例 2019-03-08
131 技术:基础任务示例 2019-03-18
132 技术:条形图与表头设计 2019-03-20
133 技术:连续与分类变量差异 2019-03-30
134 技术:思路与方法 2019-04-08
135 技术:方法与工具 2019-04-15
136 技术:多格式读取 2019-04-16
137 技术:方法与工具 2019-05-11
138 技术:Git/GitHub/GitLab 2019-05-13
139 技术:命令与操作 2019-05-19
140 技术:协作与版本控制 2019-05-26
141 技术:语法与实践 2019-06-28
142 技术:功能与API 2019-07-13
143 技术:安装与使用 2019-07-24
144 读《未来简史》:技术与未来 2019-09-14
145 技术:高效数据处理 2019-10-09
146 技术:性能优化技巧 2019-10-12
147 技术:配置与运维 2019-10-29
148 技术:原理与经典模型 2019-12-25
149 技术:构建到发布流程 2019-12-26
150 技术:方法与案例 2019-12-27
151 技术:命令与自动化 2019-12-30
152 技术:Pandas数据处理实战指南 2020-01-19
153 技术:特征工程之目标编码学习笔记 2020-01-20
154 技术:文档编写与美化 2020-01-28
155 技术:核心算法与应用 2020-01-29
156 技术:流程图绘制技巧 2020-01-29
157 技术:DataCamp课程笔记 2020-01-31
158 技术:Python实用代码片段合集 2020-01-31
159 技术:自动化构建流程 2020-02-02
160 技术:自动化工作流配置 2020-02-04
161 技术:高效查找代码与项目 2020-02-11
162 技术:代码环境快速部署 2020-02-24
163 技术:USD数据分析论文收录暨GitBook发布 2020-05-02
164 游记:西安博物院(5)西汉器物工艺到新莽技术应用 2020-10-01
165 技术:Causal Forest 2021-03-18
166 技术小团队人才培养思考:压力・复盘・沉淀 2024-05-21
167 BJ Fogg模型:从说服技术理论到行为设计实践 2024-11-24
168 管理视角:技术团队的核心交付是什么 2025-02-13
169 研读毛选:核心技术三大特征 2025-03-28