Merge pull request 'mashkova_margarita_lab_6 ready' (#200) from mashkova_margarita_lab_6 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/200
This commit is contained in:
commit
3b6af3a31f
91
mashkova_margarita_lab_6/README.md
Normal file
91
mashkova_margarita_lab_6/README.md
Normal file
@ -0,0 +1,91 @@
|
||||
# Лабораторная работа №6
|
||||
## ПИбд-42 Машкова Маргарита (Вариант 19)
|
||||
## Задание
|
||||
C помощью нейронной сети MLPClassifier решить задачу:
|
||||
Предсказать стоимость телефона по всем признакам.
|
||||
Интерпретировать результаты и оценить, насколько хорошо она подходит для решения сформулированной задачи.
|
||||
|
||||
### Данные:
|
||||
> Датасет о характеристиках мобильных телефонов и их ценах
|
||||
>
|
||||
> Ссылка на датасет в kaggle: [Mobile Phone Specifications and Prices](https://www.kaggle.com/datasets/pratikgarai/mobile-phone-specifications-and-prices/data)
|
||||
|
||||
### Модели:
|
||||
|
||||
> - MLPClassifier
|
||||
|
||||
## Запуск программы
|
||||
Для запуска программы необходимо запустить файл 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)
|
||||
|
||||
Первоначально данные обрабатываются: все строковые значения признаков необходимо привести к численным.
|
||||
|
||||
Функция train_test_split делит данные так, что тестовая выборка составляет 1% от исходного набора данных. Разделение происходит случайным образом (т.е. элементы берутся из исходной выборки не последовательно). После чего для выполняются следующие действия:
|
||||
|
||||
1. Создание модели MLPClassifier.
|
||||
2. Обучение модели на исходных данных.
|
||||
3. Предсказание модели на тестовых данных.
|
||||
4. Оценка качества модели:
|
||||
- Коэффициент детерминации: метрика, которая измеряет, насколько хорошо модель соответствует данным.
|
||||
Принимает значения от 0 до 1, где 1 означает идеальное соответствие модели данным, а значения ближе к 0 указывают на то,
|
||||
что модель плохо объясняет вариацию в данных. Для вычисления коэффициента детерминации модели используется метод score
|
||||
библиотеки scikit-learn.
|
||||
|
||||
После чего строится график, отображающий результаты работы модели.
|
||||
Зелёные точки - ожидаемая цена.
|
||||
Красные точки - цена, предсказанная моделью.
|
||||
|
||||
## Тесты
|
||||
### Оценка качества предсказания:
|
||||
|
||||
![Оценка качества предсказания](console.png)
|
||||
|
||||
### Сравнение ожидаемых и фактических результатов предсказания цены телефона:
|
||||
|
||||
#### MLPClassifier:
|
||||
|
||||
![Сравнение ожидаемых и фактических результатов предсказания цены телефона (MLPClassifier)](plot_MLPClassifier.png)
|
||||
|
||||
#### Ridge:
|
||||
|
||||
![Сравнение ожидаемых и фактических результатов предсказания цены телефона (Ridge)](plot_ridge.png)
|
||||
|
||||
**Вывод:** исходя из полученных результатов, средняя точность предсказания модели составляет всего 7%.
|
||||
Тем не менее, если сравнить графики работы моделей нейронной сети MLPClassifier и гребневой регресси (Ridge)
|
||||
из прошлой л/р, то по расстоянию между ожидаемыми и фактическими точками (точность предсказания) можно заметить,
|
||||
что нейронная сеть справляется с этой задачей лучше, т.к. имеет больше пар точек, расстояние между которыми меньше.
|
BIN
mashkova_margarita_lab_6/console.png
Normal file
BIN
mashkova_margarita_lab_6/console.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.8 KiB |
72
mashkova_margarita_lab_6/main.py
Normal file
72
mashkova_margarita_lab_6/main.py
Normal file
@ -0,0 +1,72 @@
|
||||
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.preprocessing import StandardScaler
|
||||
from sklearn.neural_network import MLPClassifier, MLPRegressor
|
||||
from sklearn.metrics import accuracy_score, classification_report
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
filename = "mobiles.csv"
|
||||
# Считываем данные из файла в DataFrame
|
||||
data = pd.read_csv(filename, sep=',')
|
||||
# Удаляем столбец с идентификатором
|
||||
data.pop("Id")
|
||||
|
||||
# Приведение строковых значений признаков к численным при помощи векторайзера с суммированием
|
||||
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']
|
||||
# В X помещаем остальные признаки
|
||||
X = data.drop(columns='Price')
|
||||
|
||||
# Разделение данных на обучающую (99%) и тестовую (1%) выборки
|
||||
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.01, random_state=42)
|
||||
|
||||
# Нормализация признаков
|
||||
scaler = StandardScaler()
|
||||
X_train = scaler.fit_transform(X_train)
|
||||
X_test = scaler.transform(X_test)
|
||||
|
||||
mlp = MLPClassifier(
|
||||
hidden_layer_sizes=(50, 50), # 2 скрытых слоя с 50 нейронами на каждом
|
||||
activation='relu', # функция активации
|
||||
alpha=0.01, # L2 штраф (регуляризация)
|
||||
max_iter=1000, # максимальное кол-во итераций
|
||||
random_state=42, # Random начало для воспроизведения результата
|
||||
verbose=True, # отображения итераций
|
||||
)
|
||||
|
||||
mlp.fit(X_train, y_train)
|
||||
|
||||
# Предсказание на тестовых данных
|
||||
y_pred = mlp.predict(X_test)
|
||||
|
||||
# Оценка производительности модели
|
||||
accuracy = accuracy_score(y_test, y_pred)
|
||||
|
||||
# Вывод результатов
|
||||
print("Оценка работы модели MLPClassifier:")
|
||||
print(f'Accuracy: {accuracy}')
|
||||
|
||||
plt.figure(1, figsize=(12, 7))
|
||||
plt.title('Сравнение ожидаемых и фактических результатов предсказания цены телефона')
|
||||
plt.scatter(x=[i for i in range(len(X_test))], y=y_test, c='green', s=8)
|
||||
plt.scatter(x=[i for i in range(len(X_test))], y=y_pred, c='red', s=8)
|
||||
plt.savefig('plot_MLPClassifier.png')
|
||||
plt.show()
|
1360
mashkova_margarita_lab_6/mobiles.csv
Normal file
1360
mashkova_margarita_lab_6/mobiles.csv
Normal file
File diff suppressed because it is too large
Load Diff
BIN
mashkova_margarita_lab_6/plot_MLPClassifier.png
Normal file
BIN
mashkova_margarita_lab_6/plot_MLPClassifier.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
BIN
mashkova_margarita_lab_6/plot_ridge.png
Normal file
BIN
mashkova_margarita_lab_6/plot_ridge.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
Loading…
Reference in New Issue
Block a user