Как стратифицировать выборку набора данных, провести статистический анализ с помощью Caret и повторить в r?

У меня есть набор данных, который я хотел бы стратифицировать, создать статистические модели с использованием пакета caret, а затем сгенерировать прогнозы.

Проблема, которую я обнаружил, заключается в том, что в разных итерациях стратифицированного набора данных я получаю значительно разные результаты (отчасти это может быть связано с относительно небольшой выборкой данных M=1000).

То, что я хочу сделать, это:

  1. Создайте выборку стратифицированных данных
  2. Создайте модель машинного обучения
  3. Повторите 1000 раза и возьмите средний результат модели.

Я надеюсь, что, повторяя шаги с вариантами стратифицированного набора данных, я смогу избежать тонких изменений в прогнозах, сгенерированных из-за меньшей выборки данных.

Например, это может выглядеть примерно так в r;

Original.Dataset = data.frame(A)

Stratified.Dataset = stratified(Original.Dataset, group = x)

Model = train(Stratified.Dataset.....other model inputs)

Repeat process with new stratified data set based on the original data and average out.

Заранее благодарим вас за любую помощь или предложения по пакетам, которые могут оказаться полезными. Можно ли расслоить образец в каре или смоделировать в каре?


person JFG123    schedule 20.02.2018    source источник
comment
Что вы имеете в виду под: The problem I am finding is that in different iterations of the stratified data set I get significantly different results ?   -  person nadizan    schedule 20.02.2018
comment
Так, например, если я выполню set.seed(1), создам набор данных и запущу анализ. Затем я повторяю и выполняю set.seed(2), создаю набор данных и запускаю точно такой же анализ. Мои прогнозы существенно отличаются. Что я хочу сделать, так это агрегировать результаты, запустив анализ стратифицированных выборок несколько раз, чтобы «сгладить» эти несоответствия.   -  person JFG123    schedule 20.02.2018
comment
@JackFahey-Gilmour, то, что вы описываете, - это ансамблевое обучение и, в частности, случайный лес. И его суть заключается в том, что ваши результаты будут значительно отличаться в каждой итерации выборки. Это источник врожденной силы ансамблевых моделей. Пожалуйста, прочитайте об обучении в ансамбле или, в частности, о случайном лесу, вам все станет намного яснее. Ваш вопрос сейчас слишком широк.   -  person FatihAkici    schedule 21.02.2018


Ответы (1)


Прежде всего, добро пожаловать в SO.

Трудно понять, что именно вас интересует, ваш вопрос очень широк.

Если вам нужны данные по статистике, я бы посоветовал вам задать более четкие вопросы в разделе Cross Validated. Вопросы и ответы для тех, кто интересуется статистикой, машинным обучением, анализом данных, интеллектуальным анализом данных и визуализацией данных.

Проблема, которую я обнаружил, заключается в том, что в разных итерациях стратифицированного набора данных я получаю значительно разные результаты (отчасти это может быть связано с относительно небольшой выборкой данных M = 1000).

Я предполагаю, что вы имеете в виду разные итерации вашей модели. Это зависит от того, насколько велики ваши различные группы. Например. если вы пытаетесь разделить набор данных, состоящий из 1000 образцов, на группы по 10 образцов, ваша модель, скорее всего, может быть нестабильной и, следовательно, давать разные результаты на каждой итерации. Это также может быть связано с тем, что ваша модель зависит от некоторой случайности, и чем меньше ваши данные (и чем больше групп), тем больше будет большая вариация. см. здесь или здесь для получения дополнительной информации о перекрестная проверка, стабильность и агрегация начальной загрузки.

  1. Создайте выборку стратифицированных данных

Как сгенерировать: пакет dplyr отлично группирует данные в зависимости от разных переменных. Вы также можете использовать функцию split из пакета base. Дополнительную информацию см. здесь. Вы также можете использовать встроенные методы из пакета caret, здесь.

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

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

tg <- data.frame(sample_names = rep(1:5,each=2))
set.seed(10)
tg$values<-rnorm(10)

partition <- lapply(1:100, function(z) {
  set.seed(z)
  sapply(unique(tg$sample_names), function(x) {
    which(x == tg$sample_names)[sample(1:2, 1)]
  })
})

#the first partition of your data to train a model.
tg[partition[[1]],]
  1. Создайте модель машинного обучения

Если вы хотите использовать caret, вы можете перейти на веб-страницу каретки. И посмотреть все доступные модели. В зависимости от вашего исследовательского вопроса и/или данных вы хотели бы использовать разные типы моделей. Поэтому я бы порекомендовал вам пройти несколько онлайн-курсов по машинному обучению, например курс Стэнфордского университета, проводимый Эндрю Нг (я взял его сам), чтобы лучше познакомиться с различными основными алгоритмами. Если вы знакомы с алгоритмами, просто найдите доступные модели.

  1. Повторите 1000 раз и возьмите средний результат модели.

Вы можете повторить свою модель 1000 раз с разными исходными значениями (см. set.seed) и разными методами обучения, например. перекрестная проверка или начальная агрегация. В пакете caret очень много разных параметров тренировки:

Функция trainControl генерирует параметры, которые дополнительно управляют созданием моделей, с возможными значениями:

метод: метод повторной выборки: "boot", "cv", "LOOCV", "LGOCV", "repeatedcv", "timeslice", "none" и "oob"

Дополнительную информацию о методах см. здесь.

person nadizan    schedule 20.02.2018
comment
Привет @nadisan, спасибо за ваш ответ. Я не думаю, что я был достаточно ясен раньше. Я уже довольно давно использую r и Caret, но наткнулся на этот набор данных. Я объясню это далее здесь. В моем наборе данных есть примеры, когда один обучающий пример включен, а другой нет. Поэтому некоторые из обучающих примеров представляют собой пары, где в наборе обучающих данных может существовать только 1. Что я обнаружил, так это то, что когда я использовал разные комбинации набора данных (только с одной из пар), я получаю разные результаты. - person JFG123; 21.02.2018
comment
Поэтому я хочу сделать стратификацию набора данных (поэтому только 1 из пар включена в обучение), а затем запустить модель на этом. Но для каждого повторения модели используется разная стратификация набора данных. Возможно ли это сделать внутри каретки? Это мой главный вопрос, может ли карет делать расслоение (с определенными условиями, такими как это) внутри своей обработки? Еще раз спасибо за помощь. #впервыепользователь - person JFG123; 21.02.2018
comment
Смотрите обновленный ответ, правильно ли я понял ваш вопрос? - person nadizan; 21.02.2018
comment
Привет @nadisan, да! Это действительно хороший способ создания различных наборов обучающих данных. Как мне затем обучить модель на всех этих разных версиях обучающего набора данных? Можно ли встроить эту формулу в каретку, чтобы модель можно было обучить на всех различных версиях и агрегировать, чтобы получить окончательный результат модели? Спасибо за ваше время. - person JFG123; 21.02.2018
comment
@JackFahey-Gilmour, вы можете использовать функцию trainControl в caret и добавить index=partition, чтобы у вас было что-то вроде: trainControl(method = "cv", index=partition, returnResamp="all"). Затем model_iris<-train(Sepal.Length~Petal.Length+Petal.Width, data=iris,method = "lm", trControl = tmp). В полученном объекте train вы найдете список под названием model_iris$resample с ошибками и метриками, НО вы не получите коэффициенты. См. ответ автора caret здесь: stackoverflow.com/questions/28303509/. - person nadizan; 21.02.2018
comment
@JackFahey-Gilmour также, пожалуйста, примите (и поддержите) мой ответ, если вы найдете его информативным и полезным, чтобы другие люди могли найти это решение. - person nadizan; 21.02.2018
comment
действительно хорошее предложение, я вижу, как это работает. У меня есть вопрос относительно вашего комментария «index=partition», это работает, но если я не установлю indexOut, он будет использовать «уникальный набор образцов, не содержащихся в индексе» в соответствии с документацией по каретке. Есть ли способ указать, что я хочу, чтобы все перекрестные проверки происходили в одной повторной выборке? Т.е. выставленный набор для cv исходит из перевыборочной группы. В противном случае, если indexOut не установлен, дубликаты могут существовать в наборе проверки во время каждой итерации cv. Я так это интерпретировал? - person JFG123; 21.02.2018
comment
@ JackFahey-Gilmour Да, вы правильно поняли. Вам нужно будет указать образцы в indexOut. Альтернативой может быть выполнение разных train для каждого раздела, например. в цикле for, а затем сохраните все коэффициенты/параметры. Это, наверное, будет самый простой путь. Еще раз, нажмите на мой основной пост и проголосуйте и/или примите ответ, если он покажется вам полезным. Подробнее здесь: stackoverflow.com/help/someone-answers Удачи! - person nadizan; 22.02.2018