Merge pull request 'Лабораторная работа 3' (#186) from orlov_artem_lab_3 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/186
This commit is contained in:
commit
0ce6657922
85
orlov_artem_lab_3/app.py
Normal file
85
orlov_artem_lab_3/app.py
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
# app.py
|
||||||
|
|
||||||
|
from flask import Flask, render_template, request
|
||||||
|
import pandas as pd
|
||||||
|
from sklearn.tree import DecisionTreeClassifier
|
||||||
|
from sklearn.model_selection import train_test_split
|
||||||
|
from sklearn.metrics import accuracy_score
|
||||||
|
from sklearn.preprocessing import LabelEncoder
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
# Загрузите данные из файла
|
||||||
|
restaurants_data = pd.read_csv("top_240_restaurants_recommended_in_los_angeles_2.csv")
|
||||||
|
|
||||||
|
# Создайте целевую переменную (успех ресторана)
|
||||||
|
restaurants_data["Success"] = restaurants_data["StarRating"].apply(lambda x: 1 if x > 4 else 0)
|
||||||
|
|
||||||
|
# Преобразуйте столбец "Style" в бинарные признаки (one-hot encoding)
|
||||||
|
styles_encoded = restaurants_data['Style'].str.get_dummies(sep=';')
|
||||||
|
restaurants_data = pd.concat([restaurants_data, styles_encoded], axis=1)
|
||||||
|
|
||||||
|
# Преобразуйте столбец "Address" с использованием Label Encoding
|
||||||
|
address_encoder = LabelEncoder()
|
||||||
|
restaurants_data["AddressEncoded"] = address_encoder.fit_transform(restaurants_data["Address"])
|
||||||
|
|
||||||
|
# Определите признаки и целевую переменную
|
||||||
|
features = ["NumberOfReviews", "AddressEncoded"] + list(styles_encoded.columns)
|
||||||
|
X = restaurants_data[features]
|
||||||
|
y = restaurants_data["Success"]
|
||||||
|
|
||||||
|
# Разделите данные на обучающий и тестовый наборы
|
||||||
|
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.01, random_state=42)
|
||||||
|
|
||||||
|
# Создайте и обучите модель дерева решений
|
||||||
|
model = DecisionTreeClassifier()
|
||||||
|
model.fit(X_train, y_train)
|
||||||
|
|
||||||
|
# Оцените модель на тестовом наборе данных
|
||||||
|
y_pred = model.predict(X_test)
|
||||||
|
accuracy = accuracy_score(y_test, y_pred)
|
||||||
|
|
||||||
|
# Получите важности признаков
|
||||||
|
feature_importances = model.feature_importances_
|
||||||
|
|
||||||
|
@app.route("/", methods=["GET", "POST"])
|
||||||
|
def index():
|
||||||
|
if request.method == "POST":
|
||||||
|
# Получите данные из запроса
|
||||||
|
reviews = int(request.form["reviews"])
|
||||||
|
styles_input = request.form["styles"]
|
||||||
|
address = request.form["address"]
|
||||||
|
|
||||||
|
# Получите бинарные признаки стилей на основе введенных данных
|
||||||
|
styles_encoded_input = pd.DataFrame(styles_input.split(';'), columns=["style"])
|
||||||
|
styles_encoded_input = styles_encoded_input['style'].str.get_dummies()
|
||||||
|
|
||||||
|
# Преобразуйте введенный адрес с использованием Label Encoding
|
||||||
|
address_encoded = address_encoder.transform([address])[0]
|
||||||
|
|
||||||
|
# Создайте пустой DataFrame с теми же признаками, что и X_train
|
||||||
|
input_data = pd.DataFrame(columns=X_train.columns)
|
||||||
|
|
||||||
|
# Заполните введенные данные
|
||||||
|
input_data["NumberOfReviews"] = [reviews]
|
||||||
|
input_data["AddressEncoded"] = [address_encoded]
|
||||||
|
|
||||||
|
# Заполните one-hot закодированные стили
|
||||||
|
for style in styles_encoded_input.columns:
|
||||||
|
input_data[style] = styles_encoded_input[style].values
|
||||||
|
|
||||||
|
# Выполните классификацию ресторана
|
||||||
|
prediction = model.predict(input_data)[0]
|
||||||
|
|
||||||
|
# Определите результат
|
||||||
|
result = "Хороший" if prediction == 1 else "Плохой"
|
||||||
|
|
||||||
|
return render_template("index.html", accuracy=accuracy, good_count=sum(y_test),
|
||||||
|
bad_count=len(y_test) - sum(y_test), feature_importances=feature_importances,
|
||||||
|
prediction_result=result, X=X)
|
||||||
|
|
||||||
|
return render_template("index.html", accuracy=accuracy, good_count=sum(y_test), bad_count=len(y_test) - sum(y_test),
|
||||||
|
feature_importances=feature_importances, X=X)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(host="localhost", port=5000)
|
53
orlov_artem_lab_3/readme.md
Normal file
53
orlov_artem_lab_3/readme.md
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
Общее задание:
|
||||||
|
Решите с помощью библиотечной реализации дерева решений задачу из лабораторной работы «Веб-сервис «Дерево решений» по предмету
|
||||||
|
«Методы искусственного интеллекта» на 99% ваших данных. Проверьте работу модели на оставшемся проценте, сделайте вывод.
|
||||||
|
|
||||||
|
Задание по вариантам:
|
||||||
|
Тема: Анализ данных Top 240 Recommended Restaurants in L.A. 2023
|
||||||
|
Ссылка на датасет:
|
||||||
|
https://www.kaggle.com/datasets/lorentzyeung/top-240-recommended-restaurants-in-la-2023?resource=download&select=top+240+restaurants+recommanded+in+los+angeles+2.csv
|
||||||
|
|
||||||
|
Задача для древа решений: Классификация ресторанов на хорошие и плохие
|
||||||
|
|
||||||
|
Признаки: Address, StarRating, Style, NumberOfReviews
|
||||||
|
|
||||||
|
Целевая переменная: StarRating
|
||||||
|
|
||||||
|
Запуск приложения: запуск файла app.py
|
||||||
|
|
||||||
|
Использованные технологии:
|
||||||
|
Flask: Микрофреймворк для создания веб-приложений на языке Python. В данном коде Flask используется для обработки HTTP-запросов и отображения веб-страниц.
|
||||||
|
|
||||||
|
Pandas: Библиотека для анализа данных, используется для работы с табличными данными. В коде Pandas используется для создания DataFrame и обработки данных.
|
||||||
|
|
||||||
|
Scikit-learn: Библиотека для машинного обучения. В данном коде Scikit-learn используется для обучения модели классификации (RandomForestClassifier) на основе данных о ресторанах.
|
||||||
|
|
||||||
|
HTML и Jinja2: HTML используется для создания структуры веб-страницы, а Jinja2 — для вставки динамических данных в HTML-шаблоны. В коде HTML и Jinja2 используются для отображения формы ввода данных и вывода результата предсказания.
|
||||||
|
|
||||||
|
Numpy: Библиотека для работы с массивами данных. В коде Numpy используется для работы с массивами при вычислении важности признаков.
|
||||||
|
|
||||||
|
RandomForestClassifier: Алгоритм машинного обучения, использующий ансамбль деревьев решений для задач классификации. В данном коде этот классификатор обучается на данных о ресторанах и используется для предсказания, является ли ресторан хорошим или плохим на основе введенных пользователем данных.
|
||||||
|
|
||||||
|
Описание работы программы:
|
||||||
|
Данные о ресторанах загружаются в Pandas DataFrame.
|
||||||
|
|
||||||
|
Создаются бинарные признаки для стилей ресторанов и закодированы адреса.
|
||||||
|
|
||||||
|
Модель RandomForestClassifier обучается на этих данных.
|
||||||
|
|
||||||
|
Flask запускает веб-сервер.
|
||||||
|
|
||||||
|
Пользователь может ввести данные о ресторане через веб-страницу.
|
||||||
|
|
||||||
|
Введенные данные подаются на вход модели, и результат (хороший или плохой ресторан) отображается на веб-странице, а также выводится точность модели.
|
||||||
|
|
||||||
|
Пример входных данных:
|
||||||
|
Данные из файлов "top_240_restaurants_recommended_in_los_angeles_2.csv"
|
||||||
|
Address: 8701 Beverly Blvd West Hollywood, CA 90048
|
||||||
|
Style: American (New), Cocktail Bars
|
||||||
|
NumberOfReviews: 2672
|
||||||
|
|
||||||
|
Пример выходных данных:
|
||||||
|
результат классификации, точность модели, важность признаков.
|
||||||
|
|
||||||
|
Ресторан классифицирован как: Хороший
|
42
orlov_artem_lab_3/templates/index.html
Normal file
42
orlov_artem_lab_3/templates/index.html
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Классификация ресторанов</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Классификация ресторанов</h1>
|
||||||
|
|
||||||
|
<!-- Форма для ввода данных -->
|
||||||
|
<form method="POST">
|
||||||
|
<label for="reviews">Количество отзывов:</label>
|
||||||
|
<input type="text" name="reviews" id="reviews" required>
|
||||||
|
<br>
|
||||||
|
<label for="styles">Стили ресторана:</label>
|
||||||
|
<input type="text" name="styles" id="styles" required>
|
||||||
|
<br>
|
||||||
|
<label for="address">Адрес ресторана:</label>
|
||||||
|
<input type="text" name="address" id="address" required>
|
||||||
|
<br>
|
||||||
|
<button type="submit">Выполнить</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<!-- Результат классификации -->
|
||||||
|
{% if prediction_result %}
|
||||||
|
<h2>Результат классификации:</h2>
|
||||||
|
<p>Ресторан классифицирован как: {{ prediction_result }}</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<!-- Другие результаты (точность, количество хороших и плохих ресторанов, важности признаков) -->
|
||||||
|
<h2>Другие результаты:</h2>
|
||||||
|
<p>Точность модели: {{ "%.4f"|format(accuracy) }}</p>
|
||||||
|
<p>Количество хороших ресторанов: {{ good_count }}</p>
|
||||||
|
<p>Количество плохих ресторанов: {{ bad_count }}</p>
|
||||||
|
<p>Средняя важность признаков:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Стили ресторана: {{ "%.4f"|format(feature_importances[0]) }}</li>
|
||||||
|
<li>Адрес ресторана: {{ "%.4f"|format(feature_importances[1]) }}</li>
|
||||||
|
<li>Количество отзывов: {{ "%.4f"|format(feature_importances[2]) }}</li>
|
||||||
|
</ul>
|
||||||
|
</body>
|
||||||
|
</html>
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user