diff --git a/orlov_artem_lab_2/app.py b/orlov_artem_lab_2/app.py
new file mode 100644
index 0000000..ea77271
--- /dev/null
+++ b/orlov_artem_lab_2/app.py
@@ -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)
diff --git a/orlov_artem_lab_2/readme.md b/orlov_artem_lab_2/readme.md
new file mode 100644
index 0000000..66adbd7
--- /dev/null
+++ b/orlov_artem_lab_2/readme.md
@@ -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 (вектор целевой переменной).
+
+Пример выходных данных:
+Веб-страница с результатами ранжирования признаков, средними оценками и списком самых важных признаков.
diff --git a/orlov_artem_lab_2/templates/index.html b/orlov_artem_lab_2/templates/index.html
new file mode 100644
index 0000000..bf596f2
--- /dev/null
+++ b/orlov_artem_lab_2/templates/index.html
@@ -0,0 +1,83 @@
+
+
+
+
+
+ Feature Ranking
+
+
+ Feature Ranking
+
+
+ Результаты ранжирования признаков
+
+
+ Метод |
+ Признак 1 |
+ Признак 2 |
+
+
+ {% for method, ranking in feature_rankings.items() %}
+
+ {{ method }} |
+ {% for value in ranking[:2] %}
+
+ {% if value is iterable %}
+ {% for item in value %}
+ {{ item|round(2) }}{% if not loop.last %},{% endif %}
+ {% endfor %}
+ {% else %}
+ {{ value|round(2) }}
+ {% endif %}
+ |
+ {% endfor %}
+
+ {% endfor %}
+
+
+ Самые важные признаки
+
+ {% for feature_name in top_4_feature_names %}
+ - {{ feature_name }}
+ {% endfor %}
+
+
+Значения X
+
+
+ {% for col_num in range(4) %}
+ Признак {{ col_num + 1 }} |
+ {% endfor %}
+
+ {% for row in X_values %}
+
+ {% for value in row %}
+
+ {% if value is iterable %}
+ {% for item in value %}
+ {{ item|round(2) }}{% if not loop.last %},{% endif %}
+ {% endfor %}
+ {% else %}
+ {{ value|round(2) }}
+ {% endif %}
+ |
+ {% endfor %}
+
+ {% endfor %}
+
+
+Значения Y
+
+
+ Y |
+
+ {% for value in Y_values %}
+
+ {{ value|round(2) }} |
+
+ {% endfor %}
+
+
+