83 lines
3.3 KiB
Python
83 lines
3.3 KiB
Python
|
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)
|