84 lines
3.6 KiB
Python
84 lines
3.6 KiB
Python
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)
|