IIS_2023_1/kamyshov_danila_lab_6/app.py
2023-12-06 13:47:44 +04:00

83 lines
3.3 KiB
Python
Raw Permalink 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.

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)