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)
|