ПР21
Дисциплина: ДУП.05 Визуальное программирование
Папка пары / задания: Практическое занятие No21. Приведение данных к приемлемому формату Методы кодирования категориальных признаков
Тип занятия: Практика
Дедлайн: 24.12.2025 23:59
Практическое занятие No21. Приведение данных к приемлемому формату Методы кодирования категориальных признаков Цель работы: Освоить методы приведения категориальных признаков к числовому виду, применяемые в задачах машинного обучения, и реализовать их с помощью KNIME, MySQL Workbench и (по желанию) Python. Задачи студента: 1 Закрепить понятие категориального признака и его типов 2 Познакомиться с основными методами кодирования категориальных признаков (label encoding, one-hot encoding и др.) 3 Выполнить кодирование нескольких категориальных столбцов для реальной таблицы БД 4 Сравнить преимущества и недостатки различных способов кодирования 5 Подготовить набор данных, пригодный для применения алгоритмов машинного обучения
Текст задания
Практическая работа 21 Приведение данных к приемлемому формату Методы кодирования категориальных признаков
Цель работы:
Освоить методы приведения категориальных признаков к числовому виду, применяемые в задачах машинного обучения, и реализовать их с помощью KNIME, MySQL Workbench и (по желанию) Python.
Задачи студента:
1 Закрепить понятие категориального признака и его типов
2 Познакомиться с основными методами кодирования категориальных признаков (label encoding, one-hot encoding и др.)
3 Выполнить кодирование нескольких категориальных столбцов для реальной таблицы БД
4 Сравнить преимущества и недостатки различных способов кодирования
5 Подготовить набор данных, пригодный для применения алгоритмов машинного обучения
Оборудование и ПО:
1 Персональный компьютер
2 MySQL Server + MySQL Workbench
3 KNIME Analytics Platform
4 (Опционально) Python 3.x, библиотека pandas, scikit-learn / Jupyter Notebook или VS Code
2 Краткая теоретическая часть
Категориальные признаки
Категориальный признак – это признак, принимающий значения из ограниченного набора категорий (классов), которые обычно задаются строками (текстом), а не числами.
Примеры:
– Пол: «male», «female»
– Город: «Москва», «Санкт-Петербург», «Казань», …
– Тип контракта: «monthly», «yearly», «promo»
Различают:
1 Номинальные признаки – категории без естественного порядка
Примеры: город, марка автомобиля, цвет (красный, синий, зелёный)
2 Порядковые признаки – категории с упорядочиванием
Примеры: уровень образования (среднее, бакалавр, магистр), уровень дохода (низкий, средний, высокий)
Большинство алгоритмов машинного обучения работает с числами, поэтому категориальные признаки нужно кодировать (переводить) в числовой формат.
Основные методы кодирования
1 Прямое числовое кодирование (Label Encoding)
– Каждой категории сопоставляется целое число
– Пример:
– «Москва» → 0
– «Санкт-Петербург» → 1
– «Казань» → 2
– Плюсы: простота, компактность
– Минусы: искусственный порядок между категориями, которого может не быть (алгоритм может решить, что 2 > 1 > 0 – то есть «Казань» > «СПб» > «Москва»)
2 One-Hot Encoding (двоичное кодирование признаками-столбцами)
– Для каждой категории создаётся отдельный бинарный столбец (0 или 1)
– Пример для признака «город» с тремя значениями:
город city_Moscow | city_SPb city_Kazan
Москва 1 0 0
Санкт-Петербург 0 1 0
Казань 0 0 1
– Плюсы: нет искусственного порядка, хорошо работает для большинства моделей
– Минусы: рост размерности при большом числе категорий
3 Binary Encoding, Hash Encoding
– Используются для признаков с очень большим количеством категорий (high cardinality)
– Сначала категории кодируются числами, затем в двоичной системе, и каждая двоичная позиция – отдельный столбец
– В рамках данной практики можно упомянуть теоретически, реализацию не обязательно делать
4 Target / Mean Encoding
– Категория кодируется числом, вычисленным на основе целевой переменной (например, среднее значение таргета по категории)
– Может давать хороший результат, но очень опасен с точки зрения утечки информации (data leakage)
– Применяется аккуратно, обычно с кросс-валидацией
Особенности работы с категориальными признаками
1 Учет редких категорий (low frequency): возможно объединение в группу «Other»
2 Обработка новых категорий, которых не было в обучающей выборке
3 Учет порядка для порядковых признаков (например, можно кодировать «низкий», «средний», «высокий» как 1, 2, 3)
4 Согласованность кодирования между обучающей и тестовой выборками (одни и те же коды для одних и тех же категорий)
3 Ход выполнения работы
Ниже – базовая последовательность действий, которую студенты повторяют. Преподаватель при необходимости адаптирует структуру и таблицы под свою БД.
Подготовка данных в MySQL
1 Запустите MySQL Workbench и подключитесь к серверу
2 Создайте (или используйте уже созданную на прошлых занятиях) базу данных, например ml_practice
3 Создайте таблицу с несколькими категориальными признаками.
CREATE TABLE customers (
id INT PRIMARY KEY AUTO_INCREMENT,
gender VARCHAR(10), -- категориальный признак
city VARCHAR(50), -- категориальный признак
contract_type VARCHAR(20), -- категориальный признак
age INT,
income_level VARCHAR(20), -- порядковый категориальный
churn TINYINT -- целевая переменная: 0 - остался, 1 - ушёл
);
4 Заполните таблицу тестовыми данными (не менее 20–30 строк). Можно использовать несколько разных городов, типов контрактов и уровней дохода. Например:
INSERT INTO customers (gender, city, contract_type, age, income_level, churn)
VALUES
('male', 'Moscow', 'monthly', 25, 'low', 0),
('female', 'SPb', 'yearly', 32, 'medium', 0),
('male', 'Kazan', 'monthly', 45, 'high', 1),
('female', 'Moscow', 'promo', 22, 'low', 0),
('female', 'Kazan', 'yearly', 29, 'medium', 1);
5 Убедитесь, что таблица корректно заполнена, выполнив:
SELECT * FROM customers;
Сделайте скриншот результата для отчёта.
4.2 Загрузка данных и кодирование в KNIME
1 Запустите KNIME Analytics Platform
2 Создайте новый рабочий процесс (New → New KNIME Workflow), дайте ему название, например P21_CategoricalEncoding
3 Добавьте и настройте узлы подключения к MySQL:
1 Database Connector / MySQL Connector – введите параметры подключения
2 DB Table Selector – выберите таблицу customers
3 DB Reader / DB to Table – загрузите данные в таблицу KNIME
4 Добавьте узел Column Filter, оставив только необходимые признаки, например:
– gender
– city
– contract_type
– income_level
– churn
5 Выполните Label Encoding (Nominal Value → Number)
1 Добавьте узел Nominal Value to Number
2 В настройках выберите один из признаков, например gender
3 Настройте способ нумерации (по алфавиту или по порядку появления)
4 Выполните workflow и посмотрите результат:
– появится один или несколько новых числовых столбцов (зависит от настроек узла)
Сделайте скриншот до и после кодирования gender.
6 Выполните One-Hot Encoding (One to Many)
1 Добавьте узел One to Many
2 В настройках выберите, например, столбец city и contract_type
3 Установите, чтобы для каждой категории создавался отдельный столбец с 0/1
4 Запустите узел, просмотрите таблицу результата
Обратите внимание, как увеличилось количество столбцов. Сделайте скриншот.
7 Работа с порядковым признаком income_level
1 Добавьте узел Rule Engine или String Manipulation + Number To String в нужной комбинации
2 Сконвертируйте income_level в числовой признак, учитывая порядок:
– low → 1
– medium → 2
– high → 3
3 Проверьте, что во всех строках значения корректны
Пример правила для Rule Engine:
income_level = "low" => 1
income_level = "medium" => 2
income_level = "high" => 3
TRUE => 0
8 Сохранение результата
1 Добавьте узел CSV Writer или Table to DB
2 Сохраните закодированную таблицу в CSV-файл или в новую таблицу MySQL, например customers_encoded
4.3 Вариант (по желанию): кодирование в Python
Студенты, у кого установлен Python, могут повторить кодирование в Jupyter Notebook:
1 Импорт библиотек и чтение данных:
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine("mysql+mysqlconnector://user:password@localhost/ml_practice")
df = pd.read_sql("SELECT * FROM customers", con=engine)
print(df.head())
2 Label Encoding для gender (упрощённый вариант):
df['gender_le'] = df['gender'].map({'male': 0, 'female': 1})
3 One-Hot Encoding для city и contract_type:
df_ohe = pd.get_dummies(df, columns=['city', 'contract_type'], prefix=['city', 'contract'])
4 Кодирование порядкового признака income_level:
income_map = {'low': 1, 'medium': 2, 'high': 3}
df_ohe['income_level_ord'] = df_ohe['income_level'].map(income_map)
5 Сохранение результата:
df_ohe.to_csv('customers_encoded.csv', index=False)
Сделать скриншот фрагмента таблицы до и после кодирования.
5 Отчёт по практической работе
Студент должен оформить отчёт в Word, который включает:
1 Тему и цель практической работы
2 Скриншот структуры таблицы customers и нескольких строк данных до кодирования
3 Схему рабочего процесса в KNIME (скриншот workflow)
4 Скриншоты результатов Label Encoding и One-Hot Encoding
5 Краткий сравнительный вывод:
– в каких случаях удобно использовать label encoding
– в каких – one-hot encoding
– что делать с порядковыми признаками
6 Ответы на контрольные вопросы (см. ниже)
Рекомендуемое имя файла отчёта:
Практическая_21_ФИО_группа.docx
6 Контрольные вопросы
1 Что такое категориальный признак? Приведите 3 примера.
2 Чем отличаются номинальные и порядковые категориальные признаки?
3 В чём идея метода Label Encoding? Какой его главный недостаток?
4 В чём суть One-Hot Encoding? Как он влияет на размерность данных?
5 Почему для порядковых признаков (например, «низкий», «средний», «высокий») полезно использовать числовое кодирование с учётом порядка?
6 Какие проблемы могут возникнуть при кодировании признака с очень большим количеством уникальных категорий?
7 В чем опасность target encoding (кодирование на основе целевой переменной)?
Для отправки ответа войдите под аккаунтом студента.