Коли ми повинні дискретизувати / бін безперервні незалежні змінні / функції, а коли не слід?


22

Коли ми повинні дискретизувати / бін незалежні змінні / функції, а коли не слід?

Мої спроби відповісти на питання:

  • Взагалі, ми не повинні бініти, оскільки бінінг втратить інформацію.
  • Бінінг насправді збільшує ступінь свободи моделі, тому можливе сприятливе пристосування після бінінгу. Якщо у нас є модель "з великим ухилом", бінінг може бути не поганим, але якщо у нас є модель "з великою дисперсією", ми повинні уникати бінінгу.
  • Це залежить від того, яку модель ми використовуємо. Якщо це лінійний режим, і в даних є багато "залишків", ймовірність шифрування краще. Якщо у нас є модель дерева, то зовнішнє та білінгне буде мати велике значення.

Чи правий я? і що ще?


Я думав, що це питання потрібно задавати багато разів, але я не можу знайти його в резюме лише в цих публікаціях

Чи повинні ми сполучати суцільні змінні?

Яка користь від розриву суцільної змінної предиктора?


Я не думаю, що це питання є дублюючим, оскільки відповідь насправді не вирішує це питання ("чи варто це робити").
Firebug

8
CART / випадкові лісові підходи - це більш-менш бінінг безперервних змінних (підганяння кусково-постійних функцій), але вони роблять це набагато краще. Якщо ви робите попереднє сміття, ви заперечуєте свій алгоритм побудови дерев у гнучкості для оптимального розміщення перерв ...
Бен Болкер

Відповіді:


16

Схоже, ви також шукаєте відповідь з прогнозної точки зору, тому я зібрав коротку демонстрацію двох підходів у R

  • Об'єднання змінної на коефіцієнти однакового розміру.
  • Природні кубічні сплайни

Нижче я надав код функції, яка автоматично порівнюватиме два методи для будь-якої заданої функції справжнього сигналу

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

Ця функція створить шумні набори тренувань та тестування наборів даних із заданого сигналу, а потім встановить ряд лінійних регресій до даних тренувань двох типів

  • cutsМодель включає в себе Binned предикторов, утворених сегментації діапазону даних на рівні по розміру половиною відкритих інтервали, а потім створити виконавчі предиктори вказують на який інтервал кожної точка навчання належить.
  • 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)

Ось як змінюються показники помилок

групування проти сплайнів, поїзд та тестові показники з різним ступенем свободи для збільшення хвилі гріха

Другий приклад - горіхова функція, яку я тримаю навколо лише для подібних речей, накресліть її та подивіться

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

Агрегація є суттєво значимою (про те, чи знає дослідник про це).

Дані, у тому числі незалежні змінні, слід обробляти на основі самих даних, коли потрібно:

  • Для крововиливу в статистичну потужність.

  • Для зміщення заходів асоціації.

Я вважаю, література, що починається з Гельке та Біля (1934 - безумовно, варто прочитати, і наводить на думку про досить легкі комп'ютерні симуляції, які можна запустити для себе), і продовжуючи, особливо, в літературі про "модифіковану проблему ареальної одиниці" (Опеншоу , 1983; Дадлі, 1991; Лі і Кемп, 2000) чітко пояснює обидві ці точки.

Якщо одна з них не має апріорної теорії масштабу агрегації (скільки одиниць для агрегації) та функції категоризації агрегації (які окремі спостереження закінчуються в яких агрегатних одиницях), не слід агрегувати. Наприклад, в епідеміології ми дбаємо і про здоров'я людей , і про здоров'я населення . Останні - це не просто випадкові колекції перших, але визначені, наприклад, геополітичними межами, соціальними обставинами, такими як расово-етнічна категоризація, карцеральний статус та категорії історії тощо (Див., Наприклад, Krieger, 2012)

Список літератури
Дадлі, Г. (1991). Масштабність, агрегація та проблема, що може змінюватися, підрозділами області . [платний стін] Операційний географ, 9 (3): 28–33.

Gehlke, CE та Biehl, K. (1934). Певні ефекти групування за розміром коефіцієнта кореляції у матеріалі перепису . [pay-wallled] Журнал Американської статистичної асоціації , 29 (185): 169–170.

Крігер, Н. (2012). Хто і що таке "населення"? історичні дебати, поточні суперечки та наслідки для розуміння "здоров'я населення" та виправлення нерівностей у галузі охорони здоров'я . Квартал Мільбанку, 90 (4): 634–681.

Лі, HTK та Kemp, Z. (2000). Ієрархічні міркування та он-лайн аналітична обробка просторових та часових даних . У матеріалах 9-го Міжнародного симпозіуму по обробці просторових даних , Пекін, Китай. Міжнародний географічний союз.

Опеншоу, С. (1983). Проблема з можливістю зміни в ареалі. Поняття та методи в сучасній географії . Гео Книги, Норвіч, Великобританія.


10
Мені було сумно голосувати за цю відповідь, оскільки ваш представник тепер більший за 8888, що естетично мені подобалося.
Sycorax каже, що повернеться до Моніки

@ hxd1011 та GeneralAbrial:: D: D: D: D
Олексій

Я люблю цю відповідь, але @ MatthewDrury відповідь дійсно я хочу бачити.
Хайтао Ду

Дякую за переконливу відповідь з купою цікавих посилань!
y.selivonchyk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.