Menu
CoddyTech

Зачем масштабировать признаки

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

Какой клиент больше всего похож на нового? Многие модели измеряют расстояние между образцами: возводят разницу по каждому признаку в квадрат, складывают результаты и извлекают квадратный корень.

25-летний человек с доходом $52,000 против 61-летнего человека с доходом $53,000:

Два столбца показывают, насколько каждый признак увеличивает расстояние между двумя клиентами: возраст с разницей в 36 лет добавляет 1,296 — настолько тонкую полоску, что её не видно; доход с разницей в $1,000 добавляет 1,000,000 — длинный столбец

Для всей таблицы axis=1 суммирует квадраты в каждой строке, а .argmin() находит ближайшую строку:

a = np.array([25, 52000])  # возраст, доход
X = np.array([[61, 53000],   # 61-летний человек
              [26, 55000]])  # 26-летний человек с доходом $55,000
dists = np.sqrt(((X - a) ** 2).sum(axis=1))
print(np.round(dists, 2))
print(dists.argmin())

Это выводит:

[1000.65 3000.  ]
0

Человек в возрасте 61 года ближе: суммы в долларах больше, поэтому $1,000 перевешивают 36 лет. Без масштабирования решающими становятся самые крупные единицы измерения.

В этой главе каждой возможности уделяется должное внимание.

challenge icon

Задание

Средне

Магазин сравнивает стиральные машины по цене ($), энергопотреблению (kWh в год) и расходу воды (литров за стирку); эти характеристики указаны в features. Программа считывает позиции двух машин — i и j. Выведите:

  1. Squared gaps: разницу по каждой характеристике, возведённую в квадрат.
  2. Distance: расстояние, округлённое до 2 знаков после запятой.
  3. Dominant feature: название характеристики с наибольшей разницей в квадрате.

Для двух других машин:

Squared gaps: [2500 6400    1]
Distance: 94.35
Dominant feature: energy

Попробуйте сами

import numpy as np

features = ["price", "energy", "water"]
# Одна строка на каждую стиральную машину: цена в долларах, потребление электроэнергии в кВт·ч в год, расход воды в литрах за одну стирку
machines = np.array([[499, 160, 48],
                     [349, 210, 55],
                     [899, 120, 42],
                     [529, 250, 50],
                     [279, 230, 60],
                     [749, 140, 45]])
i = int(input())
j = int(input())

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

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

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

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