ローカル外れ値係数
ローカル外れ値係数(LOF)は、各観察のLOFスコアを測定し、隣接観察の密度の局所偏差を表します。
LOFスコアは、観察が周囲の近所に関してどの程度孤立しているかによって決まります。 LOFスコアが大きいほど、観察が分離されます。
このアルゴリズムは、k近傍を用いて、サンプルの局所密度と近傍の局所密度を比較します。 近傍よりも密度が著しく低い試料は外れ値とみなされます。
空間コンテキストでは、LOFスコアは地理的に分離されたサンプルを識別するのに役立ちます。 たとえば、自動車事故が集中しているロケーションを分析し、孤立した事故ロケーションを外れ値としてラベル付けすることで、さらなる検査を目指すことができます。
LOFメソッド(LOF
メソッドの詳細は[ 2 ]を参照)は、次のステップで構成されます:
- 2つの観測間の距離を測定するメソッドの定義 - 機能または地理のいずれかに従って。 空間ウェイトが定義されている場合、距離は対応するウェイトから取得されます。ただし、二項ウェイトは除きます。ここで、距離はジオメトリに基づいて計算されます。
- 観察のk距離を計算するメソッドを定義します。 k距離は、近傍またはK番目の近傍からKNNまでの距離です。 空間ウェイトが定義されている場合、隣接する観測は空間ウェイトに従って取得され、2つの観測間の距離は対応するウェイト(2進ウェイトを除く)から得られます。ただし、距離はジオメトリに基づいて計算されます。
- 2つの観測間の到達可能性距離をコンピュートするメソッドを定義します。
- 次の式に従って、各観測のローカル到達距離(LRD)をコンピュートします。ここで、Nbiはi番目の観測の近傍を示します。 空間ウェイトが定義されている場合、i番目の観測のネイバーは空間ウェイトから得られます。 それ以外の場合、アルゴリズムはk近傍法を使用します。
- 各観察のLOFスコアをコンピュートします。
ノベルティ検出にLocalOutlierFactor
を使用するには、novelty
パラメータをTrue
に設定し、predict
メソッドをコールして、表示されていないデータと新しいデータのいずれが外れ値であるかを識別する必要があります。
詳細は、「Oracle Spatial AI Python APIリファレンス」のLocalOutlierFactorクラスを参照してください。
次の例では、市内の事故レポートに基づいてデータセットを使用します。 これには、自動車事故のロケーションと重大度が含まれます。 この例では、最初にデータベース表に基づいてSpatialDataFrame
のインスタンスを作成します。
from oraclesai import SpatialDataFrame, DBSpatialDataset
import oml
accidents_pdf = SpatialDataFrame.create(DBSpatialDataset(table='chicago_accidents', schema='oml_user'))
目的は、事業所に基づいて人が負傷した事故の外れ値を識別することです。 データセットには、自動車事故の重大度を示すカテゴリ変数INJURY_RATING
が含まれています。 この例では、INJURY_RATING
が3
以上の事故に焦点を当てています。
次のコードでは、LocalOutlierFactor
を使用して、spatial_weights_definition
パラメータに従って隣接するロケーションに基づいて各観測のLOFスコアを計算します。
from oraclesai.weights import KNNWeightsDefinition
from oraclesai.outliers import LocalOutlierFactor
# Get records with INJURY_RATING >= 3
accidents_injury_pdf = accidents_pdf[accidents_pdf["INJURY_RATING"] >= 3]
# Keep columns INJURY_RATING and geometry, and use a geodetic coordinate system
X = accidents_injury_pdf[["INJURY_RATING", "geometry"]].to_crs("epsg:3857")
# Create an instance of the LOF model defining the spatial weights
slof_model = LocalOutlierFactor(spatial_weights_definition=KNNWeightsDefinition(k=20))
# Train the model
slof_model.fit(X)
# Get and print the LOF scores for each observation
slof_scores = -1 * slof_model.negative_outlier_factor_
print(slof_scores[:10])
プログラムは、最初の10個の観測のLOFスコアを出力します。 negative_outlier_factor_
プロパティは負のLOFスコアを返すことに注意してください。
[1.12403072 1.49269168 1.18196622 1.23728049 0.89957071 1.00487086
1.03445893 0.98740889 1.01636585 1.00944292]