2015-04-17 15 views
12

如何使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等顺序读数就可能是安全的)。

+3

当我第一次发布R问题时,我被要求[“制作可重复的例子”](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-例如/ 28481250#28481250)。这些提示帮助我提出了更好的R问题,甚至回答了我自己的R问题。简而言之,如果您在问题中提供示例数据以及您认为应该工作的代码(或者尽可能接近实现该代码的工作方式)以及预期的输出,那么我们都有一个很好的开始帮助你找到答案。 –

+0

你看过卡尔曼滤波器吗?它们旨在将两个容易出错的信号组合成一个更可靠的信号。 –

+0

@BenjyKessler - 我不确定卡尔曼是否适用于我的情况?维基百科关于卡尔曼滤波器的文章谈到了“固定滞后平滑器”,但在我的情况下,来自一个传感器与其他传感器的爆发之间的滞后是未知的,但已知(可能)存在。我希望SVM模型可以自动调整自己以检测滞后,如果它们很重要的话。无论如何,时滞会不时发生变化;我希望每当过程发生变化时,我都可以用新的培训数据重新训练SVM。如果我不知道滞后,卡尔曼还能帮忙吗?另外,如果我有6个输入,而不是2个,它可以帮助吗? – phonetagger

回答

0

支持向量机取一个特征向量并用它来建立一个分类器。您的特征向量可以是与第七维不同的来源和时间,每个维度可以有6个维度。每个有信号的时间点都会产生另一个向量。创建t载体,Vt,每个大小为7,并使这些成为您的特征向量。用数据填充它们并将它们传递到ksvm。通过添加t作为特征向量中的另一个特征,您可以将特定时间发生的所有数据与对方相关联,也可以帮助SVM了解它们是值的进展。 您可以选择Vt的一个子集作为训练集。您将不得不使用正确分类的标签手动标记这些向量。

+0

我不是很流利的R或统计,所以我不知道如何解释S1,...,S6,t产生{Vt},t = t0-> tn Vt <-R^7' 。你可以在你的答案中加入一些信息,说明每件事情的意义,并解释每件事的含义,以及“生产”的含义,包括它后面的逗号和“ - >”和“< - ”符号的含义?非常感谢。 – phonetagger

+0

我重新说了一遍,我也不是R的专家。这应该是你的方法。也许其他知道R的人可以帮助你实施。 –

+0

您是否在R中手动创建了ksvm对象(不使用Rattle)?我无法弄清楚如何创建这些“你所说的”特征向量。我可以从它的.csv文件加载一个单独的“观察”,它生成一个typeof()为“list”的表格,尽管当我打印它时,它看起来像是一个矩阵(二维数组)。我只是创建这些二维对象的列表,并简单地将它作为“数据”输入到ksvm中?顺便说一下,我现在将时间戳从2000年以来的秒数转换为开始以来的秒数,所以第一行的时间戳为0.000,依此类推。 – phonetagger

相关问题