Кафедра ИСиТ УО ВГТУ
  • Специальности
    • Экономика электронного бизнеса
    • Информационные системы
    • Information Control Systems
  • Каталог
  • Сайт кафедры
  • Сервисы
    • GitLab
    • JupyterHub
    • Soft
  1. ИСиТ
  2. РиОИИС
  3. Практика
  4. Лаб. работа “Предобработка данных”
  • ИСиТ
    • АОС
      • Теория
        • Введение в операционные системы
        • Управление памятью
        • Управление процессами
        • Система ввода-вывода
        • Информационная безопасность
        • Виртуализация
      • Практика
    • РВПсИПП
      • Теория
        • Настройка среды разработки для PHP
        • Введение в PHP
        • Работа с базами данных в PHP
        • Объектно-ориентированные возможности PHP
        • Разработка web-приложений на базе фреймворков
        • Основы Laravel
        • Шаблоны в Laravel
        • Модели и базы данных в Laravel
        • Формы и валидация в Laravel
        • Аутентификация и авторизация в Laravel
        • Создание REST API в Laravel
        • Работа с файлами и изображениями в Laravel
        • Тестирование и отладка в Laravel
        • Введение в фреймворк Symfony
        • Маршруты и контроллеры в Symfony
        • Шаблоны и Twig в Symfony
        • Формы и валидация в Symfony
        • Доступ к базам данных в Symfony
        • Аутентификация и авторизация в Symfony
        • Сервисы и зависимости в Symfony
        • Создание REST API в Symfony
        • Работа с файлами и медиа в Symfony
        • Сравнение и выбор фреймворка
        • Развертывание веб-приложения
      • Практика
        • Регистрация в JupyterHub
        • Лаб. работа “Основы PHP”
        • Лаб. работа “Массивы в PHP”
        • Лаб. работа “Создание веб-приложений с использованием Slim”
        • Лаб. работа 1 “Создание нового приложения Laravel”
        • Лаб. работа 2 “Добавление главной страницы и базовых маршрутов”
        • Лаб. работа 3 “Создание моделей, миграций и сидеров”
        • Лаб. работа 4 “Создание индексных страниц и пагинация”
        • Лаб. работа 5 “Создание форм для работы с сущностями”
        • Лаб. работа 6 “Работа с файлами (эмуляция S3-хранилища)”
        • Лаб. работа “Создание маршрутов в Laravel”
        • Лаб. работа “Работа с базами данных в Laravel”
        • Лаб. работа “Работа с формами в Laravel”
        • Лаб. работа “Аутентификация и авторизация в Laravel”
        • Лаб. работа “Работа с файлами в Laravel”
        • Лаб. работа “Тестирование и оптимизация в Laravel”
        • Лаб. работа “Создание REST API в Laravel”
        • Лаб. работа “Основы Symfony”
        • Лаб. работа “Шаблоны и представления в Symfony”
        • Лаб. работа “Работа с базами данных в Symfony”
        • Лаб. работа “Формы и аутентификация в Symfony”
        • Лаб. работа “Сервисы и зависимости в Symfony”
        • Лаб. работа “REST API в Symfony”
        • Лаб. работа “Работа с медиа контентом в Symfony”
        • Лаб. работа “Создание и развертывание проекта”
        • Расчетно-графическая работа: Разработка веб-приложения с использованием Laravel
          • Методические рекомендации по выполнению работы
          • Варианты заданий для расчетно-графической работы
    • ПСП
      • Теория
        • Введение
        • Протокол HTTP
        • Программирование с использованием сокетов
      • Практика
        • Программное обеспечение
        • Лаб. работа “Почтовые протоколы”
        • Лаб. работа “Протокол FTP”
        • Лаб. работа “Протокол HTTP”
        • Лаб. работа “Программирование сетевых приложений с использованием сокетов”
      • Темы курсовых проектов по дисциплине “Программирование сетевых приложений”
    • Компьютерные сети
      • Теория
        • Введение в компьютерные сети
        • Топологии сетей
        • Кодирование и мультиплексирование
        • Стеки протоколов
        • Адресация в компьютерных сетях
        • Система доменных имен (DNS)
        • Программирование с использованием сокетов
        • Введение в PHP
        • Протокол HTTP
        • Введение в компьютерные сети
      • Практика
        • Программное обеспечение
        • Регистрация в JupyterHub
        • Лаб. работа “Почтовые протоколы”
        • Лаб. работа “Протокол FTP”
        • Лаб. работа “Протокол HTTP”
        • Лаб. работа “Программирование сетевых приложений с использованием сокетов”
        • Лаб. работа “Основы PHP”
        • Лаб работа “Массивы в PHP”
    • РиОИИС
      • Теория
        • Классификация оптимизационных задач
        • Генетические алгоритмы
        • Системы массового обслуживания
        • Теория игр
        • Машинное обучение
        • Глубокое обучение (Deep learning)
        • Основы функционального программирования
        • Основы программирования на Haskell
        • Введение в логическое программирование
        • Инференция и рассуждения в логическом программировании
        • Разработка экспертных систем
        • Интеллектуальные системы и их архитектура
        • Веб-скрэйпинг
        • Сбор данных с открытых API
      • Практика
        • JupyterHub
        • Лаб. работа "Методы одномерной оптимизации"
          • Лаб. работа “Методы одномерной оптимизации”
        • Лаб. работа “Методы многомерной оптимизации”
        • Лаб. работа “Основы программирования на Python”
        • Лаб. работа “Функции в Python”
        • Лаб. работа “Рекурсия в Python”
        • Лаб. работа “Итераторы в Python”
        • Лаб. работа “Генетические алгоритмы”
        • Лаб. работа “Haskell”
        • Лаб. работа “Логическое программирование”
        • Лаб. работа “Сбор данных с помощью веб-скрейпинга”
        • Лаб. работа “Предобработка данных”
        • Лаб. работа “Машинное обучение: классификация”
        • Лаб. работа “Создание и обучение простейших нейронных сетей”
        • Лаб. работа “Системы массового обслуживания”
        • Лаб. работа “Обработка естественного языка”
        • Лаб. работа “Компьютерное зрение”
        • Лаб. работа “Нейросети и глубокое обучение”
    • КСКР
      • Практика
        • Лаб. работа “Одномерные и двумерные массивы в C#”
        • Лаб. работа “Обращение матриц в C#”
    • Системное программирование
      • Теория
        • Управление памятью в Windows
        • Файловые операции в Windows
        • Управление процессами в Windows
        • Графический интерфейс Windows
        • ОС Unix
      • Практика
        • Лаб. работа “Работа с динамической памятью в Windows”
        • Лаб. работа “Операции с файлами в Windows”
        • Лаб. работа “Управление процессами в Windows”
        • Лаб. работа “Работа с виртуальной машиной Linux”
        • Лаб. работа “Язык командного энтерпритатора Shell”
        • Лаб. работа “Работа с файлами в Linux”
        • Лаб. работа “Работа с процессами в Linux”
    • ИППРПО
      • Теория
      • Практика
        • Лаб. работа “Язык командного энтерпритатора Shell”
        • Лаб. работа “Управление процессами в Shell”
        • Лаб. работа “Управление файловой системой в Shell”
        • Лаб. работа “Управление пакетами в ОС Linux”
        • Лаб. работа “Сетевые инструменты в Linux”
        • Лаб. работа “Мониторинг и анализ системы Linux”
        • Лаб. работа “Основы Docker. Управление контейнерами”
        • Лаб. работа “Docker: Сети”
        • Лаб. работа "Docker: Образы"
        • Лаб. работа “Docker Compose: Управление многоконтейнерными приложениями”
        • Лаб. работа “CI/CD с GitLab”

Содержание

  • Лабораторная работа: Методы предобработки данных в интеллектуальных системах
    • Цель работы
    • Краткие теоретические сведения
    • Порядок выполнения работы
    • Задания для самостоятельной работы
    • Требования к отчету
    • Контрольные вопросы
  1. ИСиТ
  2. РиОИИС
  3. Практика
  4. Лаб. работа “Предобработка данных”

Лаб. работа “Предобработка данных”

Разработка и оптимизация интеллектуальных информационных систем
Практика
Автор

Бизюк Андрей

Дата публикации

24 сентября 2025 г.

Лабораторная работа: Методы предобработки данных в интеллектуальных системах

Цель работы

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

Краткие теоретические сведения

Предобработка данных (Data Preprocessing) — это этап подготовки “сырых” данных к анализу и построению моделей. Качество данных напрямую влияет на производительность и точность интеллектуальных систем. Основные задачи предобработки включают:

  1. Обработка пропущенных значений: Данные могут отсутствовать по разным причинам. Основные стратегии:

    • Удаление: Удаление строк или столбцов с пропусками. Целесообразно, если пропусков мало или столбец неинформативен.
    • Заполнение (Imputation): Замена пропусков некоторым значением:
      • Среднее (mean): Для числовых признаков без сильных выбросов.
      • Медиана (median): Для числовых признаков с выбросами, так как медиана более устойчива к ним.
      • Мода (mode): Для категориальных признаков (заполнение наиболее часто встречающимся значением).
      • Константа: Заполнение нулем, строкой “unknown” и т.д.
  2. Кодирование категориальных признаков: Большинство моделей машинного обучения работают с числами, поэтому текстовые категории нужно преобразовать.

    • Label Encoding (Порядковое кодирование): Каждой уникальной категории присваивается целое число (0, 1, 2…). Подходит для порядковых признаков, где есть естественная иерархия (например, “плохо”, “хорошо”, “отлично”).
    • One-Hot Encoding (Прямое кодирование): Для каждой категории создается новый бинарный столбец (0 или 1). Подходит для номинальных признаков, где нет порядка (например, “красный”, “зеленый”, “синий”).
    Исходный признак Label Encoding One-Hot Encoding (color_red, color_green)
    red 0 1, 0
    green 1 0, 1
    red 0 1, 0
  3. Масштабирование числовых признаков: Признаки с разными диапазонами значений (например, возраст от 0 до 100 и доход от 20 000 до 200 000) могут некорректно влиять на модели, основанные на расстоянии (kNN, SVM) или градиентном спуске.

    • Стандартизация (Standardization): Приводит данные к распределению со средним \(0\) и стандартным отклонением \(1\). \[ Z = \frac{x - \mu}{\sigma} \] где \(\mu\) — среднее значение, \(\sigma\) — стандартное отклонение.
    • Нормализация (Normalization): Масштабирует данные в заданный диапазон, обычно \([0, 1]\). \[ X_{norm} = \frac{x - x_{min}}{x_{max} - x_{min}} \] где \(x_{min}\) и \(x_{max}\) — минимальное и максимальное значения признака.
  4. Обработка выбросов (Outliers): Выбросы — это значения, которые сильно отличаются от основной массы данных. Они могут искажать результаты обучения. Один из популярных методов их обнаружения — метод межквартильного размаха (IQR). Выбросами считаются значения, выходящие за пределы:

    • Нижняя граница: \(Q_1 - 1.5 \times IQR\)
    • Верхняя граница: \(Q_3 + 1.5 \times IQR\) где \(Q_1\) — первый квартиль (25-й перцентиль), \(Q_3\) — третий квартиль (75-й перцентиль), \(IQR = Q_3 - Q_1\).

Порядок выполнения работы

Работа выполняется в среде Python с использованием библиотек pandas, numpy, scikit-learn и matplotlib/seaborn.

  1. Подготовка окружения. Установите необходимые библиотеки, если они отсутствуют:

    pip install pandas numpy scikit-learn matplotlib seaborn
  2. Загрузка и первичное исследование данных. Мы будем использовать классический набор данных “Титаник”, который содержит пропуски, категориальные и числовые признаки.

    import pandas as pd
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    # Загружаем датасет из библиотеки seaborn
    df = sns.load_dataset('titanic')
    
    # Выводим общую информацию о датасете
    print("Информация о датасете:")
    df.info()
    
    # Выводим первые 5 строк
    print("\nПервые 5 строк датасета:")
    print(df.head())
    
    # Статистика по числовым признакам
    print("\nСтатистика по числовым признакам:")
    print(df.describe())
  3. Обработка пропущенных значений. Найдем столбцы с пропущенными значениями.

    print("\nКоличество пропусков в каждом столбце:")
    print(df.isnull().sum())
    • age (возраст): Заполним пропуски медианным значением, так как распределение возраста может быть скошенным.
    • embarked (порт посадки): Это категориальный признак. Заполним пропуски модой.
    • deck (палуба): Слишком много пропусков. Этот столбец проще удалить.
    • embark_town: Дублирует информацию embarked, его тоже можно удалить.
    # Заполнение 'age' медианой
    median_age = df['age'].median()
    df['age'].fillna(median_age, inplace=True)
    
    # Заполнение 'embarked' модой
    mode_embarked = df['embarked'].mode()[0]
    df['embarked'].fillna(mode_embarked, inplace=True)
    
    # Удаление столбцов
    df.drop(['deck', 'embark_town'], axis=1, inplace=True)
    
    # Проверяем, что пропусков не осталось (кроме 'age' и 'embarked')
    print("\nКоличество пропусков после обработки:")
    print(df.isnull().sum())
  4. Кодирование категориальных признаков. Преобразуем столбцы sex, embarked, class, who, adult_male, alive, alone. Для примера используем One-Hot Encoding для sex и embarked.

    # Применение One-Hot Encoding к 'sex' и 'embarked'
    df_processed = pd.get_dummies(df, columns=['sex', 'embarked'], drop_first=True)
    
    # Удалим и другие некатегориальные, но не числовые столбцы для упрощения
    # Или те, что не несут пользы для гипотетической модели
    df_processed.drop(['pclass', 'who', 'adult_male', 'class', 'alive', 'alone'], axis=1, inplace=True)
    
    
    print("\nДатасет после One-Hot Encoding:")
    print(df_processed.head())

    drop_first=True используется для удаления одного из новых столбцов, чтобы избежать мультиколлинеарности (избыточности).

  5. Масштабирование числовых признаков. Применим стандартизацию к признакам age и fare.

    from sklearn.preprocessing import StandardScaler
    
    scaler = StandardScaler()
    # Выбираем столбцы для масштабирования
    cols_to_scale = ['age', 'fare']
    df_processed[cols_to_scale] = scaler.fit_transform(df_processed[cols_to_scale])
    
    print("\nДатасет после масштабирования 'age' и 'fare':")
    print(df_processed.head())
  6. Работа с выбросами (на примере fare). Визуализируем признак fare до и после обработки выбросов.

    plt.figure(figsize=(10, 4))
    plt.subplot(1, 2, 1)
    sns.boxplot(y=df_processed['fare'])
    plt.title('Boxplot для Fare (до обработки выбросов)')
    
    # Расчет IQR для 'fare'
    Q1 = df_processed['fare'].quantile(0.25)
    Q3 = df_processed['fare'].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    
    # Ограничение выбросов (Capping)
    df_processed['fare'] = np.where(df_processed['fare'] > upper_bound, upper_bound, df_processed['fare'])
    df_processed['fare'] = np.where(df_processed['fare'] < lower_bound, lower_bound, df_processed['fare'])
    
    plt.subplot(1, 2, 2)
    sns.boxplot(y=df_processed['fare'])
    plt.title('Boxplot для Fare (после обработки выбросов)')
    plt.tight_layout()
    plt.show()
    
    print("\nФинальный вид обработанного датасета:")
    print(df_processed.head())

Задания для самостоятельной работы

Задание 1

  1. Повторить все шаги, описанные в разделе “Порядок выполнения работы”.
  2. В отчете подробно описать каждый шаг, приложить фрагменты кода и результаты его выполнения (вывод info, head, describe, графики).
  3. В заключении ответить на вопрос: почему для заполнения age была выбрана медиана, а не среднее?

Задание 2

  1. Загрузить датасет “Титаник”.
  2. Для обработки пропусков в столбце age использовать среднее значение.
  3. Для кодирования признака sex применить Label Encoding вместо One-Hot Encoding.
  4. Масштабировать признаки age и fare с помощью нормализации (MinMaxScaler).
  5. Сравнить статистические показатели (describe()) датасета до и после масштабирования.
  6. В заключении проанализировать, в каких случаях применение Label Encoding для признака sex может быть некорректным.

Задание 3

  1. Загрузить датасет “Титаник”.
  2. Столбец age с пропусками не заполнять, а удалить все строки, где возраст не указан. Сравнить размер датасета до и после удаления.
  3. Категориальные признаки sex и embarked закодировать с помощью One-Hot Encoding.
  4. Выполнить стандартизацию для признака fare.
  5. Найти и удалить выбросы в признаке fare по методу IQR (удалить строки, а не ограничить значения).
  6. В заключении оценить, какой подход к обработке пропусков в age (удаление строк или заполнение медианой) привел к большей потере данных.

Требования к отчету

Отчет по лабораторной работе должен содержать:

  1. Цель работы.

  2. Постановка задачи в соответствии с вариантом.

  3. Ход работы: последовательное описание выполненных шагов с приведением ключевых фрагментов кода, скриншотов и/или таблиц с результатами (например, вывод .info(), .describe(), .head()).

  4. Графики и их анализ (например, boxplot для выбросов).

  5. Выводы по работе, включающие ответы на вопросы из задания по варианту и общую оценку проделанной работы.

Контрольные вопросы

  1. Зачем нужна предобработка данных? Какие проблемы она решает?
  2. В чем разница между заполнением пропусков средним, медианой и модой? Когда какой метод предпочтительнее?
  3. Объясните разницу между стандартизацией и нормализацией. Для каких алгоритмов масштабирование признаков критически важно?
  4. В чем принципиальное отличие One-Hot Encoding от Label Encoding? Приведите примеры признаков, для которых подходит каждый из этих методов.
  5. Что такое выбросы и какими методами их можно обнаружить и обработать?
Наверх
Лаб. работа “Сбор данных с помощью веб-скрейпинга”
Лаб. работа “Машинное обучение: классификация”