Разработка алгоритма 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по каждому классу.
Загружаем датасет, убеждаемся, что столбцы прочитались с корректными типами и нет критичных пропусков. Дополнительно смотрим первые строки (head()), чтобы визуально проверить диапазоны значений и соответствие признаков описанию.
- Разделяем данные на матрицу признаков
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Обучаем базовую модель k-NN с числом соседей k = 5 на масштабированных признаках. После обучения считаем метрики качества на тестовой выборке.
Результаты (тест): Accuracy ≈ 0.907. Ниже приведены сводные метрики по классам и матрица ошибок.
Интерпретация:
- Метрики Precision/Recall/F1 близки по классам, что говорит о сбалансированном качестве.
- В матрице ошибок малая величина вне диагонали означает немногочисленные ложные классификации.
Для оценки влияния гиперпараметра k проводим перебор значений от 1 до 19. Для каждого k обучаем модель на обучающей части и измеряем точность на тестовой.
- Лучшее значение:
k = 6(точность ≈ 0.94). - Тенденция: при увеличении
kграница решений сглаживается, что может ухудшать качество на данных с локальными структурами.
Замечание по датасету
cat_dog_noisy_300.csv:
при малыхkвозможны признаки локального переобучения к шуму, а при ростеkнаблюдается падение тестовой точности (пересглаживание), что подтверждает описание набора — «чем больше k, тем хуже результат».
Для наглядности признаки стандартизированы и понижены до 2 компонент методом PCA, затем обучен k-NN с найденным k=1.

- Качество. подбор подтвердил оптимум k=6 (≈ 0.94).
- Влияние шума. В
cat_dog_noisy.csvи особенно вcat_dog_noisy_300.csvшум снижает устойчивость k-NN; рост k приводит к пере-сглаживанию и потере качества. - Стандартизация. Существенно улучшает сопоставимость признаков, поэтому обязательна для k-NN.
- 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, так как метрика расстояний чувствительна к масштабу; без масштабирования метрики заметно хуже.
