연속적인 독립 변수 / 기능을 언제 이산 / 빈화해야합니까?


21

언제 독립 변수 / 기능을 이산 / 빈화해야하고 언제 안됩니까?

질문에 대답하려는 나의 시도 :

  • 비닝은 정보를 잃을 것이기 때문에 일반적으로 비닝해서는 안됩니다.
  • 비닝은 실제로 모형의 자유도를 증가 시키므로 비닝 후에 초과 피팅을 유발할 수 있습니다. "높은 바이어스"모델이있는 경우 비닝이 나쁘지는 않지만 "높은 분산"모델이있는 경우 비닝을 피해야합니다.
  • 사용중인 모델에 따라 다릅니다. 선형 모드이고 데이터에 많은 "이상 값"비닝 확률이있는 경우 더 좋습니다. 트리 모델이 있다면 이상치와 비닝이 너무 큰 차이를 만듭니다.

내가 맞아? 그리고 또 뭐?


이 질문을 여러 번해야한다고 생각했지만 CV에서는이 게시물 만 찾을 수 없습니다

연속 변수를 비닝해야합니까?

연속 예측 변수를 분해하면 어떤 이점이 있습니까?


나는 그 대답이 실제로이 문제를 다루지 않기 때문에 질문이 중복이라고 생각하지 않는다 ( "우리가해야한다").
Firebug

8
CART / 랜덤 포레스트 접근 방식은 연속적인 변수를 비닝하는 것 (개별 상수 함수에 적합)이지만 훨씬 더 나은 방법으로 수행하고 있습니다. 당신이-함을 사전에 경우에, 당신은 ... 당신의 나무가 구축 유연성을 알고리즘은 최적의 장소에 휴식을 넣어 거부하고
벤 Bolker

답변:


16

예측 관점에서 답을 찾고있는 것처럼 보이므로 R에서 두 가지 접근법에 대한 간단한 데모를 모았습니다.

  • 변수를 같은 크기의 요인으로 묶기.
  • 천연 큐빅 스플라인.

아래에는 주어진 실제 신호 함수에 대해 두 가지 방법을 자동으로 비교하는 함수에 대한 코드가 있습니다.

test_cuts_vs_splines <- function(signal, N, noise,
                                 range=c(0, 1), 
                                 max_parameters=50,
                                 seed=154)

이 함수는 주어진 신호에서 시끄러운 훈련 및 테스트 데이터 세트를 생성 한 다음 일련의 선형 회귀 분석을 두 가지 유형의 훈련 데이터에 맞 춥니 다.

  • cuts모형에는 데이터 범위를 동일한 크기의 반 열린 간격으로 분할 한 다음 각 트레이닝 포인트가 속하는 간격을 나타내는 이진 예측자를 만들어 비닝 예측자를 포함합니다.
  • splines모형에는 자연 입방 스플라인 기반 확장이 포함되어 있으며, 예측 변수 범위 전체에 매듭이 동일하게 배치되어 있습니다.

논쟁은

  • signal: 추정 할 진실을 나타내는 하나의 변수 함수.
  • N: 교육 및 테스트 데이터에 포함 할 샘플 수입니다.
  • noise: 훈련 및 테스트 신호에 추가 할 임의 가우스 노이즈의 범위.
  • range: 훈련 및 시험 x데이터 의 범위 ,이 범위 내에서 균일하게 생성 된 데이터.
  • max_paramters: 모형에서 추정 할 최대 매개 변수 수입니다. cuts모델 의 최대 세그먼트 수 와 모델의 최대 매듭 수입니다 splines.

splines모형 에서 추정 된 매개 변수 의 수는 노트 수와 동일하므로 두 모형이 상당히 비교됩니다.

함수의 반환 객체에는 몇 가지 구성 요소가 있습니다.

  • signal_plot: 신호 기능의 플롯.
  • data_plot: 교육 및 테스트 데이터의 산점도.
  • errors_comparison_plot: 추정 된 매개 변수 수 범위에서 두 모델의 제곱 오차 비율의 진화를 보여주는 그림.

두 가지 신호 기능으로 시연하겠습니다. 첫 번째는 증가하는 선형 추세가 중첩 된 사인파입니다.

true_signal_sin <- function(x) {
  x + 1.5*sin(3*2*pi*x)
}

obj <- test_cuts_vs_splines(true_signal_sin, 250, 1)

오류율이 어떻게 진화 하는가

사인파 증가를위한 다양한 자유도를 가진 그룹화 vs 스플라인 훈련 및 테스트 성능

두 번째 예는 이런 종류의 것만을 위해 유지하는 너트 티 함수입니다.

true_signal_weird <- function(x) {
  x*x*x*(x-1) + 2*(1/(1+exp(-.5*(x-.5)))) - 3.5*(x > .2)*(x < .5)*(x - .2)*(x - .5)
}

obj <- test_cuts_vs_splines(true_signal_weird, 250, .05)

기괴한 기능을 향상시키기 위해 다양한 자유 도로 그룹화 및 스플라인 훈련 및 테스트 성능

그리고 재미를 위해 여기에 지루한 선형 함수가 있습니다

obj <- test_cuts_vs_splines(function(x) {x}, 250, .2)

선형 기능에 대한 다양한 자유 도로 그룹화 및 스플라인 훈련 및 테스트 성능

당신은 그것을 볼 수 있습니다 :

  • 스플라인은 모델 복잡성이 두 가지 모두에 맞게 적절히 조정될 때 전반적인 테스트 성능을 전반적으로 향상시킵니다.
  • 스플라인은 훨씬 적은 추정 매개 변수로 최적의 테스트 성능을 제공 합니다.
  • 추정 된 파라미터의 수가 변함에 따라 스플라인의 전반적인 성능은 훨씬 안정적입니다.

따라서 스플라인은 항상 예측 관점에서 선호됩니다.

암호

이러한 비교를 수행하는 데 사용한 코드는 다음과 같습니다. 나는 당신이 당신의 자신의 신호 기능으로 그것을 시험해 볼 수 있도록 모든 기능을 래핑했습니다. ggplot2splinesR 라이브러리 를 가져와야합니다 .

test_cuts_vs_splines <- function(signal, N, noise,
                                 range=c(0, 1), 
                                 max_parameters=50,
                                 seed=154) {

  if(max_parameters < 8) {
    stop("Please pass max_parameters >= 8, otherwise the plots look kinda bad.")
  }

  out_obj <- list()

  set.seed(seed)

  x_train <- runif(N, range[1], range[2])
  x_test <- runif(N, range[1], range[2])

  y_train <- signal(x_train) + rnorm(N, 0, noise)
  y_test <- signal(x_test) + rnorm(N, 0, noise)

  # A plot of the true signals
  df <- data.frame(
    x = seq(range[1], range[2], length.out = 100)
  )
  df$y <- signal(df$x)
  out_obj$signal_plot <- ggplot(data = df) +
    geom_line(aes(x = x, y = y)) +
    labs(title = "True Signal")

  # A plot of the training and testing data
  df <- data.frame(
    x = c(x_train, x_test),
    y = c(y_train, y_test),
    id = c(rep("train", N), rep("test", N))
  )
  out_obj$data_plot <- ggplot(data = df) + 
    geom_point(aes(x=x, y=y)) + 
    facet_wrap(~ id) +
    labs(title = "Training and Testing Data")

  #----- lm with various groupings -------------   
  models_with_groupings <- list()
  train_errors_cuts <- rep(NULL, length(models_with_groupings))
  test_errors_cuts <- rep(NULL, length(models_with_groupings))

  for (n_groups in 3:max_parameters) {
    cut_points <- seq(range[1], range[2], length.out = n_groups + 1)
    x_train_factor <- cut(x_train, cut_points)
    factor_train_data <- data.frame(x = x_train_factor, y = y_train)
    models_with_groupings[[n_groups]] <- lm(y ~ x, data = factor_train_data)

    # Training error rate
    train_preds <- predict(models_with_groupings[[n_groups]], factor_train_data)
    soses <- (1/N) * sum( (y_train - train_preds)**2)
    train_errors_cuts[n_groups - 2] <- soses

    # Testing error rate
    x_test_factor <- cut(x_test, cut_points)
    factor_test_data <- data.frame(x = x_test_factor, y = y_test)
    test_preds <- predict(models_with_groupings[[n_groups]], factor_test_data)
    soses <- (1/N) * sum( (y_test - test_preds)**2)
    test_errors_cuts[n_groups - 2] <- soses
  }

  # We are overfitting
  error_df_cuts <- data.frame(
    x = rep(3:max_parameters, 2),
    e = c(train_errors_cuts, test_errors_cuts),
    id = c(rep("train", length(train_errors_cuts)),
           rep("test", length(test_errors_cuts))),
    type = "cuts"
  )
  out_obj$errors_cuts_plot <- ggplot(data = error_df_cuts) +
    geom_line(aes(x = x, y = e)) +
    facet_wrap(~ id) +
    labs(title = "Error Rates with Grouping Transformations",
         x = ("Number of Estimated Parameters"),
         y = ("Average Squared Error"))

  #----- lm with natural splines -------------  
  models_with_splines <- list()
  train_errors_splines <- rep(NULL, length(models_with_groupings))
  test_errors_splines <- rep(NULL, length(models_with_groupings))

  for (deg_freedom in 3:max_parameters) {
    knots <- seq(range[1], range[2], length.out = deg_freedom + 1)[2:deg_freedom]

    train_data <- data.frame(x = x_train, y = y_train)
    models_with_splines[[deg_freedom]] <- lm(y ~ ns(x, knots=knots), data = train_data)

    # Training error rate
    train_preds <- predict(models_with_splines[[deg_freedom]], train_data)
    soses <- (1/N) * sum( (y_train - train_preds)**2)
    train_errors_splines[deg_freedom - 2] <- soses

    # Testing error rate
    test_data <- data.frame(x = x_test, y = y_test)  
    test_preds <- predict(models_with_splines[[deg_freedom]], test_data)
    soses <- (1/N) * sum( (y_test - test_preds)**2)
    test_errors_splines[deg_freedom - 2] <- soses
  }

  error_df_splines <- data.frame(
    x = rep(3:max_parameters, 2),
    e = c(train_errors_splines, test_errors_splines),
    id = c(rep("train", length(train_errors_splines)),
           rep("test", length(test_errors_splines))),
    type = "splines"
  )
  out_obj$errors_splines_plot <- ggplot(data = error_df_splines) +
    geom_line(aes(x = x, y = e)) +
    facet_wrap(~ id) +
    labs(title = "Error Rates with Natural Cubic Spline Transformations",
         x = ("Number of Estimated Parameters"),
         y = ("Average Squared Error"))


  error_df <- rbind(error_df_cuts, error_df_splines)
  out_obj$error_df <- error_df

  # The training error for the first cut model is always an outlier, and
  # messes up the y range of the plots.
  y_lower_bound <- min(c(train_errors_cuts, train_errors_splines))
  y_upper_bound = train_errors_cuts[2]
  out_obj$errors_comparison_plot <- ggplot(data = error_df) +
    geom_line(aes(x = x, y = e)) +
    facet_wrap(~ id*type) +
    scale_y_continuous(limits = c(y_lower_bound, y_upper_bound)) +
    labs(
      title = ("Binning vs. Natural Splines"),
      x = ("Number of Estimated Parameters"),
      y = ("Average Squared Error"))

  out_obj
}

19

집계는 실질적으로 의미가 있습니다 (연구자가 알고 있는지 여부에 관계없이).

원하는 경우 데이터 자체를 기반으로 독립 변수를 포함한 데이터를 비닝해야합니다 .

  • 통계적 힘을 출혈.

  • 연관성 측정 기준.

필자는 Ghelke와 Biehl (1934 년 – 확실히 읽을만한 가치가 있으며 스스로 실행할 수있는 충분히 쉬운 컴퓨터 시뮬레이션)을 제안하고 특히 '수정 가능한 면적 단위 문제'문헌 (Openshaw)에서 계속되는 문헌을 믿는다 , 1983; Dudley, 1991; Lee and Kemp, 2000)은이 두 가지 점을 분명히합니다.

집계 척도 (집합 할 단위 수)와 집계의 분류 기능 (개별 관측치가 어떤 집계 단위 로 끝나는가)대한 사전 이론 이없는 한 집계하지 않아야합니다. 예를 들어, 역학에서 우리는 개인 의 건강과 인구 의 건강에 관심을 갖습니다. . 후자는 단순히 전자의 무작위 모음이 아니라, 예를 들어 지정 학적 경계, 인종-민족적 분류와 같은 사회적 상황, 목의 지위 및 역사 범주 등으로 정의됩니다 (예 : Krieger, 2012 참조).

참고
더들리, G. (1991). 규모, 집계 및 수정 가능한 면적 단위 문제 . [pay-walled] 운영 지리학자, 9 (3) : 28–33.

Gehlke, CE 및 Biehl, K. (1934). 인구 조사 기관 재료의 상관 계수 크기에 대한 그룹화의 특정 효과 . [pay-walled] 미국 통계 협회 저널 , 29 (185) : 169–170.

Krieger, N. (2012). “인구”는 누구와 무엇입니까? “인구 건강”을 이해하고 건강 불평등을 바로 잡기위한 역사적 논쟁, 현재의 논쟁 및 시사점 . 밀 뱅크 분기 별 , 90 (4) : 634–681.

Lee, HTK 및 Kemp, Z. (2000). 공간 및 시간 데이터의 계층 적 추론 및 온라인 분석 처리 . 에서 절차 공간 데이터에 제 9 회 국제 심포지엄의 취급 , 베이징, PR 중국. 국제 지리 연합.

Openshaw, S. (1983). 수정 가능한 면적 단위 문제입니다. 현대 지리학의 개념과 기법 . 지리 북, 영국 노리치.


10
귀하의 담당자가 8888보다 커서이 답변을 공개 투표하는 것이 슬 sad습니다.
Sycorax는 Reinstate Monica가

@ hxd1011 및 GeneralAbrial : : D : D : D : D
Alexis

나는이 답변을 좋아하지만 @MatthewDrury의 답변은 실제로보고 싶습니다.
Haitao Du

흥미로운 참고 문헌으로 설득력있는 답변을 보내 주셔서 감사합니다!
y.selivonchyk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.