0Pricing
R Academy · 강의

ranger로 랜덤 포레스트 만들기

랜덤 포레스트 모델을 학습시키고 mtry와 ntrees를 조정하며 OOB 오류를 평가합니다.

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

랜덤 포레스트란 무엇입니까?

랜덤 포레스트는 데이터의 부트스트랩 표본으로 많은 결정 트리를 학습한 다음, 예측값의 평균(회귀)을 계산하거나 다수결(분류)을 사용합니다. 앙상블을 랜덤 포레스트라고 부르는 이유는 두 가지 무작위성에 있습니다. 행을 부트스트랩 표본 추출하는 것과 각 분할에서 특성을 무작위로 선택하는 것입니다.

library(ranger)

# Minimal random forest: 500 trees, auto mtry
rf <- ranger(
  medv ~ .,
  data      = MASS::Boston,
  num.trees = 500
)

print(rf)

mtry 매개변수

mtry는 각 분할에서 무작위로 고려할 특성의 수입니다. 전체 특성 수보다 적은 특성을 사용하면 트리 간 상관이 줄어들어 분산이 감소합니다. 일반적으로 분류에서는 mtry = sqrt(p), 회귀에서는 mtry = p/3을 사용합니다. 여기서 p는 예측 변수의 수입니다.

p <- ncol(MASS::Boston) - 1  # number of predictors

rf_class <- ranger(
  Species ~ ., data = iris,
  num.trees = 500,
  mtry      = floor(sqrt(4))  # sqrt(p) for classification
)

rf_reg <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees = 500,
  mtry      = floor(p / 3)    # p/3 for regression
)

cat('Classification OOB Error:', rf_class$prediction.error)
cat('Regression OOB RMSE:', sqrt(rf_reg$prediction.error))

OOB 오차 — 무료 검증

각 트리는 부트스트랩 표본으로 학습되므로 관측값의 약 3분의 1이 제외됩니다(가방 밖, OOB). 이러한 OOB 표본은 각 트리에 대한 내장 검증 세트 역할을 합니다. 전체 OOB 오차는 테스트 오차를 거의 편향 없이 추정하므로 별도의 검증 세트가 필요하지 않습니다.

rf <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees = 500,
  mtry      = 4
)

# OOB MSE
cat('OOB MSE:', rf$prediction.error)

# OOB RMSE
cat('OOB RMSE:', sqrt(rf$prediction.error))

# For classification: OOB error rate
rf_cl <- ranger(Species ~ ., data = iris)
cat('OOB Error Rate:', rf_cl$prediction.error)

변수 중요도

importance = 'impurity'로 설정하면 모든 트리에서 각 특성에 대한 노드 불순도(Gini 또는 MSE)의 총 감소량을 기록합니다. importance = 'permutation'으로 설정하면 각 특성을 무작위로 섞었을 때의 정확도 손실을 측정합니다. 이 방법은 더 신뢰할 수 있지만 더 느립니다.

rf_imp <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees  = 500,
  importance = 'impurity'
)

# Sorted importance scores
imp <- sort(rf_imp$variable.importance, decreasing = TRUE)
print(imp)

# Quick plot
barplot(imp, las = 2, col = 'steelblue',
        main = 'Random Forest Variable Importance')

ranger를 사용한 예측

predict(rf, data = test)를 사용하여 예측을 생성합니다. 결과는 목록이며, $predictions로 예측값에 접근할 수 있습니다. 분류에서는 기본적으로 예측값이 factor 수준으로 반환됩니다.

set.seed(1)
idx   <- sample(nrow(MASS::Boston), 400)
train <- MASS::Boston[idx, ]
test  <- MASS::Boston[-idx, ]

rf <- ranger(medv ~ ., data = train, num.trees = 500)

pred <- predict(rf, data = test)
test_rmse <- sqrt(mean((pred$predictions - test$medv)^2))
cat('Test RMSE:', round(test_rmse, 3))

혼동 행렬의 개념

분류에서 혼동 행렬은 실제 클래스와 예측 클래스를 교차 집계합니다. 여기서 도출되는 주요 지표로는 정확도, 정밀도(TP / (TP + FP)), 재현율(TP / (TP + FN)), F1 점수가 있습니다. ranger는 OOB 혼동 행렬을 직접 제공합니다.

rf_cl <- ranger(
  Species ~ ., data = iris,
  num.trees = 500,
  mtry      = 2
)

# OOB confusion matrix
print(rf_cl$confusion.matrix)

# OOB error rate
cat('OOB Error Rate:', rf_cl$prediction.error)

# Manual accuracy on OOB predictions
# (1 - error rate)
cat('OOB Accuracy:', 1 - rf_cl$prediction.error)

mtry와 num.trees 조정

트리 수를 늘리면 항상 분산이 감소하지만, 약 300~500개 부근부터는 추가적인 효과가 줄어듭니다. mtry 매개변수에는 가장 적절한 값이 있습니다. 간단한 조정 반복문을 사용하면 mtry 값의 후보 범위에서 OOB 오차를 평가하여 교차 검증 없이 최적값을 찾을 수 있습니다.

mtry_vals <- c(2, 4, 6, 8, 10)
oob_errors <- sapply(mtry_vals, function(m) {
  rf <- ranger(
    medv ~ ., data = MASS::Boston,
    num.trees = 300, mtry = m
  )
  rf$prediction.error
})

best_mtry <- mtry_vals[which.min(oob_errors)]
cat('Best mtry:', best_mtry)
plot(mtry_vals, sqrt(oob_errors), type = 'b',
     xlab = 'mtry', ylab = 'OOB RMSE')

분류를 위한 ranger

분류에서 하드 라벨 대신 클래스 확률 예측을 얻으려면 probability = TRUE로 설정합니다. 이는 ROC 곡선을 계산하고 보정된 확률 추정값을 얻는 데 필요하며, yardstick 지표가 요구하는 출력 형식과도 일치합니다.

# Ensure the target is a factor
iris$Species <- as.factor(iris$Species)

rf_prob <- ranger(
  Species ~ ., data = iris,
  num.trees   = 300,
  probability = TRUE  # output class probabilities
)

# Predictions are a matrix of probabilities
pred_prob <- predict(rf_prob, data = iris[1:5, ])
print(pred_prob$predictions)

ranger의 병렬 처리

ranger는 속도와 병렬 처리를 위해 설계되었습니다. 사용 가능한 모든 CPU 코어를 사용하려면 num.threads를 설정합니다. 특히 트리가 많고 데이터 세트가 큰 경우, 이전의 randomForest 패키지보다 처리 속도가 크게 향상될 수 있습니다.

# Use all available cores
rf_fast <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees  = 1000,
  mtry       = 4,
  num.threads = parallel::detectCores()
)

cat('Trees:', rf_fast$num.trees)
cat('Threads used:', rf_fast$num.threads)
cat('OOB RMSE:', sqrt(rf_fast$prediction.error))

tidymodels를 통한 ranger 사용

일관된 구문을 제공하고 워크플로, 교차 검증, 조정 기능과 통합되는 tidymodels 인터페이스를 통해 ranger를 사용할 수 있습니다. 엔진을 'ranger'로 지정하고 엔진별 인수는 set_engine()으로 전달합니다.

library(parsnip)
library(workflows)

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

wf <- workflow() |>
  add_recipe(rec) |>
  add_model(rf_spec)

print(wf)

ranger 출력 해석

출력된 ranger 모델에는 트리 수, 대상 변수, 사용된 특성 수, OOB 예측 오차, R-squared(회귀의 경우)가 표시됩니다. OOB 오차는 빠른 기본 점검으로 항상 확인하십시오. 대규모 데이터 세트에서 그 값이 지나치게 낮다면 데이터 누수를 의심해야 합니다.

rf <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees  = 500, mtry = 4,
  importance = 'impurity'
)

# Key output fields
cat('OOB MSE:      ', rf$prediction.error, '\n')
cat('OOB RMSE:     ', sqrt(rf$prediction.error), '\n')
cat('R-squared:    ', rf$r.squared, '\n')
cat('Num trees:    ', rf$num.trees, '\n')
cat('Num features: ', rf$num.independent.variables, '\n')

빠른 확인

ranger로 구축한 랜덤 포레스트에서 OOB(가방 밖) 오차는 무엇을 추정합니까?

랜덤 포레스트 복습

ranger를 사용한 랜덤 포레스트에서 기억할 핵심 내용:

  • 랜덤 포레스트는 부트스트랩 표본으로 학습한 여러 트리를 각 분할에서 무작위로 특성을 선택하는 방식과 결합합니다.
  • mtry: 분류에서는 sqrt(p), 회귀에서는 p/3을 사용하며, 이 매개변수를 조정해야 합니다.
  • OOB 오차는 별도 비용 없이 거의 편향이 없는 검증 추정값을 제공합니다.
  • importance = 'impurity' 또는 'permutation'으로 변수 중요도 점수를 얻을 수 있습니다.
  • 분류에서 클래스 확률 출력을 얻으려면 probability = TRUE로 설정합니다.
  • ranger는 병렬 처리를 적극 활용하므로 대규모 데이터 세트에서는 num.threads를 사용하십시오.
  • rand_forest() |> set_engine('ranger')를 통해 tidymodels와 통합할 수 있습니다.
rf <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees  = 500,
  mtry       = 4,
  importance = 'impurity',
  num.threads = parallel::detectCores()
)

cat('OOB RMSE:', sqrt(rf$prediction.error))
cat('R2:', rf$r.squared)

print(sort(rf$variable.importance, decreasing = TRUE))

자주 묻는 질문

“ranger로 랜덤 포레스트 만들기” 강의는 무료인가요?

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

“ranger로 랜덤 포레스트 만들기”에서 뭘 배우나요?

랜덤 포레스트 모델을 학습시키고 mtry와 ntrees를 조정하며 OOB 오류를 평가합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“ranger로 랜덤 포레스트 만들기” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. 의사결정나무: 앙상블의 기초
  2. ranger로 랜덤 포레스트 만들기
  3. xgboost를 활용한 그래디언트 부스팅
  4. 특성 중요도와 모델 해석
← R Academy(으)로 돌아가기