首页 文章

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

提问于
浏览
13

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

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

我'm pretty new to both R and SVM',但我想我想使用SVM模型(kernlab's ksvm) . 我'm having trouble figuring out how to present the input data to it. I'也不知道如何告诉ksvm数据是时间序列数据,或者是否相关 . 我想出如何将所有六个输入的时间序列数据呈现给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文件中,每行一个样本结果 . 我只想到两种方法,所以我尝试了两种方式(我知道当我这样做时,通过这样做,我隐藏了潜在的重要信息,这是这个问题的重点):

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的日志选项卡为我提供了以下脚本,可用于在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)

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的日志选项卡为我提供了以下脚本:

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等) .

1 回答

  • 0

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

相关问题