IIS_2023_1/savenkov_alexander_lab_6/app.py

84 lines
3.6 KiB
Python
Raw Normal View History

2023-11-18 19:12:49 +04:00
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)