Algorithm-Classifier-IsolationForest
view release on metacpan or search on metacpan
lib/Algorithm/Classifier/IsolationForest/App/Command/stream.pm view on Meta::CPAN
} ## end if ( !$oif )
# Munge the raw rows into numbers, then run the numeric validation
# that was skipped at read time. Munged into a separate structure so
# -d still prints the raw input columns as given.
my $stream_rows = \@data;
if ($has_mungers) {
my $munged = $oif->munge_rows( \@data );
for my $i ( 0 .. $#$munged ) {
for my $col ( 0 .. $#{ $munged->[$i] } ) {
die( 'Line '
. ( $i + 1 ) . ' of "'
. $opt->{'i'}
. '" value for column '
. ( $col + 1 ) . ',"'
. ( defined $munged->[$i][$col] ? $munged->[$i][$col] : 'undef' )
. '", is not a number after munging' )
unless looks_like_number( $munged->[$i][$col] );
} ## end for my $col ( 0 .. $#{ $munged->[$i] } )
} ## end for my $i ( 0 .. $#$munged )
$stream_rows = $munged;
} ## end if ($has_mungers)
# --- stream ------------------------------------------------------------
my $results_string = '';
if ( $opt->{'learn_only'} ) {
$oif->learn($stream_rows);
} else {
my $scores;
if ( $opt->{'score_only'} ) {
$scores = $oif->score_samples($stream_rows);
} else {
$scores = $oif->score_learn($stream_rows);
}
my $threshold
= defined $opt->{'threshold'} ? $opt->{'threshold'}
: defined $oif->decision_threshold ? $oif->decision_threshold
: 0.5;
for my $i ( 0 .. $#$scores ) {
my $label = $scores->[$i] >= $threshold ? 1 : 0;
if ( $opt->{'d'} ) {
$results_string .= join( ',', @{ $data[$i] } ) . ',' . $scores->[$i] . ',' . $label . "\n";
} else {
$results_string .= $scores->[$i] . ',' . $label . "\n";
}
}
} ## end else [ if ( $opt->{'learn_only'} ) ]
# Refresh the contamination threshold against the post-stream window so
# the saved model's default cutoff tracks the stream.
if ( !$opt->{'score_only'} && defined $oif->{contamination} && $oif->window_count ) {
$oif->relearn_threshold;
}
if ( $opt->{'save'} && !$opt->{'score_only'} ) {
$oif->save( $opt->{'m'} );
}
if ( length $results_string ) {
if ( !defined( $opt->{'o'} ) ) {
print $results_string;
} else {
write_file( $opt->{'o'}, { 'atomic' => 1 }, $results_string );
}
}
return 1;
} ## end sub execute
return 1;
( run in 0.966 second using v1.01-cache-2.11-cpan-995e09ba956 )