如何将多个时间序列数据呈现给R中的SVM(ksvm)(或者,如何将二维输入数据呈现给SVM)

时间:2015-04-17 16:58:37

标签: r time-series svm kernlab

如何让ksvm模型知道数据集中的前100个数字是来自一个传感器的所有时间序列数据,而接下来的100个数字是来自另一个传感器等的所有时间序列数据,单独的时间序列传感器输入或者(也许更一般地),如何将二维输入数据呈现给SVM?

我需要二进制是/否预测模型的过程有六个非周期时间序列输入,所有输入具有相同的采样频率。事件触发数据收集的开始,并且在预定时间之后我需要是/否预测(优选地包括正确性概率输出)。时间序列输入的特征应该产生“是”' vs.' no'不知道,但已知的是每个输入时间序列数据和最终结果之间应该有一些相关性。所有输入都存在明显的噪音。有意义的信息和噪声都作为短持续时间突发出现在输入上(有意义的突发总是在给定输入源的相同的一般时间内),但是识别哪些突发是有意义的以及哪些是噪声是困难的;即突发事件发生在"右边"一次输入的时间不一定表示"是"输出;它可能只是噪音。要知道预测是否应该是"是",模型需要以某种方式合并来自所有六个时间序列输入的信息。我收集了大约900' no'之前的数据。结果和100'是'结果

我对R和SVM都很陌生,但我想我想使用SVM模型(kernlab's ksvm)。我无法弄清楚如何向其提供输入数据。我也不确定如何告诉ksvm数据是时间序列数据,或者是否相关。我尝试使用Rattle GUI前端来从C中提取我的数据,但是我无法弄清楚如何将来自所有六个输入的时间序列数据呈现到ksvm模型中。作为csv文件输入,似乎导入所有1000个样本的数据的唯一方法是组织输入数据,使得所有样本数据(对于所有六个时间序列输入)都在csv文件的单行上,在csv文件的每一行上显示单独的已知结果文件的数据。但是这样做,第一个,第二个,第三个等数字是来自第一个传感器的时间序列数据的每个部分的事实在翻译中丢失,以及第101,102,123等事实数字是来自第二传感器的时间序列数据的每一部分,依此类推;对于ksvm模型,每个数据样本只被认为是与其邻居无关的孤立数字。如何将这些数据作为六个独立但相互关联的时间序列数组提供给ksvm?或者我如何向ksvm提供二维数据数组?


更新:

好的,有两种基本策略我尝试过惨淡的结果(嗯,结果模型比盲猜更好,但不多)。

首先,不熟悉R,我使用了Rattle GUI前端到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文件中,每行一个样本结果。我只想到两种方法,所以我尝试了两种方式(我知道当我这样做时,通过这样做,我隐藏了潜在的重要信息,这是这个问题的重点): / p>

试用#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的日志选项卡为我提供了以下脚本,可用于生成&在RGui培训SVM:

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)

试用#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的日志选项卡给出了以下脚本:

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%之间变化。通常从一次运行到另一次运行(即#34;训练和#34;文件之间),我无法控制它。我认为可以安全地忽略(即我认为按顺序编号读数可能是安全的,如1,2,3等)。

1 个答案:

答案 0 :(得分:0)

SVM采用特征向量并使用它来构建分类器。您的特征向量可以是6个维度,每个维度来自不同的来源,时间作为第七维度。从中获得信号的每个时间点将产生另一个向量。创建每个大小为7的t个向量Vt,并将它们作为特征向量。用您的数据填充它们并将它们传递到ksvm。通过在特征向量中添加t作为另一个特征,您将在特定时间发生的所有数据相互关联,但它也将帮助SVM了解它们是值的进展。 您可以选择Vt的子集作为训练集。您必须使用正确分类的标签手动标记这些向量。