Menu
CoddyTech

Работа с выбросами

Часть раздела Статистика для машинного обучения путешествия по Machine Learning на Coddy. Урок 27 из 64.

Десять квартир использовали примерно по 10 м³ воды каждая, но из-за утечки в одной из них расход вырос до 64. Можно исключить это значение или ограничить его ближайшей границей:

Расход воды в 10 квартирах, показанный в три ряда. Оставить: девять точек около 10 и утечку при 64, среднее значение — 15.2. Исключить: утечка удалена, среднее значение — 9.8. Ограничить: утечка сдвинута к границе на 14, среднее значение — 10.2

np.clip(a, low, high) ограничивает значения во всём массиве:

water = np.array([8, 11, 9, 10, 12, 9, 64, 10, 11, 8])
low, high = 6.0, 14.0  # границы межквартильного размаха
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.]

Модель может подстроиться под это единственное плоское значение, поэтому решите, что делать, до обучения. Исправьте или пропустите опечатки; сохраните реальные экстремальные значения или ограничьте их. Никогда не удаляйте данные молча: укажите, сколько значений вы изменили.

challenge icon

Задание

Средне

В приложении для велопоездок записаны средние скорости 15 поездок в speeds; две выглядят странно. В стартовом коде границы IQR помещены в low и high.

  1. Создай dropped — скорости в пределах границ (включая обе границы), — и capped.
  2. Выведи по одной строке для keep, drop и cap: количество поездок, их среднее и .std(), округлённые до 2 знаков после запятой.
  3. Выведи, у скольких поездок изменились значения после ограничения.

Для 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)

# Напишите свой код ниже
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Статистика для машинного обучения

Потренируйтесь самостоятельно: Онлайн-компилятор Python