Menu
CoddyTech

One-Hot Encoding

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

У инструментов нет порядка: если пронумеровать их 1, 2, 3, пианино считалось бы больше барабанов. One-hot-кодирование вместо этого отводит каждой категории отдельный столбец со значением 0/1:

Инструменты четырёх учеников: пианино, барабаны, пианино, виолончель — преобразуются в три столбца с названиями «виолончель», «барабаны» и «пианино»: в каждой строке стоит одна 1 в столбце соответствующего инструмента и 0 в остальных, а столбец с неделями проходит без изменений

Это делает pd.get_dummies, а dtype=int запрашивает значения 1 и 0 вместо True и False:

pupils = pd.DataFrame({"instrument": ["piano", "drums", "piano", "cello"],
                       "weeks": [4, 3, 6, 10]})
encoded = pd.get_dummies(pupils, columns=["instrument"], dtype=int)
print(encoded)

Будет выведено:

   weeks  instrument_cello  instrument_drums  instrument_piano
0      4                 0                 0                 1
1      3                 0                 1                 0
2      6                 0                 0                 1
3     10                 1                 0                 0

Новые столбцы добавляются в конец, по одному для каждого значения в алфавитном порядке. Цена — увеличение ширины: 500 различных значений добавят 500 столбцов.

challenge icon

Задание

Средне

На сайте для отдыха перечислены домики в cabins.csv. Программа считывает имя столбца: area или heat. В исходном коде ему присваивается числовое значение для вычисления корреляции с ценой, но ни один из столбцов не имеет порядка: эта r выдумана.

  1. Замени его строки: закодируй столбец методом one-hot (0 и 1).
  2. Выведи, на сколько столбцов он разбился, а затем каждый новый столбец с количеством единиц в нём.

Для пяти домиков и ввода heat:

heat became 2 columns:
heat_gas: 3 cabins
heat_wood: 2 cabins

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

import pandas as pd

cabins = pd.read_csv("cabins.csv")
column = input()

# Напишите свой код ниже
# Эти строки присваивают номера районам и типам отопления, у которых нет естественного порядка: замените их
numbers = {"coast": 1, "hills": 2, "lake": 3, "woods": 4, "gas": 1, "solar": 2, "wood": 3}
cabins[column] = cabins[column].map(numbers)
print(f"{column} against price: r = {round(cabins[column].corr(cabins['price']), 2)}")
quiz iconПроверьте себя

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

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

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