8

こんにちは、私は 1999 年の darpa データ セットからネットワーク データをクラスター化しようとしています。残念ながら、同じ手法と方法を使用して、一部の文献と比較するのではなく、実際にはクラスター化されたデータを取得していません。

私のデータは次のようになります。

マトラブ図 1

ご覧のとおり、あまりクラスター化されていません。これは、データセットに多くの外れ値 (ノイズ) があるためです。いくつかの外れ値除去手法を見てきましたが、これまで試したことはありませんが、実際にデータをきれいにします。私が試した方法の1つ:

%% When an outlier is considered to be more than three standard deviations away from the mean, determine the number of outliers in each column of the count matrix:

    mu = mean(data)
    sigma = std(data)
    [n,p] = size(data);
    % Create a matrix of mean values by replicating the mu vector for n rows
    MeanMat = repmat(mu,n,1);
    % Create a matrix of standard deviation values by replicating the sigma vector for n rows
    SigmaMat = repmat(sigma,n,1);
    % Create a matrix of zeros and ones, where ones indicate the location of outliers
    outliers = abs(data - MeanMat) > 3*SigmaMat;
    % Calculate the number of outliers in each column
    nout = sum(outliers) 
    % To remove an entire row of data containing the outlier
    data(any(outliers,2),:) = [];

最初の実行では、完全なデータセットから選択された 1000 の正規化されたランダム行から 48 行が削除されました。

これは、データで使用した完全なスクリプトです。

    %% load data
        %# read the list of features
        fid = fopen('kddcup.names','rt');
        C = textscan(fid, '%s %s', 'Delimiter',':', 'HeaderLines',1);
        fclose(fid);

        %# determine type of features
        C{2} = regexprep(C{2}, '.$','');              %# remove "." at the end
        attribNom = [ismember(C{2},'symbolic');true]; %# nominal features

        %# build format string used to read/parse the actual data
        frmt = cell(1,numel(C{1}));
        frmt( ismember(C{2},'continuous') ) = {'%f'}; %# numeric features: read as number
        frmt( ismember(C{2},'symbolic') ) = {'%s'};   %# nominal features: read as string
        frmt = [frmt{:}];
        frmt = [frmt '%s'];                           %# add the class attribute

        %# read dataset
        fid = fopen('kddcup.data_10_percent_corrected','rt');
        C = textscan(fid, frmt, 'Delimiter',',');
        fclose(fid);

        %# convert nominal attributes to numeric
        ind = find(attribNom);
        G = cell(numel(ind),1);
        for i=1:numel(ind)
            [C{ind(i)},G{i}] = grp2idx( C{ind(i)} );
        end

        %# all numeric dataset
        fulldata = cell2mat(C);

%% dimensionality reduction 
columns = 6
[U,S,V]=svds(fulldata,columns);

%% randomly select dataset
rows = 1000;
columns = 6;

%# pick random rows
indX = randperm( size(fulldata,1) );
indX = indX(1:rows)';

%# pick random columns
indY = indY(1:columns);

%# filter data
data = U(indX,indY);

% apply normalization method to every cell
maxData = max(max(data));
minData = min(min(data));
data = ((data-minData)./(maxData));

% output matching data
dataSample = fulldata(indX, :)

%% When an outlier is considered to be more than three standard deviations away from the mean, use the following syntax to determine the number of outliers in each column of the count matrix:

mu = mean(data)
sigma = std(data)
[n,p] = size(data);
% Create a matrix of mean values by replicating the mu vector for n rows
MeanMat = repmat(mu,n,1);
% Create a matrix of standard deviation values by replicating the sigma vector for n rows
SigmaMat = repmat(sigma,n,1);
% Create a matrix of zeros and ones, where ones indicate the location of outliers
outliers = abs(data - MeanMat) > 2.5*SigmaMat;
% Calculate the number of outliers in each column
nout = sum(outliers) 
% To remove an entire row of data containing the outlier
data(any(outliers,2),:) = [];

%% generate sample data
K = 6;
numObservarations = size(data, 1);
dimensions = 3;

%% cluster
opts = statset('MaxIter', 100, 'Display', 'iter');
[clustIDX, clusters, interClustSum, Dist] = kmeans(data, K, 'options',opts, ...
'distance','sqEuclidean', 'EmptyAction','singleton', 'replicates',3);

%% plot data+clusters
figure, hold on
scatter3(data(:,1),data(:,2),data(:,3), 5, clustIDX, 'filled')
scatter3(clusters(:,1),clusters(:,2),clusters(:,3), 100, (1:K)', 'filled')
hold off, xlabel('x'), ylabel('y'), zlabel('z')
grid on
view([90 0]);

%% plot clusters quality
figure
[silh,h] = silhouette(data, clustIDX);
avrgScore = mean(silh);

これは、出力からの 2 つの異なるクラスターです。

ここに画像の説明を入力

ご覧のとおり、データは元のデータよりもクリーンでクラスター化されているように見えます。しかし、私はまだより良い方法を使用できると思います。

たとえば、全体的なクラスタリングを観察すると、データセットからまだ多くのノイズ (外れ値) があります。ここに見られるように:

ここに画像の説明を入力

後で分類するために、外れ値の行を別のデータセットに入れる必要があります (クラスタリングからのみ削除されます)。

darpa データセットへのリンクは次のとおりです。10% のデータ セットでは列が大幅に削減されていることに注意してください。0 または 1 が連続している列の大部分は削除されています (42 列から 6 列)。

http://kdd.ics.uci.edu/databases/kddcup99/kddcup99.html

編集

データセットに保持される列は次のとおりです。

src_bytes: continuous.

dst_bytes: continuous.

count: continuous.

srv_count: continuous.  

dst_host_count: continuous.

dst_host_srv_count: continuous.         

再編集:

Anony-Mousse との議論と彼の回答に基づいて、K-Medoids http://en.wikipedia.org/wiki/K-medoidsを使用してクラスタリングのノイズを減らす方法があるかもしれません。現在持っているコードに大きな変更がないことを願っていますが、これを実装してノイズが大幅に削減されるかどうかをテストする方法はまだわかりません。したがって、誰かが私に実際の例を示すことができれば、これは答えとして受け入れられます。

4

2 に答える 2

10

このデータセットの使用は推奨されないことに注意してください:

そのデータセットにはエラーがあります: KDD カップ '99 データセット (ネットワーク侵入) は有害であると見なされました

別のアルゴリズムの使用を再検討してください。k-means は、多くの属性が離散的であり、スケールが大きく異なる混合型データにはあまり適していません。K- meansは、適切な平均を計算できる必要があります。また、バイナリ ベクトルの場合、「0.5」は適切な平均ではなく、0 または 1 のいずれかにする必要があります。

さらに、k-means は外れ値をあまり好みません。

プロットするときは、それらを均等にスケーリングしてください。そうしないと、結果が正しく見えなくなります。X 軸の長さは約 0.9、Y 軸の長さはわずか 0.2 です。

全体として、データセットに k-means スタイルのクラスターがないだけではないでしょうか? DBSCAN などの密度ベースの方法 (外れ値を処理できるため)を必ず試してください。しかし、追加したビジュアライゼーションから判断すると、多くても 4 ~ 5 個のクラスターしかなく、あまり興味深いものではありません。それらはおそらく、いくつかの次元でいくつかのしきい値を使用してキャプチャできます。

平行座標

これは、5000 サンプルを使用して、平行座標で視覚化された、z 正規化後のデータ セットの視覚化です。明るいグリーンは普通です。

データセットの特別な特性をはっきりと見ることができます。すべての攻撃は、属性 3 と 4 (count と srv_count) で明らかに異なり、dst_host_count と dst_host_srv_count に最も集中しています。

このデータセットでも OPTICS を実行しました。多くのクラスターが見つかりましたが、そのほとんどがワイン色の攻撃パターンでした。しかし、それらはあまり面白くありません。10 の異なるホストが ping フラッディングを行っている場合、それらは 10 のクラスターを形成します。

OPTICS クラスター

OPTICSがこれらの攻撃の多くをクラスター化できたことは非常によくわかります。オレンジ色のものはすべて見逃していましたが (minpts を低く設定していた場合は、かなり広がっている可能性があります)、ワイン色の攻撃内に *構造を発見し、いくつかの個別のイベントに分割しました。

このデータセットを本当に理解するには、特徴抽出から始める必要があります。たとえば、このような ping フラッド接続試行を集約イベントにマージします。

また、これは非現実的なシナリオであることに注意してください。

  1. 攻撃、特にポート スキャンに関与するよく知られたパターンがあります。これらは、学習ではなく、専用のポート スキャン ディテクタを使用して検出するのが最適です。
  2. シミュレートされたデータには、シミュレートされた完全に無意味な「攻撃」がたくさんあります。たとえば、90 年代のSmurf 攻撃はデータ セットの 50% を超えており、Syn フラッドはさらに 20% です。通常のトラフィックは 20% 未満です。
  3. この種の攻撃には、よく知られたシグネチャがあります。
  4. 最新の攻撃 (SQL インジェクションなど) の多くは、通常の HTTP トラフィックで流れており、生のトラフィック パターンに異常は見られません。

このデータを分類や外れ値の検出に使用しないでください。ただしないでください。

上記の KDNuggets リンクを引用します。

その結果、次のことを強くお勧めします。

(1) すべての研究者が KDD カップ '99 データセットの使用を停止し、

(2) KDD カップと UCI の Web サイトには、KDD カップ '99 データセットの Web ページに、データセットに既知の問題があることを研究者に知らせる警告が含まれています。

(3) カンファレンスやジャーナルの査読者は、KDD カップ '99 データセットのみから得られた結果をもとに、論文を審査します (または、ネットワーク セキュリティ コミュニティではよくあることですが、完全に却下することさえあります)。

これは実際のデータでも現実的なデータでもありません。何か他のものを取りに行きます。

于 2012-07-07T23:18:15.430 に答える
9

まず第一に、あなたはここで多くのことを求めています。今後の参考のために: 問題を小さなチャンクに分割し、いくつかの質問を投稿してください。これにより、回答が得られる可能性が高くなります (評判が 400 減ることはありません!)。

幸いなことに、私はあなたの苦境を理解しており、この種の質問が大好きです!

このデータセットの k-means に関する問題の可能性は別として、この質問は他のデータセットにも適用できるほど一般的なものです (したがって、Google 社員はここで同様のものを探すことになります)。

私の提案は、合理的に満足のいく結果が得られるまで、この回答を編集することです。

クラスタ数

クラスタリングの問題のステップ 1: 選択するクラスタの数は? 適切な数のクラスターを選択できるいくつかの方法を知っています。これに関する素晴らしいwiki ページがあり、以下のすべてのメソッド (およびその他のメソッド) が含まれています。

外観検査

ばかげているように思えるかもしれませんが、十分に分離されたデータがある場合、単純なプロットを使用するだけで、必要なクラスターの数を (おおよそ) 知ることができます。

長所:

  • 素早い
  • 単純
  • 比較的小さなデータセットの十分に分離されたクラスターでうまく機能します

短所:

  • そして汚い
  • ユーザーの操作が必要
  • 小さなクラスターを見逃すのは簡単です
  • クラスターが十分に分離されていない、またはそれらのクラスターが非常に多いデータは、この方法では実行が困難です
  • それはすべてかなり主観的なものです。次の人は、あなたが選択した金額とは異なる金額を選択する可能性があります。

シルエットプロット

他の質問の1 つに示されているように、silhouettesプロットを作成すると、データ内のクラスターの適切な数についてより適切な決定を下すのに役立ちます。

長所:

  • 比較的単純
  • 統計的手段を使用して主観性を軽減する
  • 選択の質を直感的に表す方法

短所:

  • ユーザーの操作が必要
  • 制限内で、データポイントと同じ数のクラスターを取得すると、シルエット プロットによって、それが最良の選択であることがわかります。
  • それはまだかなり主観的であり、統計的手段に基づいていません
  • 計算コストが高くなる可能性があります

エルボ法

シルエット プロット アプローチと同様にkmeans、毎回より多くのクラスターを使用して繰り返し実行し、このkmeans実行で選択されたクラスターによってデータの合計分散がどの程度説明されるかを確認します。説明された分散の量が、以前のクラスター数の選択のいずれよりもはるかに少なく突然増加するクラスターがいくつかあります (「エルボー」)。エルボは、統計的に言えば、クラスター数の最良の選択です。

長所:

  • ユーザーの操作は不要 -- エルボは自動的に選択できます
  • 前述のどの方法よりも統計的に優れている

短所:

  • やや複雑
  • 「肘」の定義は主観的に選択されたパラメータに依存するため、依然として主観的です
  • 計算コストが高くなる可能性があります

外れ値

上記のいずれかの方法でクラスターの数を選択したら、外れ値検出を実行して、クラスターの品質が向上するかどうかを確認します。

エルボ法を使用して、2 段階の反復アプローチから始めます。疑似Matlabでは:

data = your initial dataset
dataMod = your initial dataset

MAX = the number of clusters chosen by visual inspection

while (forever)

    for N = MAX-5 : MAX+5
        if (N < 1), continue, end
        perform k-means with N clusters on dataMod
        if (variance explained shows a jump)
            break
    end

    if (you are satisfied)
        break
    end

    for i = 1:N
        extract all points from cluster i 
        find the centroid (let k-means do that)
        calculate the standard deviation of distances to the centroid
        mark points further than 3 sigma as possible outliers
    end

    dataMod = data with marked points removed

end

難しい部分は明らかにyou are satisfied. これがアルゴリズムの有効性の鍵です。この部分の大まかな構造

if (you are satisfied)
    break
end

このようなものになります

if (situation has improved)
    data = dataMod

elseif (situation is same or worse)
    dataMod = data
    break            
end

situation has improved外れ値が少ない場合、または のすべての選択について説明された分散がのN前のループ中よりも優れている場合while。これはまた、いじる必要があります。

とにかく、これは最初の試みではありません。ここに不完全性、欠陥、または抜け穴がある場合は、コメントまたは編集してください。

于 2012-07-12T10:57:27.467 に答える