外れ値の扱い方
CoddyのMachine Learningジャーニー「機械学習のための統計」セクションの一部。レッスン 27/64。
10戸のアパートではそれぞれ約10 m³の水を使用していましたが、漏水により1戸の使用量が64になりました。これを除外するか、最も近いフェンスの値で上限を設定できます。
np.clip(a, low, high) は配列全体の値を上限・下限で制限します:
water = np.array([8, 11, 9, 10, 12, 9, 64, 10, 11, 8])
low, high = 6.0, 14.0 # IQRの外れ値判定の境界値
dropped = water[(water >= low) & (water <= high)]
capped = np.clip(water, low, high)
print(len(dropped), len(capped))
print(capped)これは次のように出力されます:
9 10
[ 8. 11. 9. 10. 12. 9. 14. 10. 11. 8.]モデルはその外れ値に引きずられるため、学習前に判断しましょう。誤植は修正するか削除し、実際の極端な値は残すか上限を設定します。黙って削除してはいけません。いくつ変更したかを伝えましょう。
チャレンジ
中級サイクリングアプリには、15回の走行の平均速度がspeedsに記録されており、そのうち2つは不自然に見えます。開始コードでは、IQRの境界値がlowとhighに格納されています。
- 境界値の範囲内(両端を含む)の速度を使って
droppedとcappedを作成します。 - keep、drop、capそれぞれについて、走行回数、平均値、2桁の小数に丸めた
.std()を1行ずつ出力します。 - 上限処理によって変更された走行回数を出力します。
別のライダーの10回の走行について:
Keep: 10 rides, mean 21.38, std 6.58
Drop: 9 rides, mean 19.2, std 0.77
Cap: 10 rides, mean 19.45, std 1.04
Capping changed 1 of 10 rides自分で試してみよう
import numpy as np
# 配列のIQRの下限と上限のフェンスを返す
def iqr_fences(a):
q1 = np.percentile(a, 25)
q3 = np.percentile(a, 75)
iqr = q3 - q1
return q1 - 1.5 * iqr, q3 + 1.5 * iqr
speeds = np.array([24.5, 22.8, 26.1, 23.9, 3.1, 25.4, 21.7, 24.2, 27.3, 78.4, 23.1, 25.8, 22.4, 24.9, 26.6])
low, high = iqr_fences(speeds)
# 以下にコードを記述してください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
機械学習のための統計のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ