17

データセット内の最初の 100 個の数値がすべて 1 つのセンサーからの時系列データであり、次の 100 個の数値が別のセンサーからのすべての時系列データであることをksvmモデルに認識させるにはどうすればよいですか? 別の方法として (そしておそらくより一般的に)、2 次元の入力データを SVM に提示するにはどうすればよいでしょうか?

バイナリの yes/no 予測モデルが必要なプロセスには、6 つの非周期的な時系列入力があり、すべて同じサンプリング周波数です。イベントがデータ収集の開始をトリガーし、事前に決められた時間の後、yes/no の予測が必要です (できれば、正確性の出力を含む)。「はい」対「いいえ」を生成する時系列入力の特性は不明ですが、入力時系列データのそれぞれと最終結果の間に何らかの相関があるはずであることがわかっています。また、すべての入力にかなりのノイズが存在します。意味のある情報とノイズの両方が短期間のバーストとして入力に現れます (意味のあるバーストは、特定の入力ソースに対して常に同じ一般的な時間にあります)。しかし、どのバーストが意味を持ち、どれがノイズであるかを識別することは困難です。つまり、1 つの入力に対して「適切な」タイミングでバーストが発生したという事実は、必ずしも「はい」の出力を示すわけではありません。ただのノイズかもしれません。予測が「はい」であるかどうかを知るには、モデルに 6 つの時系列入力すべてから何らかの方法で情報を組み込む必要があります。約 900 件の「いいえ」の結果と 100 件の「はい」の結果を含む以前のデータのコレクションがあります。

私は R と SVM の両方にかなり慣れていませんが、SVM モデル ( kernlab の ksvm)。入力データをそれに提示する方法を理解するのに苦労しています。また、データが時系列データであること、またはそれが関連していることを ksvm に伝える方法もわかりません。Rattle GUI フロントエンドを R に使用して、csv ファイルからデータを取り込もうとしましたが、6 つの入力すべてからの時系列データを ksvm モデルに表示する方法がわかりません。csv ファイルの入力として、1000 サンプルすべてのデータをインポートする唯一の方法は、すべてのサンプル データ (6 つの時系列入力すべて) が csv ファイルの 1 行に収まるように入力データを整理することです。 csv ファイルの各行に個別の既知の結果ファイルのデータが表示されます。しかし、そうすると、1 番目、2 番目、3 番目などの数字が最初のセンサーからの時系列データの各部分であるという事実と、101 番目、102 番目、103 番目などの数字は、2 番目のセンサーからの時系列データの各部分です。ksvm モデルでは、各データ サンプルは隣接するデータとは関係のない孤立した数値と見なされます。このデータを、相互に関連している 6 つの個別の時系列配列として ksvm に提示するにはどうすればよいですか? または、データの 2 次元配列を ksvm に提示するにはどうすればよいですか?


アップデート:

OK、私が試した基本的な戦略が 2 つあります (結果として得られたモデルは、盲目的な推測よりも優れていましたが、それほどではありませんでした)。

まず、R に慣れていないので、Rattle GUI フロントエンドを R に使用しました。そうすることで、オプションが制限される可能性があると感じています。しかし、とにかく、これが私がやったことです.....

既知の結果ファイルの例 (6 つではなく 4 つのセンサーのみ、および 100 ではなく 7 つの時間サンプルのみで示されています):

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 に取得する唯一の方法は、すべての結果ファイルを 1 つの .csv ファイルにまとめて、1 行に 1 つのサンプル結果を作成することです。それを行うには2つの方法しか考えられないので、両方を試しました(そして、これを行うことで潜在的に重要な情報を隠していることを知っていました。これがこのSOの質問のポイントです):

試行 #1:各結果ファイルについて、各センサーのサンプルを 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:各結果ファイルについて、各時間のすべてのセンサーのサンプルを 1 つの数値に追加し、個々のセンサーに関する情報を吹き飛ばします。

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 などのように読み取り値に順番に番号を付けるだけで安全だと思います)。

4

1 に答える 1

1

SVM takes a feature vector and uses it to build a classifier. Your feature vectors can be of 6 dimensions each from a different source and time as the seventh dimension. Each point in time from which you have a signal will produce another vector. Create t vectors, Vt, of size 7 each and make those your feature vectors. Populate them with your data and pass them into ksvm. By adding t as another feature in the feature vector you are correlating both all the data that happened at a specific time with each other but also it will help SVM learn that their is a progression of values. You can the choose a subset of Vt as a training set. You will have to manually tag these vectors with a label that is the correct classification.

于 2015-04-20T14:12:25.323 に答える