分離フォレスト(Python実装)

コンテンツ

1はじめに

2分離ランダムフォレストアルゴリズム

2.1アルゴリズムの概要

2.2原理の紹介

2.3アルゴリズムの手順

3パラメータの説明

4Pythonコードの実装 

5件の結果 


1はじめに

分離フォレストは、効率的な異常検出アルゴリズムです。ランダムフォレストに似ていますが、情報ゲインやジニ係数に従って選択するのではなく、分割属性と分割ポイント(値)がランダムに選択されるたびに行われます。

[推奨事項]電力システムとアルゴリズムの美しさ

2分離ランダムフォレストアルゴリズム

2.1アルゴリズムの概要

孤立/孤立を意味する孤立は名詞で、動詞は孤立、森は森です。合わせて「孤立した森」、「ユニークな森」とも呼ばれます。統一された中国名はないようです。たぶん、誰もがiForestと呼ばれる英語名の分離フォレストを使用することに慣れています。

  iForestアルゴリズムは、南京大学のZhouZhihuaとオーストラリアのMonash大学のKaiMingTingのFeiTony Liuによって共同で削除され、データのマイニングに使用されます。連続数値データの異常検出に適しています。異常は定義されています。それは「分離される可能性が高い」ので、それはまばらに分布し、高密度の集団から遠く離れている点として理解することができます。統計を用いて説明すると、データ空間の分布がまばらな領域は、この領域でデータが発生する確率が非常に低いことを示しているため、これらの領域に分類されるデータは異常であると考えられます。これは通常、ネットワークセキュリティの攻撃検出とトラフィック異常分析に使用され、金融機関が不正行為を発見するために使用します。見つかった異常データについては、データクリーニングでノイズ除去データなどの異常データを直接削除するか、攻撃や不正の動作特性の分析など、異常データを詳細に分析します。

2.2原理の紹介

iForestは、ノンパラメトリックで教師なしアプローチです。つまり、数学モデルを定義したり、トレーニングにラベルを付けたりすることはありません。iForestは、どのポイントを簡単に分離できるかを見つける方法について、非常に効率的な戦略を使用しています。ランダムな超平面を使用してデータ空間を分割し、分割によって2つの部分空間を生成できるとします(ナイフで詳細を示し、ケーキを2つに分割します)。次に、ランダムな超平面で各部分空間を切り取り、各部分空間にデータポイントが1つだけになるまでループします。直感的には、高密度のクラスターは切断を停止する前に何度も切断されますが、密度の低いポイントは部分空間で非常に早く停止しやすいことがわかります。

  iForestアルゴリズムは、ランダムフォレストのアイデアから恩恵を受けています。ランダムフォレストが多数の決定木で構成されているのと同様に、iForestフォレストも多数の二分木で構成されています。iForestのツリーは分離ツリー、または略してiTreeと呼ばれます。iTreeツリーは決定木と同じではありません。構築プロセスも決定木よりも単純であり、完全にランダムなプロセスです。

  データセットにN個のデータがあると仮定すると、ITreeを構築するときに、ツリーのトレーニングサンプルとして、N個のデータからN個のサンプルが均一にサンプリングされます(通常は置換なしでサンプリングされます)。サンプルでは、​​特徴がランダムに選択され、この特徴のすべての値の範囲内(最小値と最大値の間)で値がランダムに選択され、サンプルはバイナリに分割され、この値よりも小さい値がサンプルはノードに分割されますこの値以上のノードの左側は、ノードの右側に分割されます。これから、左側と右側の分割条件とデータセットが取得され、データセットのレコードが1つだけになるか、ツリーの限界高さが次のようになるまで、上記のプロセスが左側と右側のデータセットでそれぞれ繰り返されます。到達しました。

  異常なデータは小さく、固有値は正常なデータとは大きく異なるためです。したがって、iTreeを構築する場合、異常なデータはルートに近くなり、正常なデータはルートから遠くなります。ITreeの結果は信頼できないことがよくあります。iForestアルゴリズムは、複数のサンプリングを通じて複数のバイナリツリーを構築します。最後に、すべてのツリーの結果が統合され、平均深度が最終出力深度として取得されます。これにより、データポイントの外れ値ブランチが計算されます。

2.3アルゴリズムの手順

このデータ空間をカットする方法は、iForestの設計の中心的なアイデアです。この記事では、最も基本的な方法のみを学習します。カットはランダムであるため、アンサンブル法を使用して収束値を取得する必要があります(モンテカルロ法)。つまり、最初から繰り返しカットし、各カットの結果を平均します。IForestはtiTree(Isolation Tree)の分離ツリーで構成され、各iTreeはバイナリツリー構造であるため、最初にiTreeツリーの構築について説明し、次にiForestツリーの構築について見ていきましょう。

3パラメータの説明

(1)n_estimators:構築するitreesの数、int、オプション(デフォルト= 100)は、フォレストで生成されるランダムツリーの数を指定します

(2)max_samples:サンプル数、自動的に256、int、オプション(デフォルト='auto)

    乱数のトレーニングに使用されるサンプルの数、つまりサブサンプリングのサイズ:

1)int定数が設定されている場合、max_samplesサンプルが合計サンプルXからプルされ、ツリーiTreeが生成されます。

2)floatが設定されている場合、max_samples * X.shape [0]サンプルがサンプルの総数Xから取得され、X.shape[0]はサンプルの総数を表します。

3)「auto」が設定されている場合、max_samples = min(256、n_samples)、n_samplesは合計サンプル数です

 max_samples値が提供されたサンプルの総数よりも大きい場合、すべてのサンプルが数の作成に使用されます。つまり、サンプリングはなく、作成されたn_estimators ITreeで使用されるサンプルは同じです。つまり、すべてのサンプルです。 。

(3)汚染:c(n)はデフォルトで0.1、フロートイン(0、0.5)、オプション(デフォルト= 0.1)、値の範囲は(0、0.5)で、特定のデータセット内の異常データの割合を示します、はデータセット内の汚染の量です。このパラメーターの値を定義する役割は、決定関数のしきい値を定義することです。「auto」に設定されている場合、決定関数のしきい値は論文と同じですが、バージョン0.20が変更されています。デフォルト値は、0.1からautoに0.22で変更されています。

(4)max_features:機能の最大数。デフォルトは1、intまたはfloat、オプション、各ツリーiTreeをトレーニングするためにサンプルX全体から抽出される属性の数を指定します。デフォルトでは1つの属性のみが使用されます。

    intに設定されている場合、max_features属性を抽出します

    フロートの場合は、max_features *X.shape[1]属性を抽出します

(5)ブートストラップ:ブール値、オプション(デフォルト= False)、ツリーを構築するときに、次回サンプリングを置き換えるかどうか、Trueが置換の場合、各ツリーを元に戻してトレーニングデータをサンプリングできます。Falseが置換なしの場合、つまり、置換せずにサンプルを実行します

(6)n_jobs:intまたはNone、オプション(デフォルト= None)、fit()およびpredict()関数を実行するときに並列に実行するジョブの数。joblib.parallel_backendコンテキストの場合を除いて、Noneは1を意味し、-1に設定すると、使用可能なすべてのプロセッサを使用することを意味します。 

(7)動作:str、default ='old'、決定関数decision_functionの動作。「old」および「new」にすることができます。Behavior ='new'を設定すると、decision_functionは他の異常検出アルゴリズムのAPIに対応します。これは、将来デフォルトに設定されます。offset_属性のドキュメントで詳細に説明されているように、decision_functionは汚染パラメータに依存し、外れ値を検出するための自然なしきい値は0です。

     バージョン0.20の新機能:下位互換性のために、動作パラメーターがバージョン0.20で追加されました

          behaviour ='old'はバージョン0.20で非推奨になり、バージョン0.22では機能しません

               動作パラメータはバージョン0.22で非推奨になり、バージョン0.24で削除されます

(8)random_state:int、RandomStateインスタンスまたはNone、オプション(デフォルト=なし)

    int定数に設定されている場合、random_stateパラメーター値は乱数ジェネレーターに使用されるシードです。

    RandomStateインスタンスに設定されている場合、random_stateは乱数ジェネレーターです。

    Noneに設定されている場合、乱数ジェネレーターはnp.randomで使用されるRandomStateインスタンスです。

(9)verbose:int、オプション(デフォルト= 0)は、ツリー構築プロセスの詳細度を制御します

(10)warm_start:bool、オプション(デフォルト= False)、TRUEに設定すると、前の呼び出しの結果を再利用してフィットし、前のフォレスト1セットにさらにツリーを追加します。それ以外の場合は、まったく新しいフォレストにフィットします。

4Pythonコードの実装 

# _*_coding:utf-8_*_

#~~~~欢迎关注公众号:电力系统与算法之美~~~~~~~·
#~~~~~~~~导入相关库~~~~~~~~~~~·
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
import matplotlib; matplotlib.use('TkAgg')
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
from sklearn.ensemble import IsolationForest  #孤立随机森林

rng = np.random.RandomState(42)  #该方法为np中的伪随机数生成方法,其中的42表示种子,只要种子一致 产生的伪随机数序列即为一致。

#~~~~~~~产生训练数据~~~~~~~~~~
X = 0.3 * rng.randn(100, 2)  #randn:标准正态分布;rand的随机样本位于[0, 1)中
X_train = np.r_[X + 2, X - 2]
X = 0.3 * rng.randn(20, 2)
X_test = np.r_[X + 2, X - 2]
X_outliers = rng.uniform(low=-4, high=4, size=(20, 2))

#~~~~~~~~~训练模型~~~~~~~~~~~~·
clf = IsolationForest( max_samples=100,random_state=rng, contamination='auto')
clf.fit(X_train)
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_outliers)

xx, yy = np.meshgrid(np.linspace(-5, 5, 50), np.linspace(-5, 5, 50))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

#~~~~~~~~~~~~~~~~可视化~~~~~~~~~~~~~~~~~~·
plt.title("孤立随机森林")
plt.contourf(xx, yy, Z, camp=plt.cm.Blues_r)
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='green',
                 s=20, edgecolor='k')
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='white',
                 s=20, edgecolor='k')
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red',
                s=20, edgecolor='k')
plt.axis('tight')
plt.xlim((-5, 5))
plt.ylim((-5, 5))
plt.legend([b1, b2, c],
           ["training observations",
            "new regular observations", "new abnormal observations"],
           loc="upper left")
plt.show()

5件の結果 

 

おすすめ

転載: blog.csdn.net/weixin_46039719/article/details/123716288