Merge pull request 'volkov_rafael_lab_2 is done' (#250) from volkov_rafael_lab_2 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/250
This commit is contained in:
commit
32a53d4be5
96
volkov_rafael_lab_2/app.py
Normal file
96
volkov_rafael_lab_2/app.py
Normal file
@ -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)
|
28
volkov_rafael_lab_2/readme.md
Normal file
28
volkov_rafael_lab_2/readme.md
Normal file
@ -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.
|
85
volkov_rafael_lab_2/templates/index.html
Normal file
85
volkov_rafael_lab_2/templates/index.html
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
<!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>
|
||||||
|
<th>Признак 3</th>
|
||||||
|
<th>Признак 4</th>
|
||||||
|
<!-- Добавьте остальные признаки -->
|
||||||
|
</tr>
|
||||||
|
{% for method, ranking in feature_rankings.items() %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ method }}</td>
|
||||||
|
{% for value in ranking[:4] %}
|
||||||
|
<td>
|
||||||
|
{% if value is iterable %}
|
||||||
|
{% for item in value %}
|
||||||
|
{{ item|round(2) }}{% if not loop.last %},{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{{ value|round(2) }}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h2>Самые важные признаки</h2>
|
||||||
|
<ul>
|
||||||
|
{% for feature_name in top_4_feature_names %}
|
||||||
|
<li>{{ feature_name }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Значения X</h2>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
{% for col_num in range(4) %}
|
||||||
|
<th>Признак {{ col_num + 1 }}</th>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
{% for row in X_values %}
|
||||||
|
<tr>
|
||||||
|
{% for value in row %}
|
||||||
|
<td>
|
||||||
|
{% if value is iterable %}
|
||||||
|
{% for item in value %}
|
||||||
|
{{ item|round(2) }}{% if not loop.last %},{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{{ value|round(2) }}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h2>Значения Y</h2>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>Y</th>
|
||||||
|
</tr>
|
||||||
|
{% for value in Y_values %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ value|round(2) }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue
Block a user