Isolation Forest
CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 35/51。
外れ値は簡単に切り離せます。データをランダムに何度も分割し、1つの点だけが残るまで繰り返します:
遠く離れた点は2回の分割を必要とし、密集した点は8回でした。孤立フォレストは、100本のランダムな木での分割回数を平均します。
from sklearn.ensemble import IsolationForest
forest = IsolationForest(contamination=0.02, random_state=0)
flags = forest.fit_predict(X)fit_predictは異常な行に-1を、それ以外の行に1を返します。contaminationは、異常だと予想する行の割合です。
チャレンジ
中級ある港では、クレーンのシフト160回について、1時間あたりの荷役回数と荷役1回あたりのエネルギー使用量を記録しました。どのシフトが異常でしたか?
- Isolation Forestでシフトにフラグを付けます。
contamination=0.03、random_state=0を指定します。以下のように件数を出力してください。 - 正常なシフトを、
normalというラベルを付けた点で散布図にします。 - フラグが付いたシフトを丸で囲みます。
s=150, facecolors="none", edgecolors="red"を指定し、flaggedというラベルを付けます。凡例を追加して表示します。
シフトが200回ある別の港の場合:
Flagged: 6 of 200 shiftsその後、Coddyがあなたのグラフについて説明します。
自分で試してみよう
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest
# 港でのクレーンの各シフトにつき1行:作業速度とエネルギー消費量
shifts = pd.read_csv("cranes.csv")
X = shifts[["moves_per_hour", "kwh_per_move"]]
# 以下の行は変更しないでください
fig, ax = plt.subplots()
ax.set_title("Crane Shifts")
ax.set_xlabel("Moves per hour")
ax.set_ylabel("Energy per move (kWh)")
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師なし学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ