savenkov_alexander_lab_2 is done

This commit is contained in:
Александр Савенков 2023-10-12 15:29:03 +04:00
parent 7781a379c3
commit 35826f2461
11 changed files with 276 additions and 0 deletions

7
.idea/discord.xml Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DiscordProjectSettings">
<option name="show" value="ASK" />
<option name="description" value="" />
</component>
</project>

View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

View File

@ -0,0 +1 @@
app.py

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.11" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DiscordProjectSettings">
<option name="show" value="ASK" />
<option name="description" value="" />
</component>
</project>

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11" project-jdk-type="Python SDK" />
<component name="PyCharmProfessionalAdvertiser">
<option name="shown" value="true" />
</component>
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/Lab_2_IIS.iml" filepath="$PROJECT_DIR$/.idea/Lab_2_IIS.iml" />
</modules>
</component>
</project>

View File

@ -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)

View File

@ -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-запросы и использует форму <form> для отправки данных при нажатии кнопки "Выполнить".
Краткое описание работы программы:
Сгенерированные данные: Программа создает случайные данные в виде матрицы X и вектора Y.
Обучение моделей: Обучаются три модели машинного обучения: линейная регрессия, RFE (рекурсивное исключение признаков) и случайные леса, используя сгенерированные данные.
Ранжирование признаков: Для каждой модели рассчитываются ранги признаков, отражающие их важность для прогнозирования целевой переменной Y.
Средний ранг: Вычисляется средний ранг для каждого признака на основе результатов всех трех моделей.
Вывод результатов: После нажатия кнопки "Выполнить" на веб-странице, программа отображает следующие результаты:
Ранги признаков для каждой модели (линейная регрессия, RFE, случайные леса).
Средний ранг признаков.
Значения признаков X.
Значения целевой переменной Y.
4 самых важных признака на основе среднего ранга (по названиям).
Пример входных данных:
Случайные данные в виде матрицы X и вектора Y.
Пример выходных данных:
Ранги признаков для каждой модели (линейная регрессия, RFE, случайные леса).
Средний ранг признаков.
Значения признаков X.
Значения целевой переменной Y.
4 самых важных признака на основе среднего ранга (по названиям).

View File

@ -0,0 +1,73 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Feature Ranking</title>
</head>
<body>
<h1>Feature Ranking</h1>
<form method="POST">
<button type="submit">Выполнить</button>
</form>
<h2>Результаты ранжирования признаков</h2>
<table>
<tr>
<th>Метод</th>
<th>Признак 1</th>
<th>Признак 2</th>
<!-- Добавьте остальные признаки -->
</tr>
<tr>
<td>Линейная регрессия</td>
<td>{{ feature_rankings['Linear Regression'][0] if 'Linear Regression' in feature_rankings else '' }}</td>
<td>{{ feature_rankings['Linear Regression'][1] if 'Linear Regression' in feature_rankings else '' }}</td>
</tr>
<tr>
<td>RFE</td>
<td>{{ feature_rankings['RFE'][0] if 'RFE' in feature_rankings else '' }}</td>
<td>{{ feature_rankings['RFE'][1] if 'RFE' in feature_rankings else '' }}</td>
</tr>
<tr>
<td>Случайные деревья</td>
<td>{{ feature_rankings['Random Forest'][0] if 'Random Forest' in feature_rankings else '' }}</td>
<td>{{ feature_rankings['Random Forest'][1] if 'Random Forest' in feature_rankings else '' }}</td>
</tr>
<tr>
<td>Средняя оценка</td>
<td>{{ feature_rankings['Mean Ranking'][0] if 'Mean Ranking' in feature_rankings else '' }}</td>
<td>{{ feature_rankings['Mean Ranking'][1] if 'Mean Ranking' in feature_rankings else '' }}</td>
</tr>
</table>
<h2>Самые важные признаки</h2>
<ul>
{% for feature_name in top_4_feature_names %}
<li>{{ feature_name }}</li>
{% endfor %}
</ul>
<h2>Значения X</h2>
<table>
{% for row in X_values %}
<tr>
{% for value in row %}
<td>{{ value }}</td>
{% if loop.index % 10 == 0 %}</tr><tr>{% endif %}
{% endfor %}
</tr>
{% endfor %}
</table>
<h2>Значения Y</h2>
<table>
<tr>
{% for value in Y_values %}
<td>{{ value }}</td>
{% if loop.index % 10 == 0 %}</tr><tr>{% endif %}
{% endfor %}
</tr>
</table>
</body>
</html>