Skip to content

HellCatten/pr1

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Интеллектуальные системы и технологии

Практическая работа №1

Разработка алгоритма k близжайших соседей.

Тема — определение домашнего животного — кошты или собаки.


Данные объектов

  • Уровень физической активности (занимаетесь ли вы активно спортом, более 2 часов в неделю) — 0 или 1
  • Количество времени, проводимые в день вне домачасы от 0 до 24
  • Любите ли вы активный отдых0/1
  • Любите ли вы пассивный отдых0/1
  • Часто ли вы путешествуете0/1 (нечасто/часто)
  • Вы экставерт0/1
  • Вы интроверт0/1
  • Вы живете в загородном доме0/1
  • Вы живете в квартире0/1
  • Близко ли к вам есть парк0/1
  • Есть ли у вас дети0/1
  • Хотите ли вы любить0/1
  • Хотите ли вы быть любимым0/1
  • Какие ваши ежемесячные траты на домашнее животноечисло от 0 до 100000
  • Вам комфортный уровень шума дБот 0 до 100
  • Сколько раз в неделю убираетесь в домечисло от 1 до 7

Наборы данных

  • cat_dog.csv — чистые данные. Сгенерированы очень точно, что не показывает никакой ошибки в данных.
  • cat_dog_noisy.csv — есть шумовые данные, когда данные не всегда совпадают с результатом, поэтому присутствует ошибка.
  • cat_dog_noisy_300.csv — шумовые данные на 300 объектов. Показывают переобучение модели (чем больше k, тем хуже результат).

Содержание


Цель работы

Освоить принципы алгоритма k-ближайших соседей на задаче бинарной классификации «кошка/собака»: подготовить данные, обучить модель, подобрать гиперпараметр k, оценить качество и визуализировать границы решений.

Постановка задачи

По вектору описанных выше признаков необходимо предсказать предпочтение питомца: класс cat или dog.

Метод и метрики

  • Модель: KNeighborsClassifier (евклидово расстояние, равные веса соседей).
  • Предобработка: StandardScaler (обязательна для методов, зависящих от расстояний).
  • Разбиение: обучающая/тестовая = 80/20 со стратификацией.
  • Подбор гиперпараметра: перебор k ∈ {1,…,19}.
  • Метрики: Accuracy, Precision, Recall, F1 по каждому классу.

Ход эксперимента

4.1 Загрузка и первичный анализ

Загружаем датасет, убеждаемся, что столбцы прочитались с корректными типами и нет критичных пропусков. Дополнительно смотрим первые строки (head()), чтобы визуально проверить диапазоны значений и соответствие признаков описанию.

4.2 Подготовка данных

  • Разделяем данные на матрицу признаков X и целевую переменную y.
  • Для удобства визуализаций используем кодирование меток: {'cat': 0, 'dog': 1} (сам классификатор может работать и со строковыми метками).
  • Выполняем разбиение на обучающую и тестовую части: 80/20, random_state=42, stratify=y (стратификация сохраняет доли классов).
  • Масштабируем признаки с помощью написанного Z-нормализации
# --- ручная z-нормализация (fit на train, transform на train/test) ---
def zscore_fit(X_train):
    means = X_train.mean(axis=0) # mean - среднее значение из списка
    stds = X_train.std(axis=0, ddof=0) # стандартное отклонение 
    stds[stds == 0] = 1.0  # защита от деления на ноль
    return means, stds

4.3 Базовая модель (k=5)

Обучаем базовую модель k-NN с числом соседей k = 5 на масштабированных признаках. После обучения считаем метрики качества на тестовой выборке.

Результаты (тест): Accuracy ≈ 0.907. Ниже приведены сводные метрики по классам и матрица ошибок.
Интерпретация:

  • Метрики Precision/Recall/F1 близки по классам, что говорит о сбалансированном качестве.
  • В матрице ошибок малая величина вне диагонали означает немногочисленные ложные классификации.

Рисунок 1

4.4 Поиск оптимального k

Для оценки влияния гиперпараметра k проводим перебор значений от 1 до 19. Для каждого k обучаем модель на обучающей части и измеряем точность на тестовой.

  • Лучшее значение: k = 6 (точность ≈ 0.94).
  • Тенденция: при увеличении k граница решений сглаживается, что может ухудшать качество на данных с локальными структурами.

Замечание по датасету cat_dog_noisy_300.csv:
при малых k возможны признаки локального переобучения к шуму, а при росте k наблюдается падение тестовой точности (пересглаживание), что подтверждает описание набора — «чем больше k, тем хуже результат».

4.5 Визуализация границ решений (PCA→2D)

Для наглядности признаки стандартизированы и понижены до 2 компонент методом PCA, затем обучен k-NN с найденным k=1.
Код PCA-визуализации


Результаты

  1. Качество. подбор подтвердил оптимум k=6 (≈ 0.94).
  2. Влияние шума. В cat_dog_noisy.csv и особенно в cat_dog_noisy_300.csv шум снижает устойчивость k-NN; рост k приводит к пере-сглаживанию и потере качества.
  3. Стандартизация. Существенно улучшает сопоставимость признаков, поэтому обязательна для k-NN.
  4. PCA-визуализация. На 2D-проекции видны локально разделимые кластеры, что объясняет высокую точность при малых k.

Выводы

  • Алгоритм k-NN подходит для задачи «кошка/собака». На тесте получена точность порядка 0.97 при стандартизации признаков (на наборе cat_dog_noisy_300.csv), что подтверждает применимость метода к данным данного типа.
  • Оптимальное число соседей — k = 1. Перебор k ∈ [1; 19] показал максимум качества при k=1; при k=5 метрики сопоставимы, но слегка ниже.
  • Шум ухудшает устойчивость. На «чистом» cat_dog.csv качество наивысшее; добавление шума (cat_dog_noisy.csv, cat_dog_noisy_300.csv) снижает стабильность предсказаний и повышает чувствительность к выбору k.
  • Эффект переобучения/пересглаживания. Для cat_dog_noisy_300.csv при малых k границы решений становятся «рваными» (риски переобучения к шуму), а при росте k наблюдается падение качества из-за пересглаживания — модель теряет локальные различия классов (чем больше k, тем хуже результат).
  • Стандартизация признаков обязательна для k-NN, так как метрика расстояний чувствительна к масштабу; без масштабирования метрики заметно хуже.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published