Menu
CoddyTech

Isolation Forest

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

外れ値は簡単に切り離せます。データをランダムに何度も分割し、1つの点だけが残るまで繰り返します:

同じ散布図を2回表示し、灰色のランダムな分割線で分割した図。左:隅にある離れた点は2回の分割で単独になる。右:集団の中央にある点は8回の分割が必要

遠く離れた点は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は、異常だと予想する行の割合です。

challenge icon

チャレンジ

中級

ある港では、クレーンのシフト160回について、1時間あたりの荷役回数と荷役1回あたりのエネルギー使用量を記録しました。どのシフトが異常でしたか?

  1. Isolation Forestでシフトにフラグを付けます。contamination=0.03、random_state=0を指定します。以下のように件数を出力してください。
  2. 正常なシフトを、normalというラベルを付けた点で散布図にします。
  3. フラグが付いたシフトを丸で囲みます。s=150, facecolors="none", edgecolors="red"を指定し、flaggedというラベルを付けます。凡例を追加して表示します。

シフトが200回ある別の港の場合:

Flagged: 6 of 200 shifts

右肩下がりの雲のように点が並ぶクレーンのシフト。速いクレーンほど荷役1回あたりのエネルギー使用量が少なく、その周囲には孤立した6つのシフトが赤い丸で囲まれ、凡例が付いている

その後、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)")

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

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

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

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