Лабораторная работа 2 #185
114
orlov_artem_lab_2/app.py
Normal file
114
orlov_artem_lab_2/app.py
Normal file
@ -0,0 +1,114 @@
|
||||
from flask import Flask, request, render_template
|
||||
from sklearn.linear_model import LinearRegression, Ridge, Lasso
|
||||
from sklearn.preprocessing import MinMaxScaler
|
||||
import pandas as pd
|
||||
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
|
||||
lr = LinearRegression()
|
||||
ridge = Ridge()
|
||||
lasso = Lasso(alpha=0.1) # Example alpha value, you can adjust
|
||||
|
||||
# Number of bootstrap samples
|
||||
n_bootstrap = 100
|
||||
|
||||
# Dictionary to store rankings
|
||||
feature_rankings = {}
|
||||
|
||||
|
||||
# Function to rank features using linear regression
|
||||
def rank_lr():
|
||||
lr.fit(X, Y)
|
||||
coef = lr.coef_
|
||||
ranking = np.abs(coef)
|
||||
ranking = min_max_scale(ranking)
|
||||
return ranking
|
||||
|
||||
|
||||
# Function to rank features using ridge regression
|
||||
def rank_ridge():
|
||||
ridge.fit(X, Y)
|
||||
coef = ridge.coef_
|
||||
ranking = np.abs(coef)
|
||||
ranking = min_max_scale(ranking)
|
||||
return ranking
|
||||
|
||||
# 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 lasso with bootstrap
|
||||
def rank_randomized_lasso():
|
||||
n_features = X.shape[1]
|
||||
scores = np.zeros(n_features)
|
||||
|
||||
for _ in range(n_bootstrap):
|
||||
indices = np.random.choice(size, size=size, replace=True)
|
||||
X_bootstrap = X[indices]
|
||||
Y_bootstrap = Y[indices]
|
||||
|
||||
lasso.fit(X_bootstrap, Y_bootstrap)
|
||||
scores += np.abs(lasso.coef_)
|
||||
|
||||
scores /= n_bootstrap
|
||||
scores = min_max_scale(scores)
|
||||
return scores
|
||||
|
||||
|
||||
# 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['Linear Regression'] = rank_lr()
|
||||
feature_rankings['Ridge'] = rank_ridge()
|
||||
feature_rankings['Lasso'] = rank_lasso()
|
||||
feature_rankings['Randomized Lasso'] = rank_randomized_lasso()
|
||||
|
||||
# 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)
|
29
orlov_artem_lab_2/readme.md
Normal file
29
orlov_artem_lab_2/readme.md
Normal file
@ -0,0 +1,29 @@
|
||||
Общее задание:
|
||||
Используя код из [1] (пункт «Решение задачи ранжирования признаков», стр. 205), выполните ранжирование признаков с помощью указанных по
|
||||
варианту моделей. Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку. Проведите анализ
|
||||
получившихся результатов. Какие четыре признака оказались самыми 45 важными по среднему значению? (Названия\индексы признаков и будут
|
||||
ответом на задание).
|
||||
|
||||
Вариант 19:
|
||||
Линейная регрессия (LinearRegression), Гребневая регрессия (Ridge), Лассо (Lasso), Случайное Лассо (RandomizedLasso)
|
||||
|
||||
Запуск приложения: запуск файла app.py
|
||||
|
||||
Использованные технологии:
|
||||
Flask: Веб-фреймворк для Python, используемый для создания веб-приложения.
|
||||
scikit-learn (sklearn): Библиотека машинного обучения для Python. В коде используются модели линейной регрессии (LinearRegression), гребневой регрессии (Ridge), лассо (Lasso), а также Случайное Лассо (RandomizedLasso).
|
||||
NumPy: Библиотека для работы с многомерными массивами и математическими функциями в Python.
|
||||
Pandas: Библиотека для обработки и анализа данных в Python.
|
||||
MinMaxScaler: Инструмент из scikit-learn для масштабирования данных в интервал [0, 1].
|
||||
|
||||
Краткое описание работы программы:
|
||||
Генерируются случайные данные X и Y.
|
||||
Создаются и обучаются модели линейной регрессии, гребневой регрессии и случайного Лассо.
|
||||
Реализованы функции для ранжирования признаков с использованием различных моделей.
|
||||
Веб-приложение на Flask отображает результаты ранжирования признаков, средние оценки и важные признаки.
|
||||
|
||||
Пример входных данных:
|
||||
Генерированные случайные данные X (матрица признаков) и Y (вектор целевой переменной).
|
||||
|
||||
Пример выходных данных:
|
||||
Веб-страница с результатами ранжирования признаков, средними оценками и списком самых важных признаков.
|
83
orlov_artem_lab_2/templates/index.html
Normal file
83
orlov_artem_lab_2/templates/index.html
Normal file
@ -0,0 +1,83 @@
|
||||
<!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>
|
||||
{% for method, ranking in feature_rankings.items() %}
|
||||
<tr>
|
||||
<td>{{ method }}</td>
|
||||
{% for value in ranking[:2] %}
|
||||
<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