IIS_2023_1/mashkova_margarita_lab_4/README.md

108 lines
8.8 KiB
Markdown
Raw Normal View History

2023-11-25 02:03:47 +04:00
# Лабораторная работа №4
## ПИбд-42 Машкова Маргарита (Вариант 19)
## Задание
C помощью метод кластеризации DBSCAN решить задачу:
Сгруппировать телефоны по объему аккумулятора, размеру экрана, RAM и прочим показателям.
Интерпретировать результаты и оценить, насколько хорошо он подходит для решения сформулированной задачи.
### Данные:
> Датасет о характеристиках мобильных телефонов и их ценах
>
> Ссылка на датасет в kaggle: [Mobile Phone Specifications and Prices](https://www.kaggle.com/datasets/pratikgarai/mobile-phone-specifications-and-prices/data)
### Модели:
> - DBSCAN
> **Note**
>
> Метод DBSCAN позволяет получить оптимальное разбиение точек на оптимальное количество кластеров,
а также выявить атипичные объекты (шум). Оценивается при помощи метрики `Силуэт (Silhouette Score)` - насколько
плотно объекты прилегают к центру кластера. Данная метрика оценивает качество кластеризации путем
измерения среднего значения силуэта для каждой точки данных.
Значение Silhouette Score находится в диапазоне от -1 до 1, где ближе к 1 означает лучшую кластеризацию.
Высокое значение Silhouette Score указывает на хорошую разделимость кластеров,
а низкое значение может указывать на перекрывающиеся кластеры.
## Запуск программы
Для запуска программы необходимо запустить файл main.py
## Используемые технологии
> **Язык программирования:** python
>
> **Библиотеки:**
> - `pandas` - предоставляет функциональность для обработки и анализа набора данных.
> - `sklearn` - предоставляет широкий спектр инструментов для машинного обучения, статистики и анализа данных.
## Описание работы программы
### Описание набора данных
Данный набор содержит характеристики различных телефонов, в том числе их цену.
Названия столбцов набора данных и их описание:
- **Id** - идентификатор строки (int)
- **Name** - наименование телефона (string)
- **Brand** - наименование бренда телефона (string)
- **Model** - модель телефона (string)
- **Battery capacity (mAh)** - емкость аккумулятора в мАч (int)
- **Screen size (inches)** - размер экрана в дюймах по противоположным углам (float)
- **Touchscreen** - имеет телефон сенсорный экран или нет (string - Yes/No)
- **Resolution x** - разрешение телефона по ширине экрана (int)
- **Resolution y** - разрешение телефона по высоте экрана (int)
- **Processor** - количество ядер процессора (int)
- **RAM (MB)** - доступная оперативная память телефона в МБ (int)
- **Internal storage (GB)** - внутренняя память телефона в ГБ (float)
- **Rear camera** - разрешение задней камеры в МП (0, если недоступно) (float)
- **Front camera** - разрешение фронтальной камеры в МП (0, если недоступно) (float)
- **Operating system** - ОС, используемая в телефоне (string)
- **Wi-Fi** - имеет ли телефон функция Wi-Fi (string - Yes/No)
- **Bluetooth** - имеет ли телефон функцию Bluetooth (string - Yes/No)
- **GPS** - имеет ли телефон функцию GPS (string - Yes/No)
- **Number of SIMs** - количество слотов для SIM-карт в телефоне (int)
- **3G** - имеет ли телефон сетевую функкцию 3G (string - Yes/No)
- **4G/ LTE** - имеет ли телефон сетевую функкцию 4G/LTE (string - Yes/No)
- **Price** - цена телефона в индийских рупиях (int)
Первоначально данные обрабатываются: все строковые значения признаков необходимо привести к численным.
Метод не требует предварительных предположений о числе кластеров,
но нужно настроить два других параметра: `eps` и `min_samples`.
Данные параметры это соответственно максимальное расстояние между соседними точками и минимальное число точек
в окрестности (количество соседей), когда можно говорить, что эти экземпляры данных образуют один кластер.
Далее выполняется два этапа предобработки данных:
1. Масшатабирование: Создается экземпляр класса `StandardScaler()`.
Метод `fit_transform(data)` этого класса применяется к данным, чтобы выполнить масштабирование.
Результат масштабирования сохраняется в переменной `X_scaled`.
2. Нормализация: Метод `normalize(X_scaled)` применяется к масштабированным данным `X_scaled`, чтобы выполнить нормализацию.
Результат нормализации сохраняется в переменной `X_normalized`.
Затем выполняется анализ главных компонент (PCA) на нормализованных данных и преобразование их в двумерное пространство.
Это позволяет снизить размерность данных и выделить наиболее информативные признаки.
Результат преобразования сохраняется в переменной `X_principal`.
Создается и обучается модель `dbscan` на нормализованных и масштабированных данных.
На основе всех признаков данные разбиваются на кластеры. В поле `labels` в алгоритме DBSCAN хранятся метки кластеров,
к которым были присвоены точки данных.
Каждая точка данных будет иметь свою метку, указывающую на принадлежность к определенному кластеру или на то,
что она не принадлежит ни одному кластеру и считается выбросом (кластер `-1`).
Вычисляется и выводятся в консоль количество кластеров и шумовых точек.
Качество кластеризации оценивается с помощью `silhouette_score` и выводится в консоль.
Отображается график кластеризации.
## Тесты
### Получившиеся кластеры и оценка качества кластеризации:
![Получившиеся кластеры](clusters.png)
### График кластеризации:
![График кластеризации](dbscan_plot.png)
Шумовые точки изображены фиолетовым цветом.
**Вывод:** исходя из полученных результатов, значение метрики "силуэт" составляет всего 2%, что указывает на низкое
качество кластеризации и перекрывающиеся кластеры. Метод кластеризации `DBSCAN` плохо работает на этих данных.