Menu
CoddyTech

Local Outlier Factor

CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 36/51。

データの範囲内にも、いくつかの異常な点が隠れています。局所外れ値因子(LOF)は、各点の位置がどれだけ密集しているかを、近傍の点の位置と比較します。

駐車場の車。横軸は到着時刻、縦軸は駐車時間。通勤客は8:00頃に到着し、9時間駐車する車が密集している。買い物客は数時間の駐車で一日中まばらに分布している。8:18に到着して6.6時間駐車した1台の車が赤丸で囲まれ、LOFによって異常として検出されている

買い物客が6時間滞在することもあります。しかし、この車の近傍は通勤者で、ぎっしり詰まっており、この車はその集団から遠く離れた場所にあります。

from sklearn.neighbors import LocalOutlierFactor
lof = LocalOutlierFactor(n_neighbors=20, contamination=0.02)
flags = lof.fit_predict(X)

答えは前と同じです。-1は異常、1は正常です。n_neighborsは比較の局所性を設定します。

challenge icon

チャレンジ

中級

ある携帯電話会社は、近隣のアカウントとは異なるアカウントを探しています。スターターコードではデータをスケーリングし、Isolation Forestでアカウントにフラグを付けます。プログラムはkを読み込みます。

  1. LOFでアカウントにフラグを付けます。n_neighbors=k、contamination=0.03を指定します。
  2. 各検出器の件数と、両方の検出器がフラグを付けたアカウント数を出力します。
  3. 以下のように、LOFだけがフラグを付けたアカウントを、テーブルの順に一覧表示します。

より小規模な会社の場合で、10を指定すると:

Isolation forest: 5 accounts
LOF: 5 accounts
Both: 4 accounts
Only LOF:
  A118: 960 minutes, 6.2 GB

自分で試してみよう

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor

# 電話アカウントごとに1行:1か月間の通話時間とモバイルデータ通信量
accounts = pd.read_csv("accounts.csv")
X = StandardScaler().fit_transform(accounts[["call_minutes", "data_gb"]])
k = int(input())

# Isolation Forestの結果:フォレストが異常と判定したアカウントは-1
forest_flags = IsolationForest(contamination=0.03, random_state=0).fit_predict(X)

# 以下にコードを記述してください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師なし学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ