IIS_2023_1/savenkov_alexander_lab_6/app.py

84 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import pandas as pd
from flask import Flask, render_template, request
from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
app = Flask(__name__)
# Загрузка данных из файлов
games_df = pd.read_csv('games.csv')
open_critic_df = pd.read_csv('open_critic.csv')
# Объединение данных по столбцам id и game_id
merged_df = pd.merge(games_df, open_critic_df, left_on='id', right_on='game_id')
# Проверка и удаление строк с NaN значениями в X и y
merged_df = merged_df.dropna(subset=['genres', 'price', 'release_date', 'rating'])
# Выбор нужных столбцов для обучения
X = merged_df[['genres', 'price', 'release_date']]
y = merged_df['rating']
# Преобразование категориальных признаков в числовые
X = pd.get_dummies(X, columns=['genres'])
# Преобразование даты релиза в числовой формат (в этом примере используется год релиза)
X['release_year'] = pd.to_datetime(X['release_date']).dt.year
X = X.drop(['release_date'], axis=1)
# Разделение данных на обучающий и тестовый набор
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Стандартизация данных
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# Инициализация и обучение MLPRegressor
mlp_regressor = MLPRegressor(hidden_layer_sizes=(100,), max_iter=500, random_state=42)
mlp_regressor.fit(X_train_scaled, y_train)
# Получение точности на тестовых данных
accuracy = mlp_regressor.score(X_test_scaled, y_test) * 100
# Получение стандартного отклонения на тестовых данных
std_deviation = y_test.std()
# Маршрут для отображения HTML-страницы
@app.route('/')
def index():
return render_template('index.html', accuracy=accuracy, std_deviation=std_deviation)
# Маршрут для предсказания рейтинга на основе входных данных
@app.route('/predict', methods=['POST'])
def predict():
data = request.form.to_dict()
# Преобразование входных данных в формат, подходящий для модели
input_data = pd.DataFrame(data, index=[0])
input_data['price'] = int(input_data['price'])
input_data['release_year'] = pd.to_datetime(input_data['releaseDate']).dt.year
input_data = pd.get_dummies(input_data, columns=['genres'])
# Удаление releaseDate, так как она больше не нужна после преобразования
input_data = input_data.drop(['releaseDate'], axis=1)
# Добавление отсутствующих дамми-переменных
missing_cols = set(X.columns) - set(input_data.columns)
for col in missing_cols:
input_data[col] = 0
# Упорядочивание столбцов в нужном порядке
input_data = input_data[X.columns]
input_data_scaled = scaler.transform(input_data)
# Предсказание рейтинга
prediction = mlp_regressor.predict(input_data_scaled)
return render_template('index.html', prediction_result=f'Predicted Rating: {prediction[0]:.2f}')
if __name__ == '__main__':
app.run(debug=True, port=5000)