86 lines
3.9 KiB
Python
86 lines
3.9 KiB
Python
# 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)
|