mashkova_margarita_lab_5 ready

This commit is contained in:
rita 2023-11-25 03:25:33 +04:00
parent a8c58683dd
commit ff913e6874
5 changed files with 1503 additions and 0 deletions

View File

@ -0,0 +1,87 @@
# Лабораторная работа №5
## ПИбд-42 Машкова Маргарита (Вариант 19)
## Задание
C помощью гребневой регрессии решить задачу:
Предсказать стоимость телефона по всем признакам.
Оценить, насколько хорошо она подходит для решения сформулированной задачи.
### Данные:
> Датасет о характеристиках мобильных телефонов и их ценах
>
> Ссылка на датасет в kaggle: [Mobile Phone Specifications and Prices](https://www.kaggle.com/datasets/pratikgarai/mobile-phone-specifications-and-prices/data)
### Модели:
> - Гребневая регрессия (Ridge)
## Запуск программы
Для запуска программы необходимо запустить файл 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. Создание модели гребневой регрессии.
2. Обучение модели на исходных данных.
3. Предсказание модели на тестовых данных.
4. Оценка качества модели:
- Коэффициент детерминации: метрика, которая измеряет, насколько хорошо модель соответствует данным.
Принимает значения от 0 до 1, где 1 означает идеальное соответствие модели данным,
а значения ближе к 0 указывают на то, что модель плохо объясняет вариацию в данных.
Для вычисления коэффициента детерминации модели используется метод score библиотеки scikit-learn.
После чего строится график, отображающий результаты работы модели.
Зелёные точки - ожидаемая цена.
Красные точки - цена, предсказанная моделью.
## Тесты
### Оценка качества предсказания:
![Оценка качества предсказания](console.png)
### График. Сравнение ожидаемых и фактических результатов предсказания цены телефона:
![Сравнение ожидаемых и фактических результатов предсказания цены телефона](plot.png)
**Вывод:** исходя из полученных результатов, коэффициент детерминации составляет около 83%,
что говорит о том, что модель выше среднего соответствует данным.
На графике видно примерно такую же точность предсказаний.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@ -0,0 +1,56 @@
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.linear_model import Ridge
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)
# Гребневая регрессия
ridge = Ridge(alpha=1.0)
# Обучение модели
ridge.fit(X_train, y_train)
# Предсказание на тестовых данных
y_pred_ridge = ridge.predict(X_test)
# Оценка модели на тестовых данных (коэффициент детерминации)
ridge_score = ridge.score(X_test, y_test)
print("Оценка работы модели гребневой регрессии:")
print("Коэффициент детерминации: %f" % ridge_score)
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_ridge, c='red', s=8)
plt.savefig('plot.png')
plt.show()

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB