95 lines
3.2 KiB
Python
95 lines
3.2 KiB
Python
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)
|