IIS_2023_1/savenkov_alexander_lab_2/app.py

95 lines
3.2 KiB
Python
Raw 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
from sklearn.linear_model import LinearRegression
from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
import numpy as np
app = Flask(__name__)
# Генерируем случайные данные
np.random.seed(0)
size = 750
X = np.random.uniform(0, 1, (size, 14))
Y = (10 * np.sin(np.pi * X[:, 0] * X[:, 1]) + 20 * (X[:, 2] - .5) ** 2 +
10 * X[:, 3] + 5 * X[:, 4] ** 5 + np.random.normal(0, 1, size))
X[:, 10:] = X[:, :4] + np.random.normal(0, .025, (size, 4))
# Определяем и обучаем модели
lr = LinearRegression()
rfe = RFE(lr, n_features_to_select=2)
rfe.fit(X, Y)
rf = RandomForestRegressor(n_estimators=100)
rf.fit(X, Y)
# Словарь для хранения результатов оценок
feature_rankings = {}
# Функция для ранжирования признаков с использованием линейной регрессии
def rank_lr():
lr.fit(X, Y)
coef = lr.coef_
ranking = np.abs(coef)
ranking = min_max_scale(ranking)
return ranking
# Функция для ранжирования признаков с использованием RFE
def rank_rfe():
ranking = rfe.ranking_
ranking = min_max_scale(ranking)
return ranking
# Функция для ранжирования признаков с использованием Random Forest
def rank_rf():
importances = rf.feature_importances_
importances = min_max_scale(importances)
return importances
# Функция для масштабирования оценок в диапазоне [0, 1]
def min_max_scale(arr):
scaler = MinMaxScaler()
scaled = scaler.fit_transform(np.array(arr).reshape(-1, 1))
return scaled
# Функция для выполнения ранжирования и вычисления средней оценки
def rank_features():
feature_rankings['Linear Regression'] = rank_lr()
feature_rankings['RFE'] = rank_rfe()
feature_rankings['Random Forest'] = rank_rf()
# Средняя оценка
mean_ranking = np.mean(list(feature_rankings.values()), axis=0)
feature_rankings['Mean Ranking'] = mean_ranking
# Получите индексы 4 самых важных признаков
top_4_indices = np.argsort(mean_ranking)[-4:][::-1]
# Получите названия признаков по индексам
top_4_feature_names = [f'Признак {i + 1}' for i in top_4_indices]
# Добавьте значения X и Y в контекст
return {
'feature_rankings': feature_rankings,
'X_values': X.tolist(),
'Y_values': Y.tolist(),
'top_4_feature_names': top_4_feature_names # Добавляем самые важные признаки
}
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
context = rank_features()
return render_template('index.html', **context)
return render_template('index.html', feature_rankings=feature_rankings)
if __name__ == '__main__':
app.run(debug=True)