Menu
CoddyTech

異常なデータを見つける

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

この章では、奇妙な行を探します。読み終えるころには、サーバーの異常な分を丸で囲めるようになります。

Webサーバーの一晩の分単位のデータ。横軸は1秒あたりのリクエスト数、縦軸はレイテンシ。密集した右上がりの点群と、2つの検出器が一致した、赤丸で囲まれた孤立した4分間

異常とは、故障、不正、誤植など、ほかとは異なるまれな行のことです。新たな異常はそれぞれ異なるため、事前にラベル付けすることはできません。

z スコアから始めましょう。StandardScaler はすべての列を z スコアに変換するため、次の1行で、3を超える値がある行をすべて検出できます。

z = StandardScaler().fit_transform(X)
odd = (np.abs(z) > 3).sum(axis=1) > 0

温度の上昇に伴って増加する橋のセンサーのひずみ。ほかの値より大幅に高い1つの測定値が赤で囲まれ、ひずみの z スコアが3を超えるとして検出されている。27度で傾向を下回る1つの測定値がオレンジで囲まれている。見落とされた

しかし、各列では普通でも、その組み合わせだけが異常な行があります。列ごとの z スコアでは見つけられません。

challenge icon

チャレンジ

中級

あるスーパーマーケットでは、80台の冷凍庫について1日分の平均値を記録しました。どの冷凍庫に技術者が必要でしょうか?プログラムはしきい値を読み込みます。

  1. Xの各列をzスコアに変換します。
  2. 各列について、フラグが付いた冷凍庫の数を出力します。zスコアの0からの距離がしきい値を超えた冷凍庫にフラグを付けます。
  3. いずれかの列でフラグが付いた冷凍庫を、表の順序で出力します。

別の店舗で、しきい値が3の場合:

temp_c: 1 flagged
power_kw: 2 flagged
door_openings: 0 flagged
defrost_min: 0 flagged
Freezers to check:
  F05
  F13
  F51

自分で試してみよう

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler

# 冷凍ケース1台につき1行:1日分の平均値
freezers = pd.read_csv("freezers.csv")
columns = ["temp_c", "power_kw", "door_openings", "defrost_min"]
X = freezers[columns]
cutoff = float(input())

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

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

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

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