From b661ebcb41843bbf6b02761b94868983d6f7626f Mon Sep 17 00:00:00 2001 From: Rafael Volkov Date: Tue, 5 Dec 2023 12:27:36 +0400 Subject: [PATCH] volkov_rafael_lab_2 is done --- volkov_rafael_lab_2/app.py | 96 ++++++++++++++++++++++++ volkov_rafael_lab_2/readme.md | 28 +++++++ volkov_rafael_lab_2/templates/index.html | 85 +++++++++++++++++++++ 3 files changed, 209 insertions(+) create mode 100644 volkov_rafael_lab_2/app.py create mode 100644 volkov_rafael_lab_2/readme.md create mode 100644 volkov_rafael_lab_2/templates/index.html diff --git a/volkov_rafael_lab_2/app.py b/volkov_rafael_lab_2/app.py new file mode 100644 index 0000000..91dc022 --- /dev/null +++ b/volkov_rafael_lab_2/app.py @@ -0,0 +1,96 @@ +from flask import Flask, request, render_template +from sklearn.linear_model import Lasso, LinearRegression +from sklearn.feature_selection import RFE +from sklearn.ensemble import RandomForestRegressor +from sklearn.preprocessing import MinMaxScaler +import numpy as np + +app = Flask(__name__) + +# Generate random data +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)) + +# Define and train models +lasso = Lasso(alpha=0.1) # Example alpha value, you can adjust +rfe = RFE(estimator=LinearRegression(), n_features_to_select=1) +rf_regressor = RandomForestRegressor(n_estimators=100, random_state=0) + +# Number of bootstrap samples +n_bootstrap = 100 + +# Dictionary to store rankings +feature_rankings = {} + + +# Function to rank features using Lasso +def rank_lasso(): + lasso.fit(X, Y) + coef = lasso.coef_ + ranking = np.abs(coef) + ranking = min_max_scale(ranking) + return ranking + + +# Function to rank features using RFE +def rank_rfe(): + rfe.fit(X, Y) + ranking = rfe.ranking_ + ranking = min_max_scale(ranking) + return ranking + + +# Function to rank features using Random Forest Regressor +def rank_random_forest_regressor(): + rf_regressor.fit(X, Y) + ranking = rf_regressor.feature_importances_ + ranking = min_max_scale(ranking) + return ranking + + +# Function to scale scores to the range [0, 1] +def min_max_scale(arr): + scaler = MinMaxScaler() + scaled = scaler.fit_transform(np.array(arr).reshape(-1, 1)) + return scaled + + +# Function to perform ranking and compute mean ranking +def rank_features(): + feature_rankings['Lasso'] = rank_lasso() + feature_rankings['RFE'] = rank_rfe() + feature_rankings['Random Forest Regressor'] = rank_random_forest_regressor() + + # Mean ranking + mean_ranking = np.mean(list(feature_rankings.values()), axis=0) + feature_rankings['Mean Ranking'] = mean_ranking + + # Get indices of the top 4 most important features + top_4_indices = np.argsort(mean_ranking)[-4:][::-1] + + # Get feature names based on indices + top_4_feature_names = [f'Feature {i + 1}' for i in top_4_indices] + + # Add X and Y values to the context + return { + 'feature_rankings': feature_rankings, + 'X_values': X[:, top_4_indices].tolist(), + 'Y_values': Y.tolist(), + 'top_4_feature_names': top_4_feature_names # Add the most important features + } + + +@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/volkov_rafael_lab_2/readme.md b/volkov_rafael_lab_2/readme.md new file mode 100644 index 0000000..888a8d9 --- /dev/null +++ b/volkov_rafael_lab_2/readme.md @@ -0,0 +1,28 @@ +Общее задание:Используя код из [1] (пункт «Решение задачи ранжирования признаков», стр. 205), выполните ранжирование признаков с помощью указанных по варианту моделей. Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку. Проведите анализ получившихся результатов. Какие четыре признака оказались самыми важными по среднему значению? (Названия\индексы признаков и будут +ответом на задание). + +8 вариант: +Лассо (Lasso), Рекурсивное сокращение признаков (Recursive +Feature Elimination – RFE), Сокращение признаков Случайными деревьями +(Random Forest Regressor) + +Запуск через файл app.py + +Технологии: + +Flask: веб-фреймворк для Python, используется для создания веб-приложения. +scikit-learn: библиотека машинного обучения для Python, в данном случае, используется для реализации методов машинного обучения, таких как Lasso, RFE и Random Forest Regressor. +NumPy: библиотека для выполнения вычислений с массивами и матрицами в Python. +Описание работы программы: + +Генерация случайных данных X и Y. +Обучение моделей машинного обучения (Lasso, RFE, Random Forest Regressor) на сгенерированных данных. +Ранжирование признаков с использованием различных методов. +Визуализация результатов ранжирования и отображение наиболее важных признаков. +Входные данные: + +X: массив случайных данных размером (750, 14). +Y: массив случайных данных размером (750,). +Выходные данные: + +Веб-страница с результатами ранжирования признаков для каждого метода, списком самых важных признаков и таблицами значений X и Y. \ No newline at end of file diff --git a/volkov_rafael_lab_2/templates/index.html b/volkov_rafael_lab_2/templates/index.html new file mode 100644 index 0000000..9321ca3 --- /dev/null +++ b/volkov_rafael_lab_2/templates/index.html @@ -0,0 +1,85 @@ + + + + + + Feature Ranking + + +

Feature Ranking

+
+ +
+ +

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

+ + + + + + + + + + {% for method, ranking in feature_rankings.items() %} + + + {% for value in ranking[:4] %} + + {% endfor %} + + {% endfor %} +
МетодПризнак 1Признак 2Признак 3Признак 4
{{ method }} + {% if value is iterable %} + {% for item in value %} + {{ item|round(2) }}{% if not loop.last %},{% endif %} + {% endfor %} + {% else %} + {{ value|round(2) }} + {% endif %} +
+ +

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

+ + +

Значения X

+ + + {% for col_num in range(4) %} + + {% endfor %} + + {% for row in X_values %} + + {% for value in row %} + + {% endfor %} + + {% endfor %} +
Признак {{ col_num + 1 }}
+ {% if value is iterable %} + {% for item in value %} + {{ item|round(2) }}{% if not loop.last %},{% endif %} + {% endfor %} + {% else %} + {{ value|round(2) }} + {% endif %} +
+ +

Значения Y

+ + + + + {% for value in Y_values %} + + + + {% endfor %} +
Y
{{ value|round(2) }}
+ +