R Academy · Урок

Спецификация моделей с помощью parsnip

Задавайте типы моделей и вычислительные механизмы независимо от этапа обучения

Урок 2 из 413 шагов

«Спецификация моделей с помощью parsnip» — бесплатный урок R Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.

Что такое parsnip?

parsnip предоставляет единый интерфейс к сотням движков моделей. Вместо изучения уникального синтаксиса каждого пакета (glm(), randomForest(), e1071::svm()) Вы записываете единую спецификацию и указываете parsnip, какой движок использовать.

Это позволяет заменять движки — например, переходить с glm на stan для байесовской логистической регрессии, изменив всего один аргумент.

library(parsnip)

# The same interface, different engines
logistic_reg() |> set_engine('glm')    # base R
logistic_reg() |> set_engine('glmnet') # regularized
logistic_reg() |> set_engine('stan')   # Bayesian

logistic_reg() для классификации

logistic_reg() задаёт модель логистической регрессии для бинарной классификации. Добавьте цепочкой set_engine('glm'), чтобы использовать встроенный в R движок GLM, и set_mode('classification'), чтобы явно объявить тип задачи.

Режим ('classification' или 'regression') необходим для типов моделей, поддерживающих оба варианта.

log_spec <- logistic_reg() |>
  set_engine('glm') |>
  set_mode('classification')

print(log_spec)
# Logistic Regression Model Specification (classification)
# Computational engine: glm

rand_forest() с tune()

rand_forest() задаёт случайный лес. Такие параметры, как mtry (число признаков для каждого разбиения) и trees, можно зафиксировать или задать как tune() — заполнители для поиска гиперпараметров.

Если передать tune(), tidymodels выполнит поиск по сетке значений во время настройки с перекрёстной проверкой.

rf_spec <- rand_forest(
  mtry  = tune(),
  trees = 500,
  min_n = tune()
) |>
  set_engine('ranger', importance = 'impurity') |>
  set_mode('classification')

print(rf_spec)

linear_reg() для регрессии

linear_reg() задаёт модель линейной регрессии. Использование set_engine('lm') включает метод обычных наименьших квадратов, а set_engine('glmnet') — L1/L2-регуляризацию с помощью параметров штрафа и смешивания.

# OLS linear regression
lm_spec <- linear_reg() |>
  set_engine('lm')

# Ridge regression (penalty > 0, mixture = 0)
ridge_spec <- linear_reg(penalty = 0.01, mixture = 0) |>
  set_engine('glmnet')

# Lasso (penalty > 0, mixture = 1)
lasso_spec <- linear_reg(penalty = tune(), mixture = 1) |>
  set_engine('glmnet')

boost_tree() — градиентный бустинг

boost_tree() задаёт модель градиентного бустинга на деревьях. Можно выбрать движок xgboost, lightgbm или C5.0. К настраиваемым параметрам относятся tree_depth, learn_rate и loss_reduction.

xgb_spec <- boost_tree(
  trees      = 500,
  tree_depth = tune(),
  learn_rate = tune(),
  loss_reduction = tune()
) |>
  set_engine('xgboost') |>
  set_mode('classification')

print(xgb_spec)

fit() — обучение модели

fit(spec, formula, data) обучает спецификацию модели на фактических данных. Внутри parsnip преобразует спецификацию в соответствующий вызов выбранного движка. Результатом является объект обученной модели parsnip.

lm_spec <- linear_reg() |> set_engine('lm')

# Fit the model on training data
lm_fit <- fit(lm_spec, mpg ~ wt + hp + cyl, data = mtcars)

# The fitted object wraps the engine result
print(lm_fit)

# Access the underlying lm object
extract_fit_engine(lm_fit)

fit_xy() — матричный интерфейс

fit_xy(spec, x, y) — альтернатива fit(spec, formula, data). Эта функция напрямую принимает матрицу предикторов x и вектор отклика y, что удобно, когда данные уже предварительно обработаны и представлены числовой матрицей (например, при работе с нейронными сетями или XGBoost).

x_train <- train_baked |> select(-price)
y_train <- train_baked$price

lm_spec <- linear_reg() |> set_engine('lm')

# Matrix-style fit
lm_fit_xy <- fit_xy(lm_spec, x = x_train, y = y_train)

print(lm_fit_xy)

translate() — просмотр кода движка

translate(spec) показывает, какой именно вызов parsnip выполнит внутри для выбранного движка. Это особенно полезно при отладке и для понимания того, как спецификация parsnip сопоставляется с собственным интерфейсом движка.

rf_spec <- rand_forest(mtry = 3, trees = 500) |>
  set_engine('ranger') |>
  set_mode('classification')

# See what ranger() call will be generated
translate(rf_spec)

# ranger::ranger(formula = ..., data = ...,
#   num.trees = 500, mtry = 3, ...)

predict() в parsnip

Все обученные модели parsnip используют единый интерфейс predict(). Для классификации параметр type = 'class' возвращает предсказанный класс, а type = 'prob' — вероятности классов. Такая согласованность — одно из главных преимуществ parsnip.

log_fit <- fit(logistic_reg() |> set_engine('glm') |> set_mode('classification'),
               species ~ ., data = train_df)

# Predicted classes
predict(log_fit, new_data = test_df, type = 'class')

# Predicted probabilities
predict(log_fit, new_data = test_df, type = 'prob')

augment() — присоединение предсказаний к данным

augment(fitted_model, new_data) добавляет столбцы с предсказаниями непосредственно во входной фрейм данных. Это удобно для оценки: результат содержит рядом и истинные значения, и предсказания, готовые для вычисления метрик.

log_fit <- fit(
  logistic_reg() |> set_engine('glm') |> set_mode('classification'),
  species ~ ., data = train_df
)

# Get predictions joined to test data
results <- augment(log_fit, new_data = test_df)
head(results[, c('species', '.pred_class', '.pred_setosa')])

Сравнение спецификаций моделей

Одно из главных преимуществ parsnip — быстрое сравнение моделей. Вы задаёте несколько спецификаций, обучаете их на одних и тех же данных и сравниваете метрики. Поскольку интерфейс одинаков, для замены модели нужно изменить только определение спецификации.

specs <- list(
  lm    = linear_reg() |> set_engine('lm'),
  ridge = linear_reg(penalty = 0.01, mixture = 0) |> set_engine('glmnet'),
  rf    = rand_forest(trees = 200) |> set_engine('ranger') |> set_mode('regression')
)

fits <- lapply(specs, fit, mpg ~ ., data = train_mtcars)

preds <- lapply(fits, predict, new_data = test_mtcars)

rmse_vals <- sapply(preds, function(p) {
  sqrt(mean((p$.pred - test_mtcars$mpg)^2))
})
print(rmse_vals)

Быстрая проверка

Что возвращает translate(spec) в parsnip?

Итоги по parsnip

Основные выводы из раздела «Спецификации моделей с parsnip»:

  • parsnip предоставляет единый интерфейс: тип модели, движок и режим задаются отдельно.
  • set_engine() выбирает базовый пакет, а set_mode() — классификацию или регрессию.
  • Используйте tune() как заполнитель для гиперпараметров, которые будут подобраны позже.
  • fit(spec, formula, data) обучает модель, а fit_xy(spec, x, y) принимает матрицы.
  • predict(fit, new_data, type) работает одинаково со всеми движками.
  • translate(spec) показывает вызов движка для отладки.
  • augment(fit, new_data) добавляет предсказания во фрейм данных.
# Parsnip model comparison template
spec <- rand_forest(trees = 500, mtry = tune()) |>
  set_engine('ranger', importance = 'impurity') |>
  set_mode('classification')

print(translate(spec))

# When mtry is fixed:
spec_fixed <- rand_forest(trees = 500, mtry = 5) |>
  set_engine('ranger') |>
  set_mode('classification')
fit_fixed <- fit(spec_fixed, label ~ ., data = train_df)
Можно начать бесплатно

Изучай R с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
43
Уроки
159

Часто задаваемые вопросы

Урок «Спецификация моделей с помощью parsnip» бесплатный?

Да — полный текст урока «Спецификация моделей с помощью parsnip» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.

Чему я научусь в уроке «Спецификация моделей с помощью parsnip»?

Задавайте типы моделей и вычислительные механизмы независимо от этапа обучения Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать R Academy?

Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Спецификация моделей с помощью parsnip»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке R Academy?

Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Создание признаков с помощью recipes
  2. Спецификация моделей с помощью parsnip
  3. Рабочие процессы: объединение рецептов и моделей
  4. Ресэмплинг и перекрёстная проверка с rsample
← Назад к R Academy