Nano Hash - криптовалюты, майнинг, программирование

Создание разделов данных по выбранному диапазону данных для передачи в функцию caret :: train для перекрестной проверки

Я хочу создать разделы данных складного ножа для фрейма данных ниже, с разделами, которые будут использоваться в caret::train (например, caret::groupKFold() производит). Однако загвоздка в том, что я хочу ограничить тестовые точки, чтобы они говорили больше, чем 16 дней, при этом используя оставшуюся часть этих данных в качестве обучающего набора.

df <- data.frame(Effect = seq(from = 0.05, to = 1, by = 0.05),
     Time = seq(1:20))

Причина, по которой я хочу это сделать, заключается в том, что меня действительно интересует только то, насколько хорошо модель предсказывает верхнюю границу, поскольку это область интереса. Я чувствую, что есть способ сделать это с помощью функции caret::groupKFold(), но я не уверен, как это сделать. Любая помощь будет принята с благодарностью.

Пример того, что будет включать каждое резюме:

TrainSet1 <- subset(df, Time != 16)
TestSet1 <- subset(df, Time == 16)

TrainSet2 <- subset(df, Time != 17)
TestSet2 <- subset(df, Time == 17)

TrainSet3 <- subset(df, Time != 18)
TestSet3 <- subset(df, Time == 18)

TrainSet4 <- subset(df, Time != 19)
TestSet4 <- subset(df, Time == 19)

TrainSet5 <- subset(df, Time != 20)
TestSet5 <- subset(df, Time == 20)

Хотя в формате, который выводит функция caret::groupKFold, чтобы складки можно было передать в функцию caret::train:

CVFolds <- caret::groupKFold(df$Time)
CVFolds

Заранее спасибо!


  • Мне непонятно, что именно вы хотели бы сделать. Не могли бы вы показать пример тестовых складок (ожидаемого результата) на опубликованных данных? 16.10.2018
  • Извините и спасибо за совет! См. Редактирование выше! 17.10.2018

Ответы:


1

Для индивидуальных складок я считаю встроенные функции недостаточно гибкими. Поэтому я обычно создаю их с использованием tidyverse. Один из подходов к вашей проблеме:

library(tidyverse)

df %>%
  mutate(id = row_number()) %>% #use the row number as a column called id
  filter(Time > 15) %>% #filter Time as per your need
  split(.$Time)  %>% #split df to a list by Time
  map(~ .x %>% select(id)) #select row numbers for each list element

пример с двумя строками каждый раз:

df <- data.frame(Effect = seq(from = 0.025, to = 1, by = 0.025),
                 Time = rep(1:20, each = 2))

df %>%
  mutate(id = row_number()) %>%
  filter(Time > 15) %>%
  split(.$Time)  %>%
  map(~ .x %>% select(id)) -> test_folds

test_folds
#output
$`16`
  id
1 31
2 32

$`17`
  id
3 33
4 34

$`18`
  id
5 35
6 36

$`19`
  id
7 37
8 38

$`20`
   id
9  39
10 40

с неравным количеством строк за раз

df <- data.frame(Effect = seq(from = 0.55, to = 1, by = 0.05),
                 Time = c(rep(1, 5), rep(2, 3), rep(rep(3, 2))))

df %>%
  mutate(id = row_number()) %>%
  filter(Time > 1) %>%
  split(.$Time)  %>%
  map(~ .x %>% select(id))

$`2`
  id
1  6
2  7
3  8

$`3`
  id
4  9
5 10

Теперь вы можете определить эти удерживающие складки внутри trainControl с аргументом indexOut.

РЕДАКТИРОВАТЬ: чтобы получить аналогичный результат caret::groupKFold, можно:

df %>%
  mutate(id = row_number()) %>%
  filter(Time > 1) %>%
  split(.$Time)  %>%
  map(~ .x %>%
        select(id) %>%
        unlist %>%
        unname) %>%
  unname
17.10.2018
  • Привет, госпожа, спасибо за помощь! Я только что вернулся к просмотру этого материала и столкнулся с небольшой проблемой. Результатом приведенного выше кода являются списки с таблицами с одним целочисленным столбцом, но для функции trainControl требуются списки, содержащие один целочисленный вектор. Я играл с ним, но я не очень знаком с tidyverse и не смог изменить его, чтобы получить желаемый результат. Требуемый формат отображается в строке caret::groupKfold(data$Time). Заранее спасибо! 19.11.2018
  • вы можете просто добавить unlist вызов карты. Отметьте редактировать. 19.11.2018
  • Еще раз спасибо за помощь @missuse! Я столкнулся с другой проблемой, которую не предвидел - если у меня есть данные, структурированные следующим образом: df <- data.frame(Effect = rep(seq(from = 0.05, to = 1, by = 0.05), each = 5), Time = rep(seq(1:20), each = 5)). Есть ли способ адаптировать ваш код, чтобы брать каждую временную точку в верхней границе (скажем, ›15) и создавать складку из каждой строки? Т.е. каждая временная точка в верхней скобке используется как тестовый набор один раз, а все остальные данные используются для обучения. 20.11.2018
  • Что-то вроде исключения одного резюме, но только с указанным подмножеством всех данных? Да, есть, но я думаю, было бы лучше, если бы вы разместили это как отдельный вопрос, поскольку несколько дополнительных вопросов в комментариях часто приводят к ответу, который часто трудно интерпретировать другим. 20.11.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..