クラス_1:値_2:値_3:値_4:値...(_=スペース or Tab)
+1 1:0.97 2:1.4 3:1 4:2 5:1.3 -1 1:-1.2 2:0.1 3:0.1 4:-2 5:1.1 ・ ・ ・
$ ./svm-scale data.train > data.scale
$ ./svm-scale -s data.minmax data.train > data.train.scale $ ./svm-scale -r data.minmax data.measure > data.measure.scale(学習データと評価データのスケールを同じにするため,学習データの最大値と最小値をファイルに保存することで評価データの方にも同じスケーリングを施している)
$ ./svm-train data.train.scale
$ ./svm-train -v 10 data.train.scale
$ ./svm-predict data.measure.scale data.train.scale.model > result.txt
test.pl data.csv > data.train
#! perl # 気象庁からダウンロードしたCSVファイルを編集して # 学習データにする use strict; use warnings; # クラスにしたい列番号 (0~) my $class_num = 5; # 天気の列番号(あれば) my @tenki_id = (5); ######################## my @data; my %convlist = ( '晴' => '+1', '曇' => '-1', '雨' => '-1', '雪' => '-1' ); # 天気から数値に変換する用 open(FILE, "<", shift) or die("file open error"); while(<FILE>) { next if($. <= 5); push(@data, [split(/,/)]); # コンマで分割した無名配列を追加 } close(FILE); # 天気の整形 (データ数の関係から,雲後晴 などを 雲 にし,数値に変換) foreach my $id (@tenki_id) { foreach(@data) { my @temp = keys %convlist; # 正規表現内に展開する用 $" = '|'; # その際の区切り文字はorにしたい" $$_[$id] =~ /(@temp)/; # /晴|曇|雨|雪/ $$_[$id] = $convlist{"$1"}; } } # 出力 foreach(@data) { print "$$_[$class_num]"; # はじめにクラスを出力 for my $i (1 .. @$_ - 1) { # ここでは日付は用いないので 1個目からloopスタート next if($i == $class_num); # クラスはもう出力したのでskip print " $i:$$_[$i]"; # 素性番号と値を出力 } print "\n"; }
-1 1:3.1 2:0 3:0 4:9.7 +1 1:4.8 2:0 3:0 4:6.2 -1 1:5.2 2:0 3:0 4:4.5 -1 1:7.2 2:0 3:0 4:2.5 -1 1:6.1 2:1 3:0 4:3.6 +1 1:8.3 2:0 3:0 4:2.1 -1 1:9.9 2:0 3:0 4:2.7 -1 1:10.7 2:0 3:0 4:4.5 +1 1:10.7 2:0 3:0 4:3.6 -1 1:10.1 2:0 3:0 4:2.5
svm-train -v 10 data.train
Cross Validation Accuracy = 67.4121% Positive (+1) class: precision = 0.570738 (472 / 827) recall = 0.56799 (472 / 831) F1 value = 0.569361 Negative (-1) class: precision = 0.736804 (1005 / 1364) recall = 0.738971 (1005 / 1360) F1 value = 0.737885
気温,降水量,降雪量,平均風速 23.9,0,0,2.5,晴 21.8,0,0,7.8,曇 18.8,0,0,7.4,曇 18.0,0,0.6.8,曇 18.1,9.5,0,4.6,雨 19.7,5.5,0,5.6,雨 19.6,3.0,0,4.7,雨 18.7,10.5,5.9,曇
+1 1:23.9 2:0 3:0 4:2.5 -1 1:21.8 2:0 3:0 4:7.8 -1 1:18.8 2:0 3:0 4:7.4 -1 1:18 2:0 3:0 4:6.8 -1 1:18.1 2:9.5 3:0 4:4.6 -1 1:19.7 2:5.5 3:0 4:5.6 -1 1:19.6 2:3 3:0 4:4.7 -1 1:18.7 2:10.5 3:0 4:5.9
svm-train data.train svm-predict week.m data.train.model data.result > Accuracy = 100% (8/8) (classification)
1 -1 -1 -1 -1 -1 -1 -1確かに一致している!SVMすごい!!
svm-scale data.train > data.train.scale svm-train -v 10 data.train.scale
Cross Validation Accuracy = 62.0721% Positive (+1) class: precision = -1.#IND (0 / 0) recall = 0 (0 / 831) F1 value = -1.#IND Negative (-1) class: precision = 0.620721 (1360 / 2191) recall = 1 (1360 / 1360) F1 value = 0.765981
Cross Validation Accuracy = 64.4404% Positive (+1) class: precision = 0.592736 (767 / 1294) recall = 0.922984 (767 / 831) F1 value = 0.721882 Negative (-1) class: precision = 0.826087 (304 / 368) recall = 0.365824 (304 / 831) F1 value = 0.507089
$ ./libsvm/tools/grid.py -v 10 data.train.scale
svm-train -c 32768 -g 0.5 -v 10 data.train.scale # warning ... と怒られたときは「-h 0」オプションを使うとよい
Cross Validation Accuracy = 67.4489% Positive (+1) class: precision = 0.627641 (713 / 1136) recall = 0.858002 (713 / 831) F1 value = 0.724962 Negative (-1) class: precision = 0.775665 (408 / 526) recall = 0.490975 (408 / 831) F1 value = 0.601326