一个模型建立的过程,不仅仅是指定模型和估计参数的问题,还包括自变量选择、数据预处理、变量变换、判别阈值选择等问题,这一整套流程在tidymodels中被称为workflow,它可以帮助我们更好地管理建模流程。workflow将基于训练产生最优模型的过程完整的封装起来并管理,有利于管理研究项目。
workflow基础
workflow用来管理建模估计、建模前预处理、建模后的调整等流程,所以workflow至少需要指定一个模型 。
以简单线性回归建模为例:
══ Workflow ════════════════════════════════════════════════════════════════════
Preprocessor: None
Model: linear_reg()
── Model ───────────────────────────────────────────────────────────────────────
Linear Regression Model Specification (regression)
Computational engine: lm
从输出结果可以看出,一个workflow对象包含了两个部分:
Preprocessor:预处理步骤,包括变量选择、数据预处理、变量变换等。本例中没有指定预处理的步骤,所以Preprocessor显示”None”。
Model:模型,这里是一个简单的线性回归模型。
最简单的Preprocessor是指定一个回归公式:
lm_wflow <- workflow ( ) %>%
add_model ( lm_model ) %>%
add_formula (
Sale_Price ~ Longitude + Latitude
)
lm_wflow
══ Workflow ════════════════════════════════════════════════════════════════════
Preprocessor: Formula
Model: linear_reg()
── Preprocessor ────────────────────────────────────────────────────────────────
Sale_Price ~ Longitude + Latitude
── Model ───────────────────────────────────────────────────────────────────────
Linear Regression Model Specification (regression)
Computational engine: lm
在建立一个workflow后,就可以用fit() 函数来拟合模型:
值得注意的是,一个workflow拟合后的对象仍是一个workflow(不同的是新workflow包含了拟合的结果,同时会在输出结果中显示 [trained]。),这也使得新的workflow可以当做拟合结果来使用。
lm_fit <- fit ( lm_wflow , ames_train )
lm_fit
══ Workflow [trained] ══════════════════════════════════════════════════════════
Preprocessor: Formula
Model: linear_reg()
── Preprocessor ────────────────────────────────────────────────────────────────
Sale_Price ~ Longitude + Latitude
── Model ───────────────────────────────────────────────────────────────────────
Call:
stats::lm(formula = ..y ~ ., data = data)
Coefficients:
(Intercept) Longitude Latitude
-301.337 -1.986 2.869
# 用broom::tidy对结果进行整洁化处理
broom :: tidy ( lm_fit )
# A tibble: 3 × 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) -301. 14.3 -21.1 1.05e-90
2 Longitude -1.99 0.130 -15.3 1.51e-50
3 Latitude 2.87 0.177 16.2 2.57e-56
# 用predict()函数进行预测
predict (
lm_fit ,
ames_test %>%
slice ( 1 : 5 )
)
# A tibble: 5 × 1
.pred
<dbl>
1 5.29
2 5.29
3 5.24
4 5.24
5 5.23
workflow对象(包括已经拟合过的),其中的模型和预处理内容都可以删除或更改:
注意修改后的对象不包含拟合结果, 需要重新拟合。
lm_fit %>%
update_formula (
Sale_Price ~ Longitude + Latitude + Neighborhood
)
══ Workflow ════════════════════════════════════════════════════════════════════
Preprocessor: Formula
Model: linear_reg()
── Preprocessor ────────────────────────────────────────────────────────────────
Sale_Price ~ Longitude + Latitude + Neighborhood
── Model ───────────────────────────────────────────────────────────────────────
Linear Regression Model Specification (regression)
Computational engine: lm
指定变量
除了使用add_formula()函数指定回归公式外,还可以用add_variables()函数指定需要使用的变量:
如果需要指定多个变量,还可以与select()函数连用
lm_wflow <- workflow ( ) %>%
add_model ( lm_model ) %>%
add_variables (
outcome = Sale_Price ,
predictors = c ( "Longitude" , "Latitude" , "Neighborhood" )
)
如果指定的自变量中还包含了因变量,那因变量会自动忽略,在这种情况下我们可以使用predictors = everything()参数来指定自变量。
add_variables()函数在与select()系列函数连用时,可以灵活的指定变量,但不能对变量进行处理,仅会将选中的变量保存数据框中传给engine.如果我们需要对变量进行处理,我们就需要使用add_formular()函数(详见 Section 6.3 ),或借助recipe包(详见 Chapter 7 也是tidymodels的系列包).
总结
workflow是tidymodels中用于管理建模流程的重要工具。它可以帮助我们更好地管理建模流程,并使得模型的拟合、预测、评估等过程更加方便。
workflow对象包含预处理器和模型,可以用add_model()函数添加模型,用add_formula()函数添加公式,用add_variables()函数添加变量。
workflow对象可以用fit() 函数拟合模型,用last_fit()函数在测试集上进行性能测试。
workflowset可以用来批量建立workflow,用map()函数批量拟合模型,用collect_metrics()函数收集模型性能指标,用collect_predictions()函数收集模型预测结果。