from flask import Flask, request, render_template import pandas as pd from sklearn.model_selection import train_test_split from sklearn.neural_network import MLPClassifier from sklearn.preprocessing import StandardScaler, LabelEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import make_pipeline # Создание экземпляра Flask app = Flask(__name__) # Загрузка данных из файла data = pd.read_csv("student-mat.csv") # Подготовка данных X = data[["Pstatus", "guardian", "internet", "romantic", "famrel", "freetime", "goout", "Dalc", "Walc", "health", "absences"]] y = data["G3"] # Преобразование категориальных признаков в числовые label_encoders = {} for column in ["Pstatus", "guardian", "internet", "romantic"]: label_encoder = LabelEncoder() X[column] = label_encoder.fit_transform(X[column]) label_encoders[column] = label_encoder # Разделение данных на обучающий и тестовый наборы X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Преобразование данных preprocessor = ColumnTransformer( transformers=[('num', StandardScaler(), X.columns)], remainder='passthrough' ) # Создание модели MLPClassifier mlp_classifier = MLPClassifier( hidden_layer_sizes=(100, 50), # Увеличим количество нейронов и слоев max_iter=1000, random_state=42 ) # Создание конвейера для обработки данных и обучения модели model = make_pipeline(preprocessor, mlp_classifier) # Обучение модели model.fit(X_train, y_train) # Маршрут для отображения HTML-формы @app.route('/', methods=['GET']) def index(): return render_template('index.html') # Маршрут для предсказания оценки @app.route('/predict', methods=['POST']) def predict(): data = request.form.to_dict() # Подготовка данных для предсказания input_data = [data.get(feature, 0) for feature in X.columns] # Преобразование категориальных признаков в числовые с использованием сохраненных LabelEncoder for column, label_encoder in label_encoders.items(): input_data[X.columns.get_loc(column)] = label_encoder.transform([input_data[X.columns.get_loc(column)]]) # Преобразование в DataFrame input_df = pd.DataFrame([input_data], columns=X.columns) # Дополним признаки, если какие-то из них отсутствуют в данных missing_features = set(X.columns) - set(input_df.columns) for feature in missing_features: input_df[feature] = 0 # Сортировка столбцов в том же порядке, что и при обучении модели input_df = input_df[X.columns] # Предсказание с использованием обученной модели prediction = model.predict(input_df)[0] return f"Предсказанная оценка: {prediction}" if __name__ == '__main__': app.run(port=5000)