diff --git a/.idea/discord.xml b/.idea/discord.xml new file mode 100644 index 0000000..30bab2a --- /dev/null +++ b/.idea/discord.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/savenkov_alexander_lab_2/.idea/.gitignore b/savenkov_alexander_lab_2/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/savenkov_alexander_lab_2/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/savenkov_alexander_lab_2/.idea/.name b/savenkov_alexander_lab_2/.idea/.name new file mode 100644 index 0000000..aa15e3e --- /dev/null +++ b/savenkov_alexander_lab_2/.idea/.name @@ -0,0 +1 @@ +app.py \ No newline at end of file diff --git a/savenkov_alexander_lab_2/.idea/Lab_2_IIS.iml b/savenkov_alexander_lab_2/.idea/Lab_2_IIS.iml new file mode 100644 index 0000000..aee9ef2 --- /dev/null +++ b/savenkov_alexander_lab_2/.idea/Lab_2_IIS.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/savenkov_alexander_lab_2/.idea/discord.xml b/savenkov_alexander_lab_2/.idea/discord.xml new file mode 100644 index 0000000..30bab2a --- /dev/null +++ b/savenkov_alexander_lab_2/.idea/discord.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/savenkov_alexander_lab_2/.idea/inspectionProfiles/profiles_settings.xml b/savenkov_alexander_lab_2/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/savenkov_alexander_lab_2/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/savenkov_alexander_lab_2/.idea/misc.xml b/savenkov_alexander_lab_2/.idea/misc.xml new file mode 100644 index 0000000..a377feb --- /dev/null +++ b/savenkov_alexander_lab_2/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/savenkov_alexander_lab_2/.idea/modules.xml b/savenkov_alexander_lab_2/.idea/modules.xml new file mode 100644 index 0000000..05f122b --- /dev/null +++ b/savenkov_alexander_lab_2/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/savenkov_alexander_lab_2/app.py b/savenkov_alexander_lab_2/app.py new file mode 100644 index 0000000..2c0384c --- /dev/null +++ b/savenkov_alexander_lab_2/app.py @@ -0,0 +1,94 @@ +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) diff --git a/savenkov_alexander_lab_2/readme.md b/savenkov_alexander_lab_2/readme.md new file mode 100644 index 0000000..60457cb --- /dev/null +++ b/savenkov_alexander_lab_2/readme.md @@ -0,0 +1,60 @@ +Общее задание: +Используя код из [1] (пункт «Решение задачи ранжирования признаков», +стр. 205), выполните ранжирование признаков с помощью указанных по +варианту моделей. Отобразите получившиеся значения\оценки каждого +признака каждым методом\моделью и среднюю оценку. Проведите анализ +получившихся результатов. Какие четыре признака оказались самыми +45 +важными по среднему значению? (Названия\индексы признаков и будут +ответом на задание). + +Задание по вариантам 2 вариант (22), взял 2 т.к. всего 20 вариант задания: +2. Линейная регрессия (LinearRegression), Рекурсивное сокращение +признаков (Recursive Feature Elimination – RFE), Сокращение признаков +Случайными деревьями (Random Forest Regressor) + +Запуск приложения осуществляется запуском файла app.py + +Использованные технологии: +Среда программирования Pycharm +Версия языка python: 3.11 +Flask: Flask - это микрофреймворк для создания веб-приложений на языке Python. Он используется для создания веб-интерфейса и обработки HTTP-запросов и ответов. + +scikit-learn: Scikit-learn - это библиотека для машинного обучения в Python. В вашей программе она используется для обучения моделей машинного обучения, таких как линейная регрессия, RFE и случайный лес, а также для выполнения ранжирования признаков. + +NumPy: NumPy - это библиотека для научных вычислений в Python. Она используется для работы с массивами и матрицами данных. + +Pandas: Pandas - это библиотека для анализа данных. Она используется для создания и обработки данных, включая таблицы и структуры данных. + +MinMaxScaler: Это функция из библиотеки Scikit-learn, используемая для масштабирования оценок признаков в диапазоне [0, 1]. + +HTML и шаблоны Jinja2: HTML - это язык разметки для создания веб-страниц, а Jinja2 - это шаблонный движок для вставки данных в HTML-шаблоны. + +HTTP и формы: Ваше приложение Flask обрабатывает HTTP-запросы и использует форму
для отправки данных при нажатии кнопки "Выполнить". + +Краткое описание работы программы: +Сгенерированные данные: Программа создает случайные данные в виде матрицы X и вектора Y. + +Обучение моделей: Обучаются три модели машинного обучения: линейная регрессия, RFE (рекурсивное исключение признаков) и случайные леса, используя сгенерированные данные. + +Ранжирование признаков: Для каждой модели рассчитываются ранги признаков, отражающие их важность для прогнозирования целевой переменной Y. + +Средний ранг: Вычисляется средний ранг для каждого признака на основе результатов всех трех моделей. + +Вывод результатов: После нажатия кнопки "Выполнить" на веб-странице, программа отображает следующие результаты: + +Ранги признаков для каждой модели (линейная регрессия, RFE, случайные леса). +Средний ранг признаков. +Значения признаков X. +Значения целевой переменной Y. +4 самых важных признака на основе среднего ранга (по названиям). + +Пример входных данных: +Случайные данные в виде матрицы X и вектора Y. + +Пример выходных данных: +Ранги признаков для каждой модели (линейная регрессия, RFE, случайные леса). +Средний ранг признаков. +Значения признаков X. +Значения целевой переменной Y. +4 самых важных признака на основе среднего ранга (по названиям). \ No newline at end of file diff --git a/savenkov_alexander_lab_2/templates/index.html b/savenkov_alexander_lab_2/templates/index.html new file mode 100644 index 0000000..51d204f --- /dev/null +++ b/savenkov_alexander_lab_2/templates/index.html @@ -0,0 +1,73 @@ + + + + + + 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 '' }}
+ +

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

+ + +

Значения X

+ + {% for row in X_values %} + + {% for value in row %} + + {% if loop.index % 10 == 0 %}{% endif %} + {% endfor %} + + {% endfor %} +
{{ value }}
+ +

Значения Y

+ + + {% for value in Y_values %} + + {% if loop.index % 10 == 0 %}{% endif %} + {% endfor %} + +
{{ value }}
+ +