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


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)

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

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

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

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

암호

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

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.