0Pricing
R Academy · 강의

recipes를 활용한 특성 공학

정규화, 인코딩 및 대치의 전처리 단계를 정의합니다.

recipes를 활용한 특성 공학은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

레시피란 무엇인가요?

tidymodels에서 recipe는 데이터를 전처리하기 위한 설계도입니다. 원시 데이터를 모델에 사용할 수 있는 특성으로 변환하는 데 필요한 단계를 기록하지만, 즉시 적용하지는 않습니다.

핵심 함수는 recipe(outcome ~ ., data = train)입니다. 이 함수는 전처리 중에 필요한 통계량을 추정하는 데 사용할 수식과 기준 데이터 세트를 정의합니다.

library(recipes)
library(tidymodels)

# Create a recipe using the training data
rec <- recipe(price ~ ., data = train_data)
print(rec)

step_normalize()

step_normalize(all_numeric_predictors())는 각 숫자형 예측 변수를 평균 0이 되도록 중심화하고 표준편차 1이 되도록 스케일링합니다. 이는 로지스틱 회귀, SVM, 신경망처럼 특성의 스케일에 민감한 알고리즘에 필수적입니다.

평균과 SD는 훈련 세트에서 계산되며 bake()를 통해 테스트 데이터에도 일관되게 적용됩니다.

rec <- recipe(price ~ ., data = train_data) |>
  step_normalize(all_numeric_predictors())

# Check what steps are recorded
print(rec)

step_dummy()

step_dummy(all_nominal_predictors())는 범주형(요인형/문자형) 변수를 숫자형 더미(원-핫 인코딩) 열로 변환합니다. 기본적으로 k개 수준의 요인에 대해 k-1개의 열을 만들어 완전한 다중공선성을 방지합니다.

완전한 원-핫 인코딩의 이점을 얻는 트리 기반 모델에는 one_hot = TRUE를 사용하십시오.

rec <- recipe(price ~ ., data = train_data) |>
  step_dummy(all_nominal_predictors())

# After prep and bake, factor columns become 0/1 numeric columns
prepped <- prep(rec)
baked <- bake(prepped, new_data = NULL)
names(baked)

step_impute_median()

결측값이 있으면 대부분의 모델 엔진이 실패합니다. step_impute_median(all_numeric_predictors())는 NA 값을 훈련 세트에서 계산한 중앙값으로 대체합니다. 중앙값을 사용한 대치는 평균을 사용한 대치보다 이상값에 강합니다.

범주형 변수에는 step_impute_mode()를 사용하여 가장 자주 나타나는 값으로 채우십시오.

rec <- recipe(price ~ ., data = train_data) |>
  step_impute_median(all_numeric_predictors()) |>
  step_impute_mode(all_nominal_predictors())

print(rec)

step_zv() — 분산이 0인 변수 제거

step_zv(all_predictors())는 고유한 값이 하나뿐인 예측 변수(분산이 0인 변수)를 제거합니다. 이러한 열은 정보를 담고 있지 않으며 일부 모델 엔진에서 오류를 일으킬 수 있습니다.

분산이 거의 0인 경우에는 step_nzv(all_predictors())를 사용하십시오. 이 함수는 한 값이 압도적으로 많이 나타나는 열도 제거합니다.

rec <- recipe(price ~ ., data = train_data) |>
  step_impute_median(all_numeric_predictors()) |>
  step_dummy(all_nominal_predictors()) |>
  step_zv(all_predictors()) |>
  step_normalize(all_numeric_predictors())

print(rec)

prep() — 레시피 학습

prep(recipe)는 훈련 데이터를 사용하여 각 단계에 필요한 모든 매개변수를 추정합니다. 예를 들어 정규화를 위한 평균/SD와 대치를 위한 중앙값을 계산합니다. 그 결과 모든 변환 매개변수를 알고 있는 준비된 레시피가 반환됩니다.

테스트 세트의 데이터가 유출되는 것을 방지하려면 항상 훈련 데이터만 사용하여 prep을 수행하십시오.

# Build the full recipe
rec <- recipe(price ~ ., data = train_data) |>
  step_impute_median(all_numeric_predictors()) |>
  step_dummy(all_nominal_predictors()) |>
  step_zv(all_predictors()) |>
  step_normalize(all_numeric_predictors())

# Estimate parameters from training data
prepped_rec <- prep(rec)
print(prepped_rec)

bake() — 새 데이터에 적용

bake(prepped_recipe, new_data = test_data)는 이미 추정된 매개변수를 사용하여 모든 전처리 단계를 어떤 데이터 세트에든 적용합니다. 이를 통해 훈련 데이터와 테스트 데이터 사이에 변환이 일관되게 적용됩니다.

new_data = NULL을 전달하면 prep()에 사용한 훈련 데이터에 적용합니다.

# Apply recipe to test data
baked_test <- bake(prepped_rec, new_data = test_data)
head(baked_test)

# Apply to training data (same as juice())
baked_train <- bake(prepped_rec, new_data = NULL)
dim(baked_train)

juice() — 처리된 훈련 데이터 추출

juice(prepped_recipe)는 bake(prepped_recipe, new_data = NULL)과 동일한 편의 함수입니다. prep()에 사용한 훈련 데이터의 전처리된 버전을 반환합니다.

참고: juice()는 bake(prep, new_data = NULL)보다 사용이 조금씩 권장되지 않고 있지만, 이전 tidymodels 코드에서 볼 수 있습니다.

# juice() extracts the processed training data
train_processed <- juice(prepped_rec)
glimpse(train_processed)

# Equivalent modern approach
train_modern <- bake(prepped_rec, new_data = NULL)
identical(train_processed, train_modern)  # TRUE

여러 단계 결합

단계는 추가된 순서대로 적용됩니다. 일반적인 운영 환경의 레시피는 다음 순서를 따릅니다.

  1. 대치(먼저 NA 수정)
  2. 특성 생성(상호작용, 다항식)
  3. 더미 인코딩(요인형 변수 변환)
  4. 분산이 0인 변수 제거
  5. 정규화(마지막에 스케일 조정)

이 순서는 중요합니다. 예를 들어 더미 인코딩 전에 정규화를 수행하면 잘못된 결과가 나옵니다.

full_rec <- recipe(sale_price ~ ., data = housing_train) |>
  step_impute_median(all_numeric_predictors()) |>
  step_impute_mode(all_nominal_predictors()) |>
  step_log(sale_price, base = 10) |>
  step_other(all_nominal_predictors(), threshold = 0.05) |>
  step_dummy(all_nominal_predictors()) |>
  step_zv(all_predictors()) |>
  step_normalize(all_numeric_predictors())

print(full_rec)

prep 결과 확인

prep()를 호출한 후에는 tidy(prepped_rec)를 사용하여 각 단계에서 수행한 작업을 확인할 수 있습니다. 각 단계에는 숫자형 ID가 있으며, tidy(prepped_rec, number = 1)을 사용하면 해당 단계의 추정된 매개변수를 자세히 살펴볼 수 있습니다.

prepped_rec <- prep(full_rec)

# View all steps and their status
tidy(prepped_rec)

# Inspect normalization parameters (mean, sd per column)
tidy(prepped_rec, number = 5)  # step_normalize is step 5

실전에서 사용하는 레시피

레시피는 작업 흐름과 함께 사용할 때 특히 유용합니다. prep()과 bake()를 직접 호출하는 대신 레시피를 작업 흐름에 추가하면 tidymodels가 fit()과 predict() 중에 prep/bake를 자동으로 처리합니다.

이를 통해 훈련 시점과 추론 시점에 전처리가 다르게 적용되는 흔한 버그의 원인을 제거할 수 있습니다.

library(workflows)

# Recipe + model spec combined in a workflow
wf <- workflow() |>
  add_recipe(full_rec) |>
  add_model(linear_reg() |> set_engine('lm'))

# fit() internally calls prep() + bake() on training data
fitted_wf <- fit(wf, data = housing_train)

# predict() applies bake() to new data automatically
predictions <- predict(fitted_wf, new_data = housing_test)
head(predictions)

빠른 확인

tidymodels 레시피 프레임워크에서 prep(recipe)을 호출하면 어떤 작업을 수행하나요?

레시피 복습

레시피를 사용한 특성 공학의 핵심 내용:

  • recipe(outcome ~ ., data = train)은 전처리 설계도를 정의합니다.
  • step_normalize(), step_dummy(), step_impute_median(), step_zv()는 가장 일반적으로 사용하는 단계입니다.
  • prep()은 훈련 데이터에서만 매개변수를 추정하며 테스트 데이터에서는 추정하지 않습니다.
  • bake(prepped, new_data)는 학습된 레시피를 모든 데이터 세트에 적용합니다.
  • 단계 순서가 중요합니다: 대치 → 생성 → 인코딩 → 제거 → 스케일 조정
  • 운영 환경에서는 레시피를 workflow()로 감싸 fit 및 predict 중 prep/bake를 자동화하십시오.
# Full pipeline in 6 lines
rec <- recipe(target ~ ., data = train) |>
  step_impute_median(all_numeric_predictors()) |>
  step_dummy(all_nominal_predictors()) |>
  step_zv(all_predictors()) |>
  step_normalize(all_numeric_predictors())

prepped <- prep(rec)
train_baked <- bake(prepped, new_data = NULL)
test_baked  <- bake(prepped, new_data = test)

자주 묻는 질문

“recipes를 활용한 특성 공학” 강의는 무료인가요?

네 — “recipes를 활용한 특성 공학” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“recipes를 활용한 특성 공학”에서 뭘 배우나요?

정규화, 인코딩 및 대치의 전처리 단계를 정의합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“recipes를 활용한 특성 공학” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. recipes를 활용한 특성 공학
  2. parsnip으로 모델 사양 정의
  3. 워크플로: 레시피와 모델 결합
  4. rsample을 활용한 재표본추출과 교차 검증
← R Academy(으)로 돌아가기