如何使ksvm模型知道数据集中的前100个数字是来自一个传感器的所有时间序列数据,而接下来的100个数字都是来自另一个传感器等的时间序列数据,用于六个独立的时间序列传感器输入?或者(也许更一般地),我怎样才能向SVM提供二维输入数据?如何将多个时间序列数据呈现给R中的SVM(ksvm)(或者,如何将二维输入数据呈现给SVM)
我需要一个二进制是/否预测模型的过程有六个非周期的时间序列输入,全部采用相同的采样频率。事件触发数据收集的开始,并且在预定时间之后,我需要是/否预测(最好包括正确性输出的概率)。应该产生“是”还是“不”的时间序列输入的特征是未知的,但是已知的是每个输入时间序列数据与最终结果之间应该存在某种相关性。所有输入信号都有明显的噪音。有意义的信息以及噪声都作为短时间突发出现在输入上(对于给定的输入源,有意义的突发总是在相同的一般时间内),但识别哪些突发是有意义的,哪些是噪声是困难的;即在一个输入的“正确”时间发生突发的事实不一定表示“是”输出;它可能只是噪音。要知道预测是否为“是”,该模型需要以某种方式整合来自所有六个时间序列输入的信息。我收集了大约900个“否”结果和100个“是”结果的先前数据。
我对R和SVM都很新,但我想我使用SVM模型(kernlab's ksvm)。我无法弄清楚如何向其输入数据。我也不知道如何告诉ksvm数据是时间序列数据,或者甚至是相关的。我已经尝试使用Rattle GUI前端R来从csv文件中提取数据,但我无法弄清楚如何将所有六个输入中的时间序列数据呈现到ksvm模型中。作为一个csv文件输入,似乎导入所有1000个样本数据的唯一方法是组织输入数据,以便所有样本数据(针对所有六个时间序列输入)位于csv文件的一行中,并与一个单独的已知结果文件的数据显示在csv文件的每一行上。但是这样做,第一,第二,第三等数字是来自第一传感器的时间序列数据的每个部分的事实在翻译中丢失了,以及第101,102,103等等的事实数字是来自第二传感器的时间序列数据的每个部分,依此类推;对于ksvm模型,每个数据样本都被认为是与其邻居无关的孤立数字。如何将这些数据作为六个独立但相互关联的时间序列数组呈现给ksvm?或者我如何向ksvm展示一个二维数据数组?
UPDATE:
OK,还有我和令人沮丧的结果尝试了两种基本策略(当然,得到的模型优于盲目猜测,但不多)。
首先,不熟悉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 /拉特尔的唯一方法就是按摩&所有结果文件合并成一个单一的.csv文件,每行一个样品的结果。我只能想到两种方法来做到这一点,所以我尝试了两种方法(我知道当我这样做时,通过这样做我隐藏了潜在的重要信息,这就是这个问题的要点):
试验#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
当我开始使用拉特尔生成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)
试验#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
并再次我用摇铃来生成SVM和拉特尔的日志选项卡给我下面的脚本:
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)
不幸的是,即使NEA rly 1000训练数据集,所得到的两个模型给我的结果只比我随机偶然得到的结果稍好一些。我非常肯定,如果有一种方法可以避免爆炸时间数据或不同传感器之间的区别,它会更好。我怎样才能做到这一点?顺便说一下,我不知道它是否重要,但所有传感器的传感器读数几乎完全相同,但一次读数和下一次读数之间的时间差通常从一次运行到另一次运行变化10%到20%下一步(即在“培训”文件之间),我无法控制这一点。我认为这可能是可以忽略的(也就是说,我认为只需按1,2,3等顺序读数就可能是安全的)。
当我第一次发布R问题时,我被要求[“制作可重复的例子”](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-例如/ 28481250#28481250)。这些提示帮助我提出了更好的R问题,甚至回答了我自己的R问题。简而言之,如果您在问题中提供示例数据以及您认为应该工作的代码(或者尽可能接近实现该代码的工作方式)以及预期的输出,那么我们都有一个很好的开始帮助你找到答案。 –
你看过卡尔曼滤波器吗?它们旨在将两个容易出错的信号组合成一个更可靠的信号。 –
@BenjyKessler - 我不确定卡尔曼是否适用于我的情况?维基百科关于卡尔曼滤波器的文章谈到了“固定滞后平滑器”,但在我的情况下,来自一个传感器与其他传感器的爆发之间的滞后是未知的,但已知(可能)存在。我希望SVM模型可以自动调整自己以检测滞后,如果它们很重要的话。无论如何,时滞会不时发生变化;我希望每当过程发生变化时,我都可以用新的培训数据重新训练SVM。如果我不知道滞后,卡尔曼还能帮忙吗?另外,如果我有6个输入,而不是2个,它可以帮助吗? – phonetagger