mashkova_margarita_lab_3 ready

This commit is contained in:
rita 2023-11-22 06:33:50 +04:00
parent a8c58683dd
commit 88f5268b31
8 changed files with 1516 additions and 0 deletions

View File

@ -0,0 +1,88 @@
# Лабораторная работа №3
## ПИбд-42 Машкова Маргарита (Вариант 19)
## Задание
Решить с помощью библиотечной реализации дерева решений на 99% данных задачу:
Выявить зависимость стоимости телефона от других его признаков.
Проверить работу модели на оставшемся проценте, сделать вывод.
### Данные:
> Датасет о характеристиках мобильных телефонов и их ценах
>
> Ссылка на датасет в kaggle: [Mobile Phone Specifications and Prices](https://www.kaggle.com/datasets/pratikgarai/mobile-phone-specifications-and-prices/data)
### Модели:
> - DecisionTreeClassifier
## Запуск программы
Для запуска программы необходимо запустить файл 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)
### Обработка данных
Выведем информацию о данных при помощи функции DataFrame `data.info()`:
![Информация о данных](data_info.png)
Данные не содержат пустых строк. Все значения в столбцах необходимо привести к численным значениям.
Для преобразования полей, содержащих значения Yes/No воспользуемся числовым кодированием `LabelEncoder`.
Значение "Yes" станет равным 1, значение "No" - 0.
Остальные строковых поля будем преобразовывать при помощи векторайзер с суммированием `TfidfVectorizer`.
Данные после обработки:
![Обработанные данные](data_processed.png)
Далее создается Y - массив значений целового признака (цены).
Задача классификации решается дважды: сначала на всех признаках, затем на выявленных четырех важных.
Сначала в X передаются все признаки, выборка разделяется на тестовые (1%) и обучающие данные (99%),
модель дерева решений обучается, отображаются список важности признаков (по убыванию) и оценка модели.
Затем из списка берутся первые 4 признаки и задача решается повторно.
## Тесты
### Результат решения задачи классификации на всех признаках:
![Решение задачи на всех признаках](all_features.png)
### Результат решения задачи классификации на выявленных четырех важных признаках:
![Решение задачи на значимых признаках](important_features.png)
**Вывод:** исходя из полученных результатов, средняя точность работы модели на всех признаках составляет 7%,
т.е. модель работает слишком плохо на данных. При выборе только важных признаков средняя точность падает до 0.
Большое значение среднеквадратичной ошибки подтверждает тот факт, что модель имеет низкое качество.

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -0,0 +1,68 @@
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import mean_squared_error
filename = "mobiles.csv"
# Считываем данные из файла в DataFrame
data = pd.read_csv(filename, sep=',')
# Удаляем столбец с идентификатором
data.pop("Id")
# print(data)
# data.info()
# Приведение строковых значений признаков к численным при помощи векторайзера с суммированием
FEATURE_COLUMNS_TO_PROC = ['Name', 'Brand', 'Model', 'Operating system']
for column_name in FEATURE_COLUMNS_TO_PROC:
vectorizer = TfidfVectorizer()
train_text_feature_matrix = vectorizer.fit_transform(data[column_name]).toarray()
a = pd.DataFrame(train_text_feature_matrix)
data[column_name] = a[a.columns[1:]].apply(lambda x: sum(x.dropna().astype(float)), axis = 1)
# Приведение строковых значений к численным при помощи числового кодирования LabelEncoder
le = LabelEncoder()
data['Touchscreen'] = le.fit_transform(data['Touchscreen'])
data['Wi-Fi'] = le.fit_transform(data['Wi-Fi'])
data['Bluetooth'] = le.fit_transform(data['Bluetooth'])
data['GPS'] = le.fit_transform(data['GPS'])
data['3G'] = le.fit_transform(data['3G'])
data['4G/ LTE'] = le.fit_transform(data['4G/ LTE'])
# Разделение данных на обучающую и тестовую выборки
# В Y помещаем целевой признак - цену
Y = data['Price']
def predict(X):
# Размер обучающей выборки - 99%, тестовой - 1%
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.01, random_state=42)
# Создание и обучение модели DecisionTreeClassifier
dtc = DecisionTreeClassifier(max_depth=5, random_state=241)
dtc.fit(X_train, y_train)
# Создание DataFrame с именами признаков и их важностью
feature_importance_df = pd.DataFrame({'Признак': X_train.columns, 'Важность': dtc.feature_importances_}) \
.sort_values(by='Важность', ascending=False)
print("Важность признаков:")
print(feature_importance_df)
mean_accuracy = dtc.score(X_test, y_test)
y_pred = dtc.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"Среднеквадратичная ошибка: {mse}")
print(f"Средняя точность: {mean_accuracy}")
return feature_importance_df
print("\n***Решение задачи классификации, используя все параметры***")
# В Х помещаем все признаки, кроме цены
X = data.drop(columns='Price')
importance_df = predict(X)
print("\n***Решение задачи классификации, используя только 4 значимых параметра***")
# Выбираем только 4 значимых признака
important_features = importance_df.iloc[:4, 0].tolist()
X_important = data[important_features]
predict(X_important)

File diff suppressed because it is too large Load Diff