6  Example of tidymodels

6.1 预测光谱数据的实例

tidymodels是一组用于建立统计和机器学习模型的R包,它可以处理各种类型的数据,包括光谱数据。以下是一个简单的示例,说明如何使用主成分分析(PCA)和随机森林回归在tidymodels中对光谱数据进行预测。

# 加载必要的包
library(tidymodels)
── Attaching packages ────────────────────────────────────── tidymodels 1.1.1 ──
✔ broom        1.0.5     ✔ recipes      1.0.9
✔ dials        1.2.0     ✔ rsample      1.2.0
✔ dplyr        1.1.4     ✔ tibble       3.2.1
✔ ggplot2      3.4.4     ✔ tidyr        1.3.0
✔ infer        1.0.5     ✔ tune         1.1.2
✔ modeldata    1.2.0     ✔ workflows    1.1.3
✔ parsnip      1.1.1     ✔ workflowsets 1.0.1
✔ purrr        1.0.2     ✔ yardstick    1.2.0
── Conflicts ───────────────────────────────────────── tidymodels_conflicts() ──
✖ purrr::discard() masks scales::discard()
✖ dplyr::filter()  masks stats::filter()
✖ dplyr::lag()     masks stats::lag()
✖ recipes::step()  masks stats::step()
• Search for functions across packages at https://www.tidymodels.org/find/
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ forcats   1.0.0     ✔ readr     2.1.4
✔ lubridate 1.9.3     ✔ stringr   1.5.1
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ readr::col_factor() masks scales::col_factor()
✖ purrr::discard()    masks scales::discard()
✖ dplyr::filter()     masks stats::filter()
✖ stringr::fixed()    masks recipes::fixed()
✖ dplyr::lag()        masks stats::lag()
✖ readr::spec()       masks yardstick::spec()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# 假设我们有一个名为spectra的数据框,其中有100列表示光谱特征,最后一列是我们想要预测的响应变量
set.seed(123)
spectra <- as_tibble(matrix(rnorm(10000), ncol = 100))
Warning: The `x` argument of `as_tibble.matrix()` must have unique column names if
`.name_repair` is omitted as of tibble 2.0.0.
ℹ Using compatibility `.name_repair`.
spectra$response <- with(spectra, V1 * 2 + V2 ^ 2 + rnorm(nrow(spectra)))

# 划分训练集和测试集
split <- initial_split(spectra, prop = 3/4)
train_data <- training(split)
test_data <- testing(split)

# 定义PCA预处理步骤和随机森林规范
pca_recipe <- recipe(response ~ ., data = train_data) %>%
  step_normalize(all_predictors()) %>%
  step_pca(all_predictors())

rf_spec <- rand_forest() %>% set_engine("randomForest", importance = TRUE)  |> 
    set_mode("regression")

# 定义工作流
rf_workflow <- workflow() %>% add_model(rf_spec) %>% add_recipe(pca_recipe)

# 训练模型
rf_fit <- fit(rf_workflow, data = train_data)

# 进行预测
predictions <- rf_fit %>% predict(test_data) %>% bind_cols(test_data)
predictions %>% show()
# A tibble: 25 × 102
     .pred     V1      V2      V3      V4      V5      V6      V7      V8
     <dbl>  <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
 1  2.84   -0.560 -0.710   2.20   -0.715  -0.0736 -0.602   1.07   -0.728 
 2  1.28    1.72  -0.0450 -0.476   0.331  -1.65   -0.0951 -0.211   0.590 
 3  0.712  -0.446  0.919  -0.0540  2.04    0.227  -0.0792 -0.849   0.748 
 4 -0.307   0.401 -1.62    1.23   -1.73    0.653   0.882   1.69   -0.0936
 5  0.0653  0.111 -0.0556 -0.516  -0.602  -0.123   0.206  -0.0160 -0.0867
 6  0.978  -1.97  -0.641  -0.723  -1.26    0.430   0.310  -0.675  -0.287 
 7  1.85    0.701 -0.850  -1.24    1.68    0.535  -1.04   -1.22    0.373 
 8  1.54    0.838  0.235  -0.705  -0.0608  2.40    1.24    0.171   0.564 
 9  1.47    0.426  1.44    1.96    1.02   -0.191   0.605  -0.679   1.74  
10 -0.130  -0.295  0.452  -0.0903 -1.19    0.378  -0.506  -1.86    0.881 
# ℹ 15 more rows
# ℹ 93 more variables: V9 <dbl>, V10 <dbl>, V11 <dbl>, V12 <dbl>, V13 <dbl>,
#   V14 <dbl>, V15 <dbl>, V16 <dbl>, V17 <dbl>, V18 <dbl>, V19 <dbl>,
#   V20 <dbl>, V21 <dbl>, V22 <dbl>, V23 <dbl>, V24 <dbl>, V25 <dbl>,
#   V26 <dbl>, V27 <dbl>, V28 <dbl>, V29 <dbl>, V30 <dbl>, V31 <dbl>,
#   V32 <dbl>, V33 <dbl>, V34 <dbl>, V35 <dbl>, V36 <dbl>, V37 <dbl>,
#   V38 <dbl>, V39 <dbl>, V40 <dbl>, V41 <dbl>, V42 <dbl>, V43 <dbl>, …

在这个例子中,我们首先生成了一个模拟的光谱数据集,然后执行主成分分析以减少数据的维数,最后使用随机森林进行预测。tidymodels提供了许多其他的预处理步骤和模型规范,你可以根据自己的需求进行选择和调整。

需要注意的是,对于光谱数据,因为特征数量通常很大(可能达到上千或更多),所以一般需要进行降维或者特征选择,而且也需要选择能够处理高维数据的模型。