mashkova_margarita_lab_3 ready
This commit is contained in:
parent
a8c58683dd
commit
88f5268b31
88
mashkova_margarita_lab_3/README.md
Normal file
88
mashkova_margarita_lab_3/README.md
Normal 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.
|
||||
Большое значение среднеквадратичной ошибки подтверждает тот факт, что модель имеет низкое качество.
|
BIN
mashkova_margarita_lab_3/all_features.png
Normal file
BIN
mashkova_margarita_lab_3/all_features.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 50 KiB |
BIN
mashkova_margarita_lab_3/data_info.png
Normal file
BIN
mashkova_margarita_lab_3/data_info.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 62 KiB |
BIN
mashkova_margarita_lab_3/data_info_processed.png
Normal file
BIN
mashkova_margarita_lab_3/data_info_processed.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 61 KiB |
BIN
mashkova_margarita_lab_3/data_processed.png
Normal file
BIN
mashkova_margarita_lab_3/data_processed.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
BIN
mashkova_margarita_lab_3/important_features.png
Normal file
BIN
mashkova_margarita_lab_3/important_features.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
68
mashkova_margarita_lab_3/main.py
Normal file
68
mashkova_margarita_lab_3/main.py
Normal 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)
|
1360
mashkova_margarita_lab_3/mobiles.csv
Normal file
1360
mashkova_margarita_lab_3/mobiles.csv
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user