Merge pull request 'Лабораторная работа 5' (#237) from orlov_artem_lab_5 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/237
This commit is contained in:
commit
d33f917767
74
orlov_artem_lab_5/app.py
Normal file
74
orlov_artem_lab_5/app.py
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
from flask import Flask, render_template, request
|
||||||
|
import pandas as pd
|
||||||
|
from sklearn.model_selection import train_test_split
|
||||||
|
from sklearn.linear_model import Lasso
|
||||||
|
from sklearn.preprocessing import OneHotEncoder
|
||||||
|
from sklearn.compose import ColumnTransformer
|
||||||
|
from sklearn.pipeline import Pipeline
|
||||||
|
from sklearn.metrics import mean_squared_error
|
||||||
|
import joblib
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
# Загрузка данных
|
||||||
|
data = pd.read_csv('top_240_restaurants_recommended_in_los_angeles_2.csv')
|
||||||
|
|
||||||
|
# Выбор нужных столбцов
|
||||||
|
selected_columns = ['Rank', 'StarRating', 'NumberOfReviews', 'Style']
|
||||||
|
data = data[selected_columns]
|
||||||
|
|
||||||
|
# Кодирование столбца Style
|
||||||
|
encoder = OneHotEncoder(sparse=False)
|
||||||
|
encoded_styles = encoder.fit_transform(data[['Style']])
|
||||||
|
encoded_styles_df = pd.DataFrame(encoded_styles, columns=encoder.get_feature_names_out(['Style']))
|
||||||
|
data = pd.concat([data, encoded_styles_df], axis=1).drop('Style', axis=1)
|
||||||
|
|
||||||
|
# Разделение данных
|
||||||
|
X = data.drop('Rank', axis=1)
|
||||||
|
y = data['Rank']
|
||||||
|
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
|
||||||
|
|
||||||
|
# Обучение модели
|
||||||
|
lasso_model = Pipeline([
|
||||||
|
('lasso', Lasso(alpha=0.1))
|
||||||
|
])
|
||||||
|
lasso_model.fit(X_train, y_train)
|
||||||
|
|
||||||
|
# Сохранение модели
|
||||||
|
joblib.dump(lasso_model, 'lasso_model.joblib')
|
||||||
|
|
||||||
|
# Загрузка модели
|
||||||
|
lasso_model = joblib.load('lasso_model.joblib')
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
def index():
|
||||||
|
return render_template('index.html')
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/predict', methods=['POST'])
|
||||||
|
def predict():
|
||||||
|
if request.method == 'POST':
|
||||||
|
# Получение данных из формы
|
||||||
|
input_data = {
|
||||||
|
'StarRating': float(request.form['StarRating']),
|
||||||
|
'NumberOfReviews': int(request.form['NumberOfReviews']),
|
||||||
|
'Style': request.form['Style']
|
||||||
|
}
|
||||||
|
|
||||||
|
# Кодирование стиля
|
||||||
|
input_style_encoded = encoder.transform([[input_data['Style']]])
|
||||||
|
input_data.pop('Style')
|
||||||
|
input_data.update(dict(zip(encoded_styles_df.columns, input_style_encoded[0])))
|
||||||
|
|
||||||
|
# Преобразование данных в DataFrame
|
||||||
|
input_df = pd.DataFrame([input_data])
|
||||||
|
|
||||||
|
# Предсказание
|
||||||
|
prediction = lasso_model.predict(input_df)[0]
|
||||||
|
|
||||||
|
return render_template('index.html', prediction=prediction)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run(debug=True)
|
39
orlov_artem_lab_5/readme.md
Normal file
39
orlov_artem_lab_5/readme.md
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
Общее задание:
|
||||||
|
Использовать регрессию по варианту для данных из курсовой работы, самостоятельно сформулировав задачу.
|
||||||
|
Оценить, насколько хорошо она подходит для решения сформулированной вами задачи.
|
||||||
|
|
||||||
|
Задание по вариантам:
|
||||||
|
Тема: Анализ данных 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
|
||||||
|
|
||||||
|
Задача для регрессии: предсказать рейтинг ресторана по их мировому рейтингу, звездному рейтингу, количеству отзывов и стилю
|
||||||
|
|
||||||
|
Запуск приложения: запуск файла app.py
|
||||||
|
|
||||||
|
Использованные технологии:
|
||||||
|
|
||||||
|
Flask: Веб-фреймворк для создания веб-приложений на Python.
|
||||||
|
Pandas: Библиотека для обработки и анализа данных.
|
||||||
|
Scikit-learn: Библиотека для машинного обучения, в данном случае, используется для реализации алгоритма Лассо-регрессии.
|
||||||
|
Joblib: Используется для сохранения и загрузки модели машинного обучения.
|
||||||
|
|
||||||
|
Описание работы программы:
|
||||||
|
|
||||||
|
Загружаются данные из CSV-файла.
|
||||||
|
Выбираются нужные столбцы, и столбец "Style" кодируется с использованием One-Hot Encoding.
|
||||||
|
Данные разделяются на обучающий и тестовый наборы.
|
||||||
|
Обучается модель Лассо-регрессии.
|
||||||
|
Создается веб-приложение с использованием Flask.
|
||||||
|
HTML-страница содержит форму для ввода данных о ресторане.
|
||||||
|
Пользователь вводит данные (StarRating, NumberOfReviews, Style) и нажимает кнопку "Predict Rating".
|
||||||
|
Введенные данные преобразуются, и модель делает предсказание рейтинга ресторана.
|
||||||
|
Предсказанный рейтинг отображается на странице.
|
||||||
|
|
||||||
|
Пример входных данных:
|
||||||
|
StarRating: 4.3
|
||||||
|
NumberOfReviews: 2000
|
||||||
|
Style: American (New)
|
||||||
|
|
||||||
|
Пример выходных данных:
|
||||||
|
Предсказанный рейтинг: 3.8 (примерное значение, зависит от обученной модели и введенных данных).
|
27
orlov_artem_lab_5/templates/index.html
Normal file
27
orlov_artem_lab_5/templates/index.html
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Restaurant Rating Prediction</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Restaurant Rating Prediction</h1>
|
||||||
|
<form method="post" action="/predict">
|
||||||
|
<label for="StarRating">Star Rating:</label>
|
||||||
|
<input type="number" step="0.1" name="StarRating" required><br>
|
||||||
|
|
||||||
|
<label for="NumberOfReviews">Number of Reviews:</label>
|
||||||
|
<input type="number" name="NumberOfReviews" required><br>
|
||||||
|
|
||||||
|
<label for="Style">Style:</label>
|
||||||
|
<input type="text" name="Style" required><br>
|
||||||
|
|
||||||
|
<button type="submit">Predict Rating</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
{% if prediction %}
|
||||||
|
<p>Predicted Rating: {{ prediction }}</p>
|
||||||
|
{% endif %}
|
||||||
|
</body>
|
||||||
|
</html>
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user