This commit is contained in:
Никита Симонов 2023-11-05 13:31:50 +04:00
parent bbd6aea496
commit d8ea68139d
8 changed files with 256 additions and 0 deletions

View File

@ -0,0 +1,70 @@
from flask import Flask, render_template
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_moons
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from sklearn.metrics import accuracy_score
import io
from flask import Response
import matplotlib
import base64
app = Flask(__name__)
matplotlib.use('Agg')
matplotlib.rcParams['figure.max_open_warning'] = 0
# Создаем данные
moon_dataset = make_moons(noise=0.3, random_state=None)
X, y = moon_dataset
X = StandardScaler().fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)
# Создаем модели
models = {
"Линейная регрессия": LogisticRegression(),
"Полиномиальная регрессия": make_pipeline(PolynomialFeatures(degree=4), LogisticRegression()),
"Гребневая полиномиальная регрессия": make_pipeline(PolynomialFeatures(degree=4), LogisticRegression(penalty='l2', C=1.0))
}
background_color1 = '#CE5A57'
background_color2 = '#78A5A3'
data_color1 = 'red'
data_color2 = 'green'
# Обучаем и оцениваем модели
model_results = {}
for name, model in models.items():
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
model_results[name] = {
'accuracy': accuracy,
'X_test': X_test,
'y_test': y_test,
'model': model
}
@app.route('/')
def index():
plot_images = {}
for model_name, results in model_results.items():
fig, ax = plt.subplots(figsize=(8, 6))
cm_data = ListedColormap([data_color1, data_color2])
scatter = ax.scatter(results['X_test'][:, 0], results['X_test'][:, 1], c=results['model'].predict(results['X_test']), cmap=cm_data, alpha=0.6)
ax.set_xticks(())
ax.set_yticks(())
ax.set_title(model_name)
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
plot_images[model_name] = base64.b64encode(buf.read()).decode('utf-8')
return render_template('index.html', model_results=model_results, plot_images=plot_images)
if __name__ == '__main__':
app.run(threaded=True)

View File

@ -0,0 +1,143 @@
# Лабораторная работа №1. Вариант 4.
## Задание
Сгенерируйте определенный тип данных и
сравните на нем 3 модели (по варианту). Постройте графики, отобразите качество моделей, объясните полученные результаты.
## Содержание
- [Лабораторная работа №1. Вариант 4.](#лабораторная-работа-1-вариант-4)
- [Задание](#задание)
- [Содержание](#содержание)
- [Введение](#введение)
- [Зависимости](#зависимости)
- [Запуск приложения](#запуск-приложения)
- [Описание кода](#описание-кода)
- [Создание данных](#создание-данных)
- [Создание моделей](#создание-моделей)
- [Обучение и оценка моделей](#обучение-и-оценка-моделей)
- [Веб-приложение](#веб-приложение)
- [Использование](#использование)
- [Модели](#модели)
- [Линейная регрессия](#линейная-регрессия)
- [Полиномиальная регрессия](#полиномиальная-регрессия)
- [Гребневая полиномиальная регрессия](#гребневая-полиномиальная-регрессия)
- [Заключение](#заключение)
## Введение
Это Flask-приложение создано для демонстрации работы различных моделей машинного обучения на сгенерированном наборе данных "Лунные данные". Приложение включает в себя веб-страницу, на которой можно посмотреть визуализацию результатов трех моделей (линейная регрессия, полиномиальная регрессия и гребневая полиномиальная регрессия).
## Зависимости
Для работы этого приложения необходимы следующие библиотеки Python:
- Flask
- Matplotlib
- scikit-learn
- NumPy
- io
Вы можете установить их с помощью pip:
```bash
pip install flask matplotlib scikit-learn numpy
```
## Запуск приложения
Чтобы запустить это Flask-приложение, выполните следующую команду:
```bash
python lab1-web.py
```
Приложение будет доступно по адресу `http://localhost:5000` в вашем веб-браузере.
## Описание кода
### Создание данных
Для создания набора данных используется функция `make_moons` из scikit-learn. Данные представляют собой два класса, сгруппированных в форме лун, с добавлением шума. Затем данные нормализуются с использованием `StandardScaler`, и разделяются на обучающий и тестовый наборы данных.
### Создание моделей
В коде определены три модели машинного обучения:
1. Линейная регрессия.
2. Полиномиальная регрессия четвертой степени. Она создается с использованием `PolynomialFeatures` и логистической регрессии.
3. Гребневая полиномиальная регрессия четвертой степени. Она также создается с использованием `PolynomialFeatures`, но с добавлением регуляризации (гребня) в логистической регрессии.
### Обучение и оценка моделей
Модели обучаются на обучающем наборе данных, и их точность оценивается на тестовом наборе данных с использованием метрики `accuracy_score`, показывающей точность моделей. Результаты оценки сохраняются в словаре `model_results`, который содержит информацию о точности модели и тестовых данных.
### Веб-приложение
Приложение реализовано с использованием Flask:
- маршрут: `/` - главная страница, на которой отображаются результаты работы моделей.
## Использование
1. Запустите приложение, как описано выше.
2. Перейдите по адресу `http://localhost:5000` в вашем веб-браузере.
3. На главной странице вы увидите результаты работы всех трех моделей, включая их точность.
## Модели
### Линейная регрессия
Модель создается следующим образом:
```python
"Линейная регрессия": LogisticRegression()
```
Результат в виде графика:
![](/result/result_1.png)
Точность полученной модели получилась равной 0.875
### Полиномиальная регрессия
Код создания модели:
```python
"Полиномиальная регрессия": make_pipeline(PolynomialFeatures(degree=4), LogisticRegression())
```
Результат в виде графика:
![](/result/result_2.png)
Точность полученной модели получилась равной 0.85
### Гребневая полиномиальная регрессия
Код создания модели:
```python
"Гребневая полиномиальная регрессия": make_pipeline(PolynomialFeatures(degree=4), LogisticRegression(penalty='l2', C=1.0))
```
Результат в виде графика:
![](/result/result_3.png)
Точность полученной модели получилась равной 0.85
## Заключение
Все полученные модели:
![](/result/result_4.png)
1. "Линейная регрессия" продемонстрировала самую высокую точность среди всех трех моделей (0.875).
- Это означает, что линейная модель достаточно хорошо справляется с задачей классификации данных.
- Это может быть следствием хорошо структурированных данных.
2. "Полиномиальная регрессия" и "Гребневая полиномиальная регрессия" имеют одинаковую точность (0.85).
- Обе эти модели показали одинаково хорошие результаты и считаются весьма точными для данной задачи.
- Это может свидетельствовать о наличии нелинейных зависимостей в данных, которые успешно извлечены благодаря использованию полиномиальных признаков и гребневой регуляризации.
- В данном контексте различие между "Полиномиальной регрессией" и "Гребневой полиномиальной регрессией" может быть незначительным, так как точность одинакова.
3. Модели смогли достичь высокой точности, что может указывать на наличие явных зависимостей между признаками и целевой переменной.

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

View File

@ -0,0 +1,43 @@
<!DOCTYPE html>
<html>
<head>
<title>Модели классификации</title>
<style>
body {
display: flex;
flex-direction: column;
align-items: center;
color: rgb(241, 228, 228);
background-color: rgb(35, 35, 48);
}
h1 {
text-align: center;
}
table {
width: 60%;
}
td {
text-align: center;
}
</style>
</head>
<body>
<h1>Результаты моделей классификации</h1>
<table>
<tr>
<th style="width: 15%;">Модель</th>
<th style="width: 15%;">Точность</th>
<th>График</th>
</tr>
{% for model_name, results in model_results.items() %}
<tr>
<td>{{ model_name }}</td>
<td>{{ results['accuracy'] }}</td>
<td>
<img src="data:image/png;base64,{{ plot_images[model_name] }}" width="400" height="300">
</td>
</tr>
{% endfor %}
</table>
</body>
</html>