Подтвердить что ты не робот

Как представить несколько данных временного ряда в SVM (ksvm) в R (или, Как представить двумерные входные данные в SVM)

Как я могу сделать модель ksvm осведомленной о том, что первые 100 номеров в наборе данных являются данными временного ряда от одного датчика, а следующие 100 номеров - все время серийные данные от другого датчика и т.д., для шести отдельных входов датчиков временных рядов? Альтернативно (и, возможно, в более общем плане), как я могу представить двумерные входные данные в SVM?

Процесс, для которого мне нужен двоичная модель предсказания да/нет, имеет шесть непериодических временных рядов, все с одинаковой частотой дискретизации. Событие инициирует начало сбора данных, и после заранее определенного времени мне нужно предсказать "да/нет" (желательно, включая вывод вероятности правильности). Характеристики входов временного ряда, которые должны давать "да" и "нет", неизвестны, но известно, что должна быть некоторая корреляция между каждым из данных временных рядов ввода и конечным результатом. На всех входах присутствует значительный шум. И значительная информация, и шум появляются на входах как кратковременные всплески (значимые всплески всегда находятся в одном общем времени для данного источника входного сигнала), но определение того, какие всплески имеют смысл и которые являются помехами, затруднительны; то есть тот факт, что взрыв произошел в "правильное" время для одного входа, необязательно означает "да"; это может быть просто шум. Чтобы узнать, должно ли предсказание быть "да", модели необходимо каким-то образом включить информацию из всех шести временных рядов. У меня есть сбор предыдущих данных с результатами около 900 "нет" и 100 "да".

Я новичок в R и SVM, но я думаю, что хочу использовать SVM-модель (kernlab ksvm). У меня возникли проблемы с тем, как представить входные данные. Я также не уверен, как сообщить ksvm, что данные являются данными временных рядов, или если это даже актуально. Я попытался использовать интерфейс Rattle GUI для R, чтобы вытащить мои данные из файлов csv, но я не могу понять, как представить данные временных рядов из всех шести входов в модель ksvm. Как вход csv файла, кажется, единственный способ импортировать данные для всех 1000 выборок - это организовать входные данные, чтобы все выборочные данные (для всех шести временных рядов) находились в одной строке файла csv, с отдельные данные файла с известным результатом, представленные в каждой строке файла csv. Но при этом в переводе теряется тот факт, что номера 1-го, 2-го, 3-го и т.д. Представляют собой часть данных временного ряда от первого датчика, а также тот факт, что 101-й, 102-й, 103-й и т.д. номера - это каждая часть данных временного ряда от второго датчика и т.д.; к модели ksvm каждый образец данных считается только изолированным числом, не связанным с его соседом. Как представить эти данные в ksvm как шесть отдельных, но взаимосвязанных массивов временных рядов? Или как я могу представить 2-мерный массив данных в ksvm?


UPDATE:

Хорошо, есть две основные стратегии, которые я пробовал с мрачными результатами (ну, полученные модели были лучше, чем слепое угадывание, но не так много).

Прежде всего, не знакомый с R, я использовал Rattle GUI front-end для R. У меня такое чувство, что, делая это, я могу ограничить свои варианты. Но в любом случае, вот что я сделал.....

Примеры известных файлов результатов (показаны только с 4 датчиками вместо 6 и только 7 временных выборок вместо 100):

training168_yes.csv

Seconds Since 1/1/2000,sensor1,sensor2,sensor3,sensor4
454768042.4,           0,      0,      0,      0
454768042.6,           51,     60,     0,      172
454768043.3,           0,      0,      0,      0
454768043.7,           300,    0,      0,      37
454768044.0,           0,      0,      1518,   0
454768044.3,           0,      0,      0,      0
454768044.7,           335,    0,      0,      4273

training169_no.csv

Seconds Since 1/1/2000,sensor1,sensor2,sensor3,sensor4
454767904.5,           0,      0,      0,      0
454767904.8,           51,     0,      498,    0
454767905.0,           633,    0,      204,    55
454767905.3,           0,      0,      0,      512
454767905.6,           202,    655,    739,    656
454767905.8,           0,      0,      0,      0
454767906.0,           0,      934,    0,      7814

Единственный способ, которым я знаю, получить данные для всех учебных образцов в R/Rattle, - это массаж и объединение всех файлов результатов в один файл .csv с одним результатом выборки на строку. Я могу придумать только два способа сделать это, поэтому я попробовал их обоих (и я знал, когда делаю это, делая это, я скрываю потенциально важную информацию, что является точкой этого вопроса SO):

TRIAL # 1: Для каждого файла результата добавьте каждый образец датчика в один номер, уничтожьте всю временную информацию:

result,sensor1,sensor2,sensor3,sensor4
no,    886,    1589,   1441,   9037
yes,   686,    60,     1518,   4482
no,    632,    1289,   1173,   9152
yes,   411,    67,     988,    5030
no,    772,    1703,   1351,   9008
yes,   490,    70,     1348,   4909

Когда я получаю с помощью Rattle для создания SVM, вкладка журнала Rattle дает мне следующий script, который можно использовать для генерации и обучения SVM в RGui:

library(rattle)
building <- TRUE
scoring  <- ! building
library(colorspace)
crv$seed <- 42 
crs$dataset <- read.csv("file:///C:/Users/mminich/Desktop/stackoverflow/trainingSummary1.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")
set.seed(crv$seed) 
crs$nobs <- nrow(crs$dataset) # 6 observations 
crs$sample <- crs$train <- sample(nrow(crs$dataset), 0.67*crs$nobs) # 4 observations
crs$validate <- NULL
crs$test <- setdiff(setdiff(seq_len(nrow(crs$dataset)), crs$train), crs$validate) # 2 observations
# The following variable selections have been noted.
crs$input <- c("sensor1", "sensor2", "sensor3", "sensor4")
crs$numeric <- c("sensor1", "sensor2", "sensor3", "sensor4")
crs$categoric <- NULL
crs$target  <- "result"
crs$risk    <- NULL
crs$ident   <- NULL
crs$ignore  <- NULL
crs$weights <- NULL
require(kernlab, quietly=TRUE)
set.seed(crv$seed)
crs$ksvm <- ksvm(as.factor(result) ~ .,
      data=crs$dataset[,c(crs$input, crs$target)],
      kernel="polydot",
      kpar=list("degree"=1),
      prob.model=TRUE)

TRIAL # 2:. Для каждого файла результата добавьте образцы для всех датчиков за каждый раз в один номер, удалив любую информацию об отдельных датчиках:

result,time1, time2, time3, time4, time5, time6, time7
no,    0,     549,   892,   512,   2252,  0,     8748
yes,   0,     283,   0,     337,   1518,  0,     4608
no,    0,     555,   753,   518,   2501,  0,     8984
yes,   0,     278,   12,    349,   1438,  3,     4441
no,    0,     602,   901,   499,   2391,  0,     7989
yes,   0,     271,   3,     364,   1474,  1,     4599

И снова я использую Rattle для создания SVM, а вкладка Rattle log дает мне следующий script:

library(rattle)
building <- TRUE
scoring  <- ! building
library(colorspace)
crv$seed <- 42 
crs$dataset <- read.csv("file:///C:/Users/mminich/Desktop/stackoverflow/trainingSummary2.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")
set.seed(crv$seed) 
crs$nobs <- nrow(crs$dataset) # 6 observations 
crs$sample <- crs$train <- sample(nrow(crs$dataset), 0.67*crs$nobs) # 4 observations
crs$validate <- NULL
crs$test <- setdiff(setdiff(seq_len(nrow(crs$dataset)), crs$train), crs$validate) # 2 observations
# The following variable selections have been noted.
crs$input <- c("time1", "time2", "time3", "time4", "time5", "time6", "time7")
crs$numeric <- c("time1", "time2", "time3", "time4", "time5", "time6", "time7")
crs$categoric <- NULL
crs$target  <- "result"
crs$risk    <- NULL
crs$ident   <- NULL
crs$ignore  <- NULL
crs$weights <- NULL
require(kernlab, quietly=TRUE)
set.seed(crv$seed)
crs$ksvm <- ksvm(as.factor(result) ~ .,
      data=crs$dataset[,c(crs$input, crs$target)],
      kernel="polydot",
      kpar=list("degree"=1),
      prob.model=TRUE)

К сожалению, даже с почти 1000 наборами учебных материалов, обе полученные модели дают мне лишь несколько лучшие результаты, чем я получаю от случайных случайностей. Я уверен, что было бы лучше, если бы был способ избежать взрыва либо временных данных, либо различия между разными датчиками. Как я могу это сделать? Кстати, я не знаю, важно ли это, но показания датчиков для всех датчиков берутся почти точно в одно и то же время, но разница во времени между одним чтением и следующей изменяется, может быть, от 10 до 20%, как правило, от одного прогона до следующий (т.е. между "обучающими" файлами), и я не контролирую это. Я думаю, что, вероятно, безопасно игнорировать (т.е. Я думаю, что, вероятно, безопасно просто подсчитывать показания последовательно, как 1,2,3 и т.д.).

4b9b3361

Ответ 1

SVM использует вектор функций и использует его для построения классификатора. Ваши векторы объектов могут быть 6 измерений каждый из другого источника и времени в качестве седьмого измерения. Каждый момент времени, с которого у вас есть сигнал, будет производить другой вектор. Создайте векторы t, Vt, размером 7 каждый и создайте те ваши векторы объектов. Заполните их своими данными и передайте их в ksvm. Добавляя t в качестве еще одной функции в векторе функций, вы сопоставляете как все данные, которые происходили в определенное время друг с другом, но также помогают SVM узнать, что они являются прогрессированием значений. Вы можете выбрать подмножество Vt в качестве учебного набора. Вам придется вручную пометить эти векторы с меткой, которая является правильной классификацией.