เมื่อใดที่เราควรแยก / bin ตัวแปร / คุณสมบัติอิสระอย่างต่อเนื่องและเมื่อไม่ควร?


21

เมื่อใดที่เราควรแยก / bin ตัวแปรอิสระ / คุณสมบัติและเมื่อไม่ควร?

ความพยายามของฉันที่จะตอบคำถาม:

  • โดยทั่วไปแล้วเราไม่ควรทิ้งขยะเพราะการทำข้อมูลจะหายไป
  • จริง ๆ แล้วการ Binning เป็นการเพิ่มระดับของอิสระของแบบจำลองดังนั้นจึงเป็นไปได้ที่จะทำให้เกิดการกระชับหลังจากการ binning หากเรามีรูปแบบ "ความลำเอียงสูง" การไม่ถูก binning อาจไม่เลว แต่ถ้าเรามีรูปแบบ "ความแปรปรวนสูง" เราควรหลีกเลี่ยงการ binning
  • ขึ้นอยู่กับรุ่นที่เราใช้ หากเป็นโหมดเชิงเส้นและข้อมูลมีความน่าจะเป็นของ "ค่าผิดปกติ" จำนวนมากจะดีกว่า หากเรามีรูปแบบต้นไม้ดังนั้นค่าผิดปกติและการฝังรากจะสร้างความแตกต่างมากเกินไป

ฉันถูกไหม? และอะไรอีก


ฉันคิดว่าคำถามนี้ควรถามหลายครั้ง แต่ฉันไม่พบคำถามเหล่านี้ใน CV เฉพาะโพสต์เหล่านี้

เราควรจะเก็บตัวแปรต่อเนื่องหรือไม่?

ประโยชน์ของการแยกตัวแปรทำนายอย่างต่อเนื่องคืออะไร?


ฉันไม่คิดว่าคำถามนั้นซ้ำซ้อนเพราะคำตอบนั้นไม่สามารถแก้ไขปัญหานี้ได้ ("เราควรทำอย่างไร")
Firebug

8
วิธีการป่าของรถเข็น / สุ่มนั้นเป็นตัวแปรต่อเนื่องที่มากขึ้นหรือน้อยลง (ฟังก์ชั่นการปรับค่าคงที่ทีละส่วน) แต่พวกเขากำลังทำในวิธีที่ดีกว่ามาก หากคุณ pre-bin คุณจะปฏิเสธอัลกอริทึมการสร้างต้นไม้ของคุณมีความยืดหยุ่นในการหยุดพักในสถานที่ที่เหมาะสม ...
Ben 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 splines ฝึกอบรมและทดสอบประสิทธิภาพด้วยระดับอิสระที่แตกต่างกันสำหรับการเพิ่มคลื่นบาป

ตัวอย่างที่สองคือฟังก์ชั่นบ้า ๆ บอ ๆ ที่ฉันเก็บไว้สำหรับสิ่งนี้วางแผนและดู

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)

การจัดกลุ่ม vs splines ฝึกอบรมและทดสอบประสิทธิภาพด้วยระดับอิสระที่แตกต่างกันสำหรับการเพิ่มฟังก์ชั่นพิสดาร

และเพื่อความสนุกนี่คือฟังก์ชันเชิงเส้นที่น่าเบื่อ

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

การจัดกลุ่ม vs splines ฝึกอบรมและทดสอบประสิทธิภาพด้วยระดับอิสระที่แตกต่างกันสำหรับฟังก์ชันเชิงเส้น

คุณจะเห็นว่า:

  • เส้นโค้งให้ประสิทธิภาพการทดสอบโดยรวมโดยรวมดีขึ้นเมื่อปรับความซับซ้อนของแบบจำลองทั้งสองอย่างถูกต้อง
  • เส้นโค้งให้ทดสอบประสิทธิภาพที่เหมาะสมกับการประมาณค่าพารามิเตอร์น้อยมาก
  • ประสิทธิภาพโดยรวมของเส้นโค้งนั้นมีเสถียรภาพมากขึ้นเนื่องจากจำนวนของพารามิเตอร์โดยประมาณมีการเปลี่ยนแปลง

ดังนั้นเส้นโค้งจะเสมอที่จะได้รับที่ต้องการจากมุมมองการคาดการณ์

รหัส

นี่คือรหัสที่ฉันใช้ในการสร้างการเปรียบเทียบเหล่านี้ ฉันได้รวมทุกอย่างไว้ในฟังก์ชั่นเพื่อที่คุณจะได้ลองใช้ฟังก์ชั่นสัญญาณของคุณเอง คุณจะต้องนำเข้าggplot2และsplinesไลบรารี R

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

การรวมมีความหมายอย่างมาก (ไม่ว่าผู้วิจัยจะรับรู้หรือไม่ก็ตาม)

หนึ่งควร bin ข้อมูลรวมถึงตัวแปรอิสระขึ้นอยู่กับข้อมูลของตัวเองเมื่อต้องการ:

  • เพื่อการตกเลือดพลังทางสถิติ

  • เพื่ออคติมาตรการของสมาคม

ฉันเชื่อว่าวรรณกรรมเริ่มต้นพร้อมกับ Ghelke และ Biehl (1934 - ควรค่าแก่การอ่านและชี้นำการจำลองคอมพิวเตอร์ที่ง่ายพอที่จะเรียกใช้ด้วยตนเอง) และดำเนินการต่อไปโดยเฉพาะอย่างยิ่งในวรรณคดี , 1983; Dudley, 1991; Lee และ Kemp, 2000) ทำให้ทั้งสองประเด็นนี้ชัดเจน

ถ้าไม่มีใครมีทฤษฎีเบื้องต้นของขนาดของการรวม (จำนวนหน่วยที่จะรวม) และฟังก์ชั่นการจัดหมวดหมู่ของการรวม (ซึ่งการสังเกตการณ์แต่ละอันจะจบลงด้วยการรวมหน่วย) หนึ่งไม่ควรรวม ยกตัวอย่างเช่นในระบาดวิทยาเราดูแลเกี่ยวกับสุขภาพของประชาชนและเกี่ยวกับสุขภาพของประชากร หลังไม่ได้เป็นเพียงแค่การสุ่มคอลเลกชันของอดีต แต่ถูกกำหนดโดยตัวอย่างเช่นขอบเขตทางภูมิศาสตร์การเมืองสถานการณ์ทางสังคมเช่นการจำแนกเชื้อชาติเผ่าพันธุ์สถานะของซากศพและหมวดหมู่ประวัติศาสตร์ ฯลฯ (ดูตัวอย่าง Krieger, 2012)

อ้างอิง
ดัดลีย์, G. (1991) สเกลการรวมและปัญหาหน่วยที่แก้ไขได้ [กำแพงที่จ่ายเงิน] The Geational Operational, 9 (3): 28–33

Gehlke, CE และ Biehl, K. (1934) ผลกระทบบางอย่างของการจัดกลุ่มตามขนาดของค่าสัมประสิทธิ์สหสัมพันธ์ในการสำรวจสำมะโนประชากรทางเดินวัสดุ [จ่ายค่าตอบแทน] วารสารสมาคมสถิติอเมริกัน , 29 (185): 169–170

Krieger, N. (2012) ใครคือคน "ประชากร" คืออะไร? การอภิปรายประวัติศาสตร์การถกเถียงกันในปัจจุบันและผลกระทบต่อการทำความเข้าใจ“ประชากรสุขภาพ” และแก้ไขความไม่เท่าเทียมสุขภาพ ไตรมาสของ Milbank , 90 (4): 634–681

ลี, HTK และ Kemp, Z. (2000) เหตุผลลำดับชั้นและ on-line การประมวลผลการวิเคราะห์ข้อมูลเชิงพื้นที่และเวลา ในการประชุมวิชาการระดับนานาชาติครั้งที่ 9 เรื่องการจัดการข้อมูลเชิงพื้นที่กรุงปักกิ่งประเทศจีน สหภาพภูมิศาสตร์ระหว่างประเทศ

Openshaw, S. (1983) ปัญหาของหน่วย areal ที่แก้ไขได้ แนวคิดและเทคนิคในการสมัยใหม่ภูมิศาสตร์ Geo Books, Norwich, UK


10
ฉันเสียใจที่ต้องโหวตคำตอบนี้เพราะตัวแทนของคุณมีขนาดใหญ่กว่า 8888 ซึ่งเป็นที่ชื่นชอบของฉัน
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.