#学習
$ svm-train -t 0 a9a.txt a9a.model
#予測
$ svm-predict a9a.t a9a.model out
Accuracy = 84.9764% (13835/16281) (classification)」
自分で書いたPA-IIのコードでの分類精度
- アグレッシブパラメータCを変えて、学習データは全体を10回学習した場合
$ perl PA-II.pl a9a.txt 1.0 < a9a.t
Result : 0.762483876911738 (12414/16281)
$ perl PA-II.pl a9a.txt 0.1 < a9a.t
Result : 0.796449849517843 (12967/16281)
$ perl PA-II.pl a9a.txt 0.01 < a9a.t
Result : 0.83483815490449 (13592/16281)
$ perl PA-II.pl a9a.txt 0.001 < a9a.t
Result : 0.84835083840059 (13812/16281)
$ perl PA-II.pl a9a.txt 0.0001 < a9a.t
Result : 0.850930532522572 (13854/16281)
$ perl PA-II.pl a9a.txt 0.00001 < a9a.t
Result : 0.840181807014311 (13679/16281)
$ perl PA-II.pl a9a.txt 0.000001 < a9a.t
Result : 0.764879307167864 (12453/16281)
- C=0.0001の時、何も調整していないLIBSVMの結果をギリギリ上回った
#! /usr/bin/perl
use strict;
use warnings;
my $train_file = shift;
my $C = shift;
my $loop = 10;
my $w = {};
my @x_list;
my @t_list;
open IN, $train_file;
while(<IN>){
chomp;
my @list = split(/\s+/, $_);
push(@t_list, $list[0]);
my $hash;
for(my $i=1; $i<@list; $i++){
my ($a, $b) = split(/:/,$list[$i]);
$hash->{$a} = $b;
$w->{$a} = 0;
}
push(@x_list, $hash);
}
while($loop--){
for(my $i = 0; $i < @x_list; $i++){
train($w, $x_list[$i], $t_list[$i]);
}
}
my $num = 0;
my $success = 0;
while(<>){
chomp;
my @list = split(/\s+/, $_);
my $hash;
for(my $i=1; $i<@list; $i++){
my ($a, $b) = split(/:/,$list[$i]);
$hash->{$a} = $b;
}
my $t = predict($w, $hash);
$num++;
if($t * $list[0] >= 0){
$success++;
}
}
print "Result : ",($success/$num)," (",$success,"/",$num,")\n";
sub predict {
my ($w, $x) = @_;
my $y = 0;
foreach my $f (keys %$x){
if($w->{$f}){
$y += ($w->{$f} * $x->{$f});
}
}
return $y;
}
sub loss {
my ($w, $x, $t) = @_;
my $y = 0;
foreach my $f (keys %$x){
if($w->{$f}){
$y += ($w->{$f} * $x->{$f});
}
}
return 0.0 if(1.0 - $t*$y <= 0);
return 1.0 - $t*$y;
}
sub train {
my ($w, $x, $t) = @_;
my $l = loss($w, $x, $t);
my $sq_x = 0.0;
foreach my $f (keys %$x){
$sq_x += ($x->{$f} * $x->{$f});
}
my $tau = $l / ($sq_x + 1.0 / (2 * $C));
foreach my $f(keys %$x){
$w->{$f} += $tau * ($t * $x->{$f});
}
}