diff --git a/simonov_nikita_lab_1/lab1-web.py b/simonov_nikita_lab_1/lab1-web.py new file mode 100644 index 0000000..010fafa --- /dev/null +++ b/simonov_nikita_lab_1/lab1-web.py @@ -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) diff --git a/simonov_nikita_lab_1/readme.md b/simonov_nikita_lab_1/readme.md new file mode 100644 index 0000000..82d4e54 --- /dev/null +++ b/simonov_nikita_lab_1/readme.md @@ -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. Модели смогли достичь высокой точности, что может указывать на наличие явных зависимостей между признаками и целевой переменной. + \ No newline at end of file diff --git a/simonov_nikita_lab_1/result/result_1.png b/simonov_nikita_lab_1/result/result_1.png new file mode 100644 index 0000000..e669628 Binary files /dev/null and b/simonov_nikita_lab_1/result/result_1.png differ diff --git a/simonov_nikita_lab_1/result/result_2.png b/simonov_nikita_lab_1/result/result_2.png new file mode 100644 index 0000000..9909e57 Binary files /dev/null and b/simonov_nikita_lab_1/result/result_2.png differ diff --git a/simonov_nikita_lab_1/result/result_3.png b/simonov_nikita_lab_1/result/result_3.png new file mode 100644 index 0000000..797dc0f Binary files /dev/null and b/simonov_nikita_lab_1/result/result_3.png differ diff --git a/simonov_nikita_lab_1/result/result_4.png b/simonov_nikita_lab_1/result/result_4.png new file mode 100644 index 0000000..63238ec Binary files /dev/null and b/simonov_nikita_lab_1/result/result_4.png differ diff --git a/simonov_nikita_lab_1/templates/index.html b/simonov_nikita_lab_1/templates/index.html new file mode 100644 index 0000000..79efad3 --- /dev/null +++ b/simonov_nikita_lab_1/templates/index.html @@ -0,0 +1,43 @@ + + +
+Модель | +Точность | +График | +
---|---|---|
{{ model_name }} | +{{ results['accuracy'] }} | ++ + | +