Merge pull request 'kamyshov_danila_lab_2 is done' (#263) from kamyshov_danila_lab_2 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/263
This commit is contained in:
commit
2f3014ca25
96
kamyshov_danila_lab_2/app.py
Normal file
96
kamyshov_danila_lab_2/app.py
Normal file
@ -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)
|
27
kamyshov_danila_lab_2/readme.md
Normal file
27
kamyshov_danila_lab_2/readme.md
Normal file
@ -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, случайных деревьев и среднее значение.
|
||||
Самые важные признаки.
|
51
kamyshov_danila_lab_2/templates/index.html
Normal file
51
kamyshov_danila_lab_2/templates/index.html
Normal file
@ -0,0 +1,51 @@
|
||||
<!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>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user