From 315140b77c0424a2048739fa17224019b13b24ed Mon Sep 17 00:00:00 2001 From: Danila Kamyshov Date: Wed, 6 Dec 2023 13:42:18 +0400 Subject: [PATCH] kamyshov_danila_lab_2 is done --- kamyshov_danila_lab_2/app.py | 96 ++++++++++++++++++++++ kamyshov_danila_lab_2/readme.md | 27 ++++++ kamyshov_danila_lab_2/templates/index.html | 51 ++++++++++++ 3 files changed, 174 insertions(+) create mode 100644 kamyshov_danila_lab_2/app.py create mode 100644 kamyshov_danila_lab_2/readme.md create mode 100644 kamyshov_danila_lab_2/templates/index.html diff --git a/kamyshov_danila_lab_2/app.py b/kamyshov_danila_lab_2/app.py new file mode 100644 index 0000000..044b549 --- /dev/null +++ b/kamyshov_danila_lab_2/app.py @@ -0,0 +1,96 @@ +from flask import Flask, request, render_template +from sklearn.linear_model import LinearRegression +from sklearn.feature_selection import RFE, f_regression +from sklearn.ensemble import RandomForestRegressor +from sklearn.preprocessing import MinMaxScaler +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() + +# Используем f_regression вместо RFE для линейной корреляции +f_values, _ = f_regression(X, Y) +lr.fit(X, Y) + +rf = RandomForestRegressor(n_estimators=100) +rf.fit(X, Y) + +# Словарь для хранения результатов оценок +feature_rankings = {} + + +# Функция для ранжирования признаков с использованием линейной регрессии +def rank_lr(): + coef = lr.coef_ + ranking = np.abs(coef) + ranking = min_max_scale(ranking) + return ranking + + +# Функция для ранжирования признаков с использованием RFE +def rank_rfe(): + rfe = RFE(lr, n_features_to_select=2) + rfe.fit(X, Y) + 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) diff --git a/kamyshov_danila_lab_2/readme.md b/kamyshov_danila_lab_2/readme.md new file mode 100644 index 0000000..0d2bd3c --- /dev/null +++ b/kamyshov_danila_lab_2/readme.md @@ -0,0 +1,27 @@ +Общее задание:Используя код из [1] (пункт «Решение задачи ранжирования признаков», стр. 205), выполните ранжирование признаков с помощью указанных по варианту моделей. Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку. Проведите анализ получившихся результатов. Какие четыре признака оказались самыми важными по среднему значению? (Названия\индексы признаков и будут +ответом на задание). + +13 вариант: +Рекурсивное сокращение признаков (Recursive Feature Elimination +– RFE), Сокращение признаков Случайными деревьями (Random Forest +Regressor), Линейная корреляция (f_regression) + +Чтобы Запустить приложение нужно запустить файл app.py + + +Технологии: + +Flask: Фреймворк для создания веб-приложений на языке Python. +scikit-learn: Библиотека для машинного обучения в Python. +NumPy: Библиотека для работы с массивами и матрицами в Python. +pandas: Библиотека для обработки и анализа данных в Python. +Описание работы программы: +Программа создает веб-приложение для ранжирования признаков в сгенерированных данных. Используются три метода: линейная регрессия, рекурсивное сокращение признаков (RFE), и случайные деревья. Данные генерируются, модели обучаются, и затем вычисляются оценки важности признаков. Результаты отображаются на веб-странице. + +Входные данные: + +Сгенерированные данные X (матрица признаков) и Y (вектор целевых значений). +Выходные данные: + +Результаты ранжирования признаков для линейной регрессии, RFE, случайных деревьев и среднее значение. +Самые важные признаки. \ No newline at end of file diff --git a/kamyshov_danila_lab_2/templates/index.html b/kamyshov_danila_lab_2/templates/index.html new file mode 100644 index 0000000..e2b8972 --- /dev/null +++ b/kamyshov_danila_lab_2/templates/index.html @@ -0,0 +1,51 @@ + + + + + + Feature Ranking + + +

Feature Ranking

+
+ +
+ +

Результаты ранжирования признаков

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
МетодПризнак 1Признак 2
Линейная регрессия{{ feature_rankings['Linear Regression'][0] if 'Linear Regression' in feature_rankings else '' }}{{ feature_rankings['Linear Regression'][1] if 'Linear Regression' in feature_rankings else '' }}
RFE{{ feature_rankings['RFE'][0] if 'RFE' in feature_rankings else '' }}{{ feature_rankings['RFE'][1] if 'RFE' in feature_rankings else '' }}
Случайные деревья{{ feature_rankings['Random Forest'][0] if 'Random Forest' in feature_rankings else '' }}{{ feature_rankings['Random Forest'][1] if 'Random Forest' in feature_rankings else '' }}
Средняя оценка{{ feature_rankings['Mean Ranking'][0] if 'Mean Ranking' in feature_rankings else '' }}{{ feature_rankings['Mean Ranking'][1] if 'Mean Ranking' in feature_rankings else '' }}
+ +

Самые важные признаки

+ + +