Matlabユザコミュニティ

MATLAB & 金宝appSimulinkユ,ザ,コミュニティ,向け日本語ブログ

求む挑戦者!西香デ,タ分析コンペティション“ソフトウェアの異常検知”

“あなたのデタサエンスの力で企業の課題を解決する”
~西香Webサaaplトから~
こんには,井上@michio_MWJです。1222年以来 800 年ぶりの「スーパー猫の日」はいかがでしたか? datetime を使って 22:22:22 の記念をされた方もいらっしゃいましたね(笑)私は既に寝落ていました··。
さて,今回は西香さんとの共同企画”ソフトウェアの異常検知のご紹介とベンチマ,クコ,ドの解説です。今日(2/25)からはじまるこのコンペ。ソフトウェアの安定的な稼働の為に異常を早く確実に検知すべく,ログデータをもとにしたシステムの健全性状態予測に挑戦します。
~2022/3/22 追記~
コ,ド解説のYouTube生活を実施しました!

Matlabラ词典センス提供中!

どなたでも参加できますし使用ルは問いません。が!!MATLABの無料ラaapl . exeセンスも工具箱もりもりで提供しておりますので,これを機に新しい工具箱の味見がてらぜひ参加してみてください。(注:学生コンテストとの記載がありますがどなたでも利用可能です)
ラ@ @センスに申し込む際のステップは申し込みガ@ @ドにまめました。実際に利用いただけるまで申請から少し時間がかかりますのでまずは申請を済ませておくことをおススメいたします。

コンテスト概要

コンペの詳細·登録は”ソフトウェアの異常検知から行ってください。
  • 分析課題:ソフトウェアの異常検知
  • 参加締切:2022年 4 月 26 日
  • 賞金総額:25万円
Matlabをメaapl . exeンに使って参加頂いた方には順位に応じてMatlab特別賞をお贈りします。
デ,タは操作系统やWebLogic Serverより観測されるCPUやメモリの利用率など。それらを説明変数にしてソフトウェア(MATLABじゃないよ)の異常を予測するというシンプルな設定。与えられた多くの時系列デ,タをどう料理するかが問われます。

ベンチマ,ク解析

ここでは学習デ,タの一部を使ってデ,タの読み込みから予測モデルの学習までを実施してみます。スクリプト自体はペ,ジ下部のボタンからdlできますし,使用するデ,タと一緒にMATLAB驱动器でも公開しています。MathWorksアカウントと関連ライセンスがあればMATLAB在线で実行してみることもできます。
今回,学習用データセットとして与えられているtrain.csvは1.8 GBと多少大きいので,このコードでは一部を取り出したtrainIphost17.csvを使用します。変数hostが" lphost17 "のデ,タだけを抽出しています。読み込むデ,タをtrain.csvに置き換えてもそのまま機能するはずです。

使用する工具箱

デ,タの読み込み

まずはデ,タの読み込みです。readtableでいきなり読み込んでもよいデ,タ量ではありますが,せっかくなので数据存储を使って中身をチラ見しておきます。
datadir =“实际上”%ファescルの保存場所
Filepath = fullfile(datadir,“trainlphost17.csv”);
Ds =数据存储
ds =

TabularTextDatastoreのプロパティ:

文件:{
“……\ datafiles \ trainlphost17.csv”

文件夹:{
“……\ datafiles”

FileEncoding:“utf - 8”
AlternateFileSystemRoots: {}
VariableNamingRule:“修改”
ReadVariableNames:真
VariableNames: {' timestamp ', ' host ', ' Anomaly '…以及其他167个}
DatetimeLocale: en_US

テキスト形式のプロパティ:
NumHeaderLines: 0
分隔符:','
RowDelimiter:‘\ r \ n’
TreatAsMissing:“
MissingValue:南

テキスト形式の詳細プロパティ:
TextscanFormats: {% {uuuu-MM-dd HH: mm: ss} D ', ' % q ', ' % f ', 167}
TextType:“字符”
ExponentCharacters:“eEdD”
CommentStyle:“
空格:' \b\t '
MultipleDelimitersAsOne:假

预览、阅读、阅读により返されるテ、ブルをコントロ、ルするプロパティ:
SelectedVariableNames: {' timestamp ', ' host ', ' Anomaly '…和167更多}
SelectedFormats: {% {uuuu-MM-dd HH: mm: ss} D ', ' % q ', ' % f ', 167}
ReadSize: 20000行
OutputType:“表”
RowTimes: []

書き込み固有のプロパティ:
金宝appSupportedOutputFormats: [" txt " " csv " " xlsx " " xls " " parquet " " parq "]
DefaultOutputFormat:“三”

170変数が認識されていますね。問題なく読み込めそうです。预览で冒頭の8行だけ確認してみます。
预览(ds)
ans =8×170表
时间戳 宿主 异常 过程 ActiveConnections__MXBean_com_bea_Name_source01_Type_JDBCConnec ActiveConnections__MXBean_com_bea_Name_source01_Type_JDBCDataSo ActiveConnections__MXBean_com_bea_Name_source02_Type_JDBCConnec ActiveConnections__MXBean_com_bea_Name_source02_Type_JDBCDataSo ActiveConnections__MXBean_com_bea_Name_source03_Type_JDBCConnec ActiveConnections__MXBean_com_bea_Name_source03_Type_JDBCDataSo ActiveConnections__MXBean_com_bea_Name_source04_Type_JDBCConnec ActiveConnections__MXBean_com_bea_Name_source04_Type_JDBCDataSo ActiveConnections__MXBean_com_bea_Name_source05_Type_JDBCConnec ActiveConnections__MXBean_com_bea_Name_source05_Type_JDBCDataSo ActiveConnections__MXBean_com_bea_Name_source06_Type_JDBCConnec ActiveConnections__MXBean_com_bea_Name_source06_Type_JDBCDataSo ActiveConnections__MXBean_com_bea_Name_source08_Type_JDBCConnec ActiveConnections__MXBean_com_bea_Name_source08_Type_JDBCDataSo ActiveConnections__MXBean_com_bea_Name_source09_Type_JDBCConnec ActiveConnections__MXBean_com_bea_Name_source09_Type_JDBCDataSo ActiveConnections__MXBean_com_bea_Name_source10_Type_JDBCConnec ActiveConnections__MXBean_com_bea_Name_source10_Type_JDBCDataSo ActiveTransactions__MXBean_com_bea_Name_JTARuntime_Type_JTARunt AvailableDbConnectionActivity__d_dx_MXBean_com_bea_Name_source0 AvailableDbConnectionActivity__d_dx_MXBean_com_bea_Name_sour_1 AvailableDbConnectionActivity__d_dx_MXBean_com_bea_Name_sour_2 AvailableDbConnectionActivity__d_dx_MXBean_com_bea_Name_sour_3 AvailableDbConnectionActivity__d_dx_MXBean_com_bea_Name_sour_4 AvailableDbConnectionActivity__d_dx_MXBean_com_bea_Name_sour_5 AvailableDbConnectionActivity__d_dx_MXBean_com_bea_Name_sour_6
1 2015-02-06 04:44:00 “lphost17” 0 “wls1” 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 2015-02-06 04:45:00 “lphost17” 0 “wls1” 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3. 2015-02-06 04:46:00 “lphost17” 0 “wls1” 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 2015-02-06 04:47:00 “lphost17” 0 “wls1” 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5 2015-02-06 04:48:00 “lphost17” 0 “wls1” 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
6 2015-02-06 04:49:00 “lphost17” 0 “wls1” 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7 2015-02-06 04:50:00 “lphost17” 0 “wls1” 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
8 2015-02-06 04:51:00 “lphost17” 0 “wls1” 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
时间戳、主机异常,流程など170個の変数が確認できますね。readallを使って一気に読み込んでみます。
Matfilepath = fullfile(datadir,“trainData_lphost17.mat”);
如果存在(matfilepath“文件”
负载(matfilepath“trainData”);
其他的
trainData = readall(ds);
% matファescルからの読み込みの方が速いので保存しておく
保存(matfilepath,“trainData”);
结束
主机と进程がデタ元のラベルの様なのでこれらの種類を確認します。
独特的(trainData.process)
ans = 2×1细胞
“wls1”
“wls2”
独特的(trainData.host)
ans =1×1のcell配列
{' lphost17 '}
このデータでは主机はlphost17のみ,そして过程はwls1とwls2です。正常か異常のラベルが异常という変数で,今回の目的変数ですね。ラベルの数を汇总関数で見ておきます。
汇总(trainData.Anomaly)
价值计数百分比
0 198122 99.66%
1 676 0.34%
異常デタ(异常= 1)。データ元は主机/过程で特定できますが,2変数だと不便なのでデータ元を表す変数起源を作っておきます。それぞれカテゴリ変数に変換しておきます。
trainData。origin = categorical(string(trainData.host) + string(trainData.process));
trainData。宿主= categorical(trainData.host);
trainData。过程= categorical(trainData.process);

時系列の確認

ここでは主机/进程毎にデタ,特に時刻デタをチェックします。パッと見たところ時刻データはきれいに並んでいるようですが,时间戳の最大,最小,時間間隔を念のため確認します。
%グルプ要約の計算
Gstats = groupsummary(trainData,[“主机”“过程”), {“马克斯”“最小值”...
@ (x){独特(diff (x))}},“时间戳”
Gstats =2×6表
宿主 过程 GroupCount max_timestamp min_timestamp fun1_timestamp
1 lphost17 wls1 99396 2015-04-16 10:46:00 2015-02-06 04:44:00 10×1时间
2 lphost17 wls2 99402 2015-04-16 10:46:00 2015-02-06 04:44:00 9×1时间
デ,タ数はwls1/wls2ともに大体同じ。計測開始·終了時刻も同じとなっています。時間ステップ幅を確認するために関数ハンドルを使って@ (x){独特(diff (x))}という処理を加えています。Process = wls1のデ,タを見ると
Gstats.fun1_timestamp {1}
ans = 10×1时间
00:01:00
00:02:00
00:03:00
00:06:00
00:07:00
00:11:00
00:12:00
00:21:00
01:01:00
03:33:00
と1分から3時間までばらきますね。このサンプルコドではこの点にいて特に処置は行わずこのまま進めます。デタの前処理にいてはデ,タの前処理:デ,タクリ,ニング,平滑化,グル,プ化で紹介している内容が役立かもしれません。

異常の発生状況プロット

学習デ,タ内の異常発生状況を確認します。
uniqueOri = unique(trainData.origin);
图(1)
tiledlayout (“流”);
2 = 1:长度(uniqueOri)
idx = trainData。origin == uniqueOri(ii);
tmp = trainData(idx,:);
nexttile
yyaxis
情节(tmp.timestamp tmp.Anomaly,线宽= 2)
ylabel (“异常”
持有
Difftimestep = [0;diff (tmp.timestamp)];
yyaxis正确的
情节(tmp。时间戳,分钟(difftimestep),线宽= 2)
ylabel (“间隔(分钟)”
持有
标题(uniqueOri (ii))
结束
Wls1では5回,wls2では2回異常が発生しています。時間ステップの揺らぎ合わせてプロットしていますが,異常発生と同時に起こっている場合もあれば関係なく発生している箇所もあります。

説明変数の絞り込み

説明変数が約170個と多いので,サクッと計算させるために使用する変数を絞り込みます。絞り込む方法は多数考えられますがこらのヘルプペジ(特徴選択の紹介)も参考になるかもしれません。ここでは异常と相関が高いもの,そして相互に相関が高いものは片方だけを残すことにします。时间戳,主机,进程以外の数値デ,タを対象とします。
S = vartype(“数字”);
features = trainData(:,S);%数値デタだけ取り出す
corrcoef関数で相互相関を計算して,异常との相関係数の絶対値(1行目)を昇順に並べます。
R = corrcoef(features.Variables);
[Rsort,idx] = sort(abs(R(1,:)),“下”“MissingPlacement”“最后一次”);
数字
酒吧(函数(2)):
标题(“异常との相関係数絶対値”
次に异常との相関係数(絶対値)が上位30の変数に絞って,相互相関を見てみます。
Features30 = features(:,idx(1:30));
数字
R = corrcoef(features30.Variables);
热图(abs (R))
标题(“相互相関(絶対値)”
説明変数間でも相関係数が高いものがあります。特に高い(0.9以上)ものは同じ情報を持っているとみなして片方だけ使用することで更に変数を絞り込みます。
absR = abs(R);
tmp = triu(absR>0.9,1);行列の上三角部分
[row,col] = ind2sub(size(absR),find(tmp));% 0.9以上の位置
idxDiag = row == col;
row = row(~idxDiag);
col = col(~idxDiag);% 0.9未満のものだけ残す
数字
Features2use = featres30;
Features2use (:,col) = [];
R = corrcoef(features2use.Variables);
数字
热图(abs (R))
异常情况含めて23個残りました。変数の名前(异常との相関(絶対値)が高い順)を確認しておきます。
varnames = features2use.Properties.VariableNames '
varnames = 23日×1细胞
“异常”
“GCTime__incld_dx_MXBean_java_lang_name_PSMarkSweep_type_Garbage”
“GCActivity__incld_dx_MXBean_java_lang_name_PSMarkSweep_type_Gar”
“ActiveConnections__MXBean_com_bea_Name_source09_Type_JDBCConnec”
“NoData后”
“ProcessCPU__MXBean_java_lang_type_OperatingSystem__ProcessCpuLo”
“LastGCDuration__MXBean_java_lang_name_PSMarkSweep_type_GarbageC”
“SystemCPU__MXBean_java_lang_type_OperatingSystem__SystemCpuLoad”
“LastGCDuration__MXBean_java_lang_name_PSScavenge_type_GarbageCo”
“ProcessCPU___Process_java__CPU_”

予測モデルの学習

次はこの変数で予測モデルを作ってみます。

学習に使用するデ,タ区間の切り出し

上で見た通り正常(异常= 0)のデータが多いため,正常データのアンダーサンプリングの為以下の操作を行います。
  • 異常発生箇所を確認し異常区間の長さ(デ,タ点数)を確認
  • 異常中(异常= 1)の前後に異常区間の長さ分のデ,タを加えた区間を抽出
dataSeg = [];%デタ確保用変数
dataOri = [];%デタ元
dataAll = [];%デ,タ確保用変数(単純に繋げたもの)
uniqueOri = unique(trainData.origin)
uniqueOri = 2×1分类
lphost17wls1
lphost17wls2
%注意:スタ,トとエンドは正常であることが前提(lphost7のデ,タはOK)
2 = 1:长度(uniqueOri)
idx = trainData。origin == uniqueOri(ii);
tmp = trainData(idx,varnames);
以下を探します。
% 0から1に変化する箇所:异常启动
% 1から0に変化する箇所:异常结束
isAnomaly1 = tmp.Anomaly;
isAnomaly2 = [0;isAnomaly1 (1: end-1)];
isChange = xor(isAnomaly1, isAnomaly2);% 変化点検知
posFalls = find(isChange & isAnomaly2);% 1 -> 0 (end)
posRises = find(isChange & ~isAnomaly2);% 0 -> 1(开始)
jj = 1:长度(posRises)
duration = 1*(posFalls(jj) - posRises(jj));
如果posRises(jj) - duration > 0
idxStart = posRises(jj) - duration;
其他的
idxStart = 1;
结束
如果posFalls(jj) + duration < height(tmp)
idxEnd = posFalls(jj) + duration;
其他的
idxEnd = height(tmp);
结束
dataSeg = [dataSeg;{tmp (idxStart: idxEnd:)}];
dataAll = [dataAll;tmp (idxStart: idxEnd:)];
dataOri = [dataOri;uniqueOri (ii)];
结束
结束
汇总(dataAll.Anomaly)
价值计数百分比
0 1318 64.70%
1 719 35.30%
正常(0)と異常(1)のデタ比が2:1程度です。

切り出し部分のプロット

まず単純に繋げてプロット。
数字
区(dataAll.Anomaly)
标题(“异常”
包含(“数据”
異常箇所毎に分けてプロット。
数字
tiledlayout (“流”);
2 = 1:长度(dataSeg)
nexttile
tmp = dataSeg{ii};
区(tmp。异常,“线宽”,2)
标题(dataOri (ii));
结束
持有

予測モデル学習LSTM

まずは時系列データとしてではなく,単純に各観測値を独立したものとみて予測モデルを作ってみるのも手です。このスクリプトでは省略しますがこらのペジ(モデルの作成と評価:特徴選択,特徴量エンジニアリング,モデル選択,ハ)が参考になるかと思います。
ここではLSTMを使って予測モデルを作ってみます。時系列デ,タの分類問題として深層学習を使用した序列对序列分類を参考します。時系列,シ,ケンス,およびテキストを使用した深層学習のペ,ジも時系列デ,タの取り扱いに関する情報元として参考になるかもしれません。

デ,タの分割

上で作った各異常区間のデ,タ(dataSeg)を使用しますが,まずは学習用とテスト用に分割します。ここではデータ元(lphost17wls1或lphost17wls2)で層化させて,学習データと検証データを分割します。
rng (0)%同じ結果が再現するように乱数シトを固定
cv = cvpartition(dataOri,“坚持”, 0.4);
学習デ,タ(6セット)
trainSeg = dataSeg(cv.training)
trainSeg =6×1细胞
1
1 391×23表
2 70×23表
3. 115×23表
4 436×23表
5 79×23表
6 388×23表
検証デタ(3セット)
testSeg = dataSeg(cv.test)
testSeg =3×1细胞
1
1 82×23表
2 457×23表
3. 19×23个表
LSTMの学習データとして使用するために,各時系列セグメントとラベルデータをセル配列として成形します。generateDataset4LSTM関数はスクリプト下部にロ,カル関数として定義しています。
[xTrain,yTrain] = generateDataset4LSTM(trainSeg);%学習デタ
[xTest,yTest] = generateDataset4LSTM(testSeg);%テストデタ
こんな形です。セルの中身は22個の特徴量が22 × Nの形で並んでいることに注意。
xTrain
xTrain =6×1细胞
1
1 22×391双
2 22×70双
3. 22×115双
4 22×436双
5 22×79双
6 22×388双

ネットワ,ク構築

試しに隠れユニット数100のLSTM層を2層としてみます。この辺は最適化する余地はたくさんありそうです。実験マネ,ジャ,アプリが役に立かもしれません。
numFeatures = 22;特徴量変数の数
numHiddenUnits = 100;隠れユニット数
numClasses = 2;%予測クラス数(異常·正常)
层= [...
sequenceInputLayer (numFeatures)
lstmLayer (numHiddenUnits“OutputMode”“序列”
lstmLayer (numHiddenUnits“OutputMode”“序列”
fullyConnectedLayer (numClasses)
softmaxLayer
classificationLayer (“类”,{' 0 '' 1 '},“ClassWeights”[1,2]))
层=

次の層をも6×1の层配列:

1”シケンス入力22次元のシケンス入力
2”LSTM 100隠れユニットのあるLSTM
3”LSTM 100隠れユニットのあるLSTM
4”全結合2全結合層
5”ソフトマックスソフトマックス
6”分類出力クラス' 0 'および' 1 'によるクラス加重crossentropyex

分類層の設定で重み付きクロスエントロピ,損失関数を使用しています。詳細はこらのclassificationLayerのヘルプペ,ジ(英語)を確認してください。

学習オプション設定

选项= trainingOptions(“亚当”...
“MaxEpochs”10...
“MiniBatchSize”, 1...
“ValidationData”{xTest,欧美},...
“阴谋”“训练进步”);

学習

rng (0)%同じ結果が再現するように乱数シトを固定
net = trainNetwork(xTrain,yTrain,图层,选项);
単一のCPUで学習中。
|===================================================================================|
|エポック|反復|経過時間|ミニバッチの精度|検証精度|ミニバッチ損失|検証損失|基本学習率|
|        |      |  ( hh: mm: ss )  |            |        |           |        |         |
|===================================================================================|
|      1 |    1 |     00:00:03 |     24.05% | 45.68% |    1.0928 | 0.9173 |  0.0010 |
|      9 |   50 |     00:00:14 |     93.04% | 72.80% |    0.1581 | 0.8408 |  0.0010 |
|     10 |   60 |     00:00:17 |     98.62% | 72.91% |    0.0531 | 0.8381 |  0.0010 |
|===================================================================================|
学習終了:最大数のエポックが完了しました。
保存しておきます。
保存(“lstmnet_lphost17_LSTM.mat”“净”“varnames”);

検証デ,タへの予測精度を再確認

[yPred, scores] = category (net,xTest);
数字
混同行列を描きます(異常区間ごとにセル配列になっているのですべて結合しています)
confusionchart([欧美{:}]、[yPred {}):,...
“ColumnSummary”“column-normalized”...
“RowSummary”“row-normalized”);
まあまぁです。

評価指標PRC(预测-回忆-曲线)

今回の評価指標であるPRC(预测-回忆-曲线)を描いてみます。
trueLabel = [yTest{:}];
labelScores = [scores{:}];
abnormyscores = labelScores(2,:);% labels(2) = 1(異常)の分数
N = 100;閾値の段階数
召回=零(N,1);
精度=零(N,1);
阈值= linspace(0,1,N);
标签= net.Layers(end).Classes;
%閾値を変えて召回率/精度を計算
2 = 1: N
Th =阈值(ii);
[recall (ii), precsions (ii)] = getRecallPrecisionCurve(th,anomalyScores,trueLabel,labels);
结束
数字
情节(回忆说,精度)

提出用の予測作成

Datadirフォルダ内にtest.csvがある想定です。
负载(“lstmnet_lphost17_LSTM.mat”“净”“varnames”);モデル読み込み

テストデ,タ読み込み

Test.csvファソフトウェアの異常検知)から参加登録後に入手してdatadirに保存していることが前提です。
Matfilepath = fullfile(datadir,“test.mat”);
如果存在(matfilepath“文件”
负载(matfilepath“testData”);
其他的
Filepath = fullfile(datadir,“test.csv”);
testData = readtable(文件路径);
% matファescルからの読み込みの方が速いので保存しておく
保存(matfilepath,“testData”);
结束
学習に使用した変数varnamesとid/主机/进程のみを取り出します。
testData = testData(:,[{“id”“主机”“过程”}; varnames(2:结束)]);% varname(1)は异常
头(testData)
ans =表8×25
id 宿主 过程 GCTime__incld_dx_MXBean_java_lang_name_PSMarkSweep_type_Garbage GCActivity__incld_dx_MXBean_java_lang_name_PSMarkSweep_type_Gar ActiveConnections__MXBean_com_bea_Name_source09_Type_JDBCConnec NoData后 ProcessCPU__MXBean_java_lang_type_OperatingSystem__ProcessCpuLo LastGCDuration__MXBean_java_lang_name_PSMarkSweep_type_GarbageC SystemCPU__MXBean_java_lang_type_OperatingSystem__SystemCpuLoad LastGCDuration__MXBean_java_lang_name_PSScavenge_type_GarbageCo ProcessCPU___Process_java__CPU_ Rel_HeapUsage___MXBean_java_lang_type_Memory__HeapMemoryUsage_u Rel_OpenFileDescriptors___MXBean_java_lang_type_OperatingSystem StuckThreads__MXBean_com_bea_ApplicationRuntime_sys01_Name_defa Rel_SwapUsage____Swap_used__Swap_total__ MemorySpaceUsage___MXBean_java_lang_name_PSEdenSpace_type_Mem_1 MemorySpaceUsage___MXBean_java_lang_name_PSEdenSpace_type_Memor Rel_HeapCommitted___MXBean_java_lang_type_Memory__HeapMemoryUsa Rel_UnavailableConnections___MXBean_com_bea_Name_source09_Type_ GCTime__incld_dx_MXBean_java_lang_name_PSScavenge_type_GarbageC MemorySpaceUsage___MXBean_java_lang_name_PSOldGen_type_MemoryPo DaemonThreadCount__MXBean_java_lang_type_Threading__DaemonThrea ConnectionDelay__MXBean_com_bea_Name_source08_Type_JDBCConnecti DBConnectionStarted__incld_dx_MXBean_com_bea_Name_source09_Type
1 0 lphost06 wls1 0 0 2 0 0.0020 2008 0.0050 28 0 0.2048 0.1484 0 0.4239 0.0367 0.0488 0.3722 1 0 0.4692 66 0 0
2 1 lphost06 wls1 0 0 2 0 0.0020 2008 0.0270 25 0 0.1929 0.1484 0 0.4238 0.0046 0.0484 0.3702 1 25 0.4692 66 0 0
3. 2 lphost06 wls1 0 0 2 0 0.0010 2008 0.0060 25 0 0.1985 0.1484 0 0.4238 0.0195 0.0484 0.3702 1 0 0.4692 66 0 0
4 3. lphost06 wls1 0 0 2 0 0.0010 2008 0.0160 25 0 0.2040 0.1484 0 0.4236 0.0344 0.0484 0.3702 1 0 0.4692 66 0 0
5 4 lphost06 wls1 0 0 2 0 0.0020 2008 0.0060 25 0 0.1929 0.1484 0 0.4235 0.0045 0.0485 0.3718 1 26 0.4692 66 0 0
6 5 lphost06 wls1 0 0 2 0 0.0020 2008 0.0060 25 0 0.1991 0.1484 0 0.4232 0.0213 0.0485 0.3718 1 0 0.4692 66 0 0
7 6 lphost06 wls1 0 0 2 0 0.0010 2008 0.0040 25 0 0.2047 0.1484 0 0.4233 0.0363 0.0485 0.3718 1 0 0.4692 66 0 0
8 7 lphost06 wls1 0 0 2 0 0.0020 2008 0.0080 33 0 0.1924 0.1484 0 0.4231 0.0031 0.0481 0.3701 1 33 0.4692 66 0 0
ここは思い切って、主机/过程もまとまったうえで,時系列順にidが並んでいるという想定で進めます・・。主机/进程別に識別できるようデタ元(origin)変数を作っておきます。
testData。origin = categorical(string(testData.host) + string(testData.process));

予測

主机/进程毎に切り分けて予測処理を実行します。
teststori = unique(testData.origin);
testData。异常= zeros(height(testData),1);
2 = 1:长度(testOri)
idx = testData。origin == testOri(ii);
tmpData = testData{idx,varnames(2:结束)};
tmpData = zscore(tmpData);%変数を正規化(方法は検討の余地あり)
[~,tmpScores] = category (net,tmpData ');
testdata . exception (idx,:) = tmpScores(2,:) ';%标签(2)の分数
结束

提出ファ@ @ル作成

submission.csvに出力する値は异常= 1であるスコアなので,上の分数の2列目です。
输出= testData(:,[“id”“异常”]);
头(输出)
ans =8×2表
id 异常
1 0 0.4541
2 1 0.3938
3. 2 0.3247
4 3. 0.2618
5 4 0.2107
6 5 0.1712
7 6 0.1418
8 7 0.1215
writetable(输出,“submission.csv”);

まとめ

無事に最後の提出用ファ@ @ル作成までたどり着きました。今回はサクサク進めるように一部のデータだけを使ってみましたが,ぜひ本番のtrain.csvでも試してみてください。
もう少しデータを詳しく調査してもっとよい変数を探してみたり,新たな特徴量を作ってみたり,モデルに凝ってみたり,といろいろ試したいことが出てきますが,ここから先はコンペに参加する方のお楽しみということで私からの紹介はここまでとします。
いずれにしても一部の変数(或一部のデータ)から始めてみて,まずデータの把握と課題の理解が第一歩かと思います。応募締め切りは4月26日。入賞目指して頑張ってください!
コンペへの参加登録はこらから:ソフトウェアの異常検知

Matlabラescセンス

冒頭でも触れましたがmatlabを使って参加される方にはラescセンスも提供しています。上でも触れた機械学習を行う统计和机器学习工具箱™,そしてディ,プラ,ニングをカバ,する深度学习工具箱™を含む18個の製品が利用可能です。是非ご活用ください。

関連リンク集

ヘルパ,関数

閾値を変えて召回と精度を計算する関数
函数[recall,precision] = getRecallPrecisionCurve(threshold,anomalyScores,trueLabel,labels)
预测= repelem(labels(1), length(trueLabel),1);
预测(abnormyscores > threshold,:) = labels(2);
results = confusimat (trueLabel,预测);
TN = results(1,1);
TP = results(2,2);
FN = results(2,1);
FP = results(1,2);
精度= TP/(TP+FP);
召回率= TP/(TP+FN);
结束
LSTMを学習する為にデ,タを成形する関数
函数[x,y] = generateDataset4LSTM(dataSeg)
X = [];
Y = [];
2 = 1:长度(dataSeg)
tmpT = dataSeg{ii};
%异常以外の変数を正規化(方法は検討の余地あり)
tmpT{:,2:end} = zscore(tmpT{:,2:end});
tmpX = tmpT{:,2:结束}';
tmpY = tmpt . exception (:,:) ';
X = [X;{tmpX}];
Y = [Y;{分类(tmpY)});
结束
结束

|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。