Merge pull request 'zhukova_alina_lab_2 is ready' (#157) from zhukova_alina_lab_2 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/157
This commit is contained in:
commit
6599b19d25
139
zhukova_alina_lab_2/flask-server.py
Normal file
139
zhukova_alina_lab_2/flask-server.py
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
import pandas
|
||||||
|
import numpy as np
|
||||||
|
from flask import Flask
|
||||||
|
from sklearn.feature_selection import RFE
|
||||||
|
from sklearn.linear_model import Lasso, LinearRegression
|
||||||
|
from sklearn.preprocessing import MinMaxScaler
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
def home():
|
||||||
|
return "<html>" \
|
||||||
|
"<h1>Жукова Алина ПИбд-41</h1>" \
|
||||||
|
"<h1>Лабораторная работа №2</h1>" \
|
||||||
|
"<table>" \
|
||||||
|
"<td>" \
|
||||||
|
"<form Action='http://127.0.0.1:5000/k4_1_task_2' Method=get>" \
|
||||||
|
"<input type=submit value='Ранжирование признаков'>" \
|
||||||
|
"</form>" \
|
||||||
|
"</td>" \
|
||||||
|
"</table>" \
|
||||||
|
"</html>"
|
||||||
|
|
||||||
|
# Ранжирование признаков
|
||||||
|
# Линейная регрессия, Лассо, Рекурсивное сокращение признаков
|
||||||
|
# Отобразить оценки/значения каждого признака каждым методом, и среднюю оценку
|
||||||
|
# 4 самых важных признака (индексы/названия)
|
||||||
|
@app.route("/k4_1_task_2", methods=['GET'])
|
||||||
|
def k4_1_task_2():
|
||||||
|
# Генерация даных
|
||||||
|
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))
|
||||||
|
# Зависимость признаков
|
||||||
|
X[:, 10:] = X[:, : 4] + np.random.normal(0, .025, (size, 4))
|
||||||
|
|
||||||
|
linear_Regr = LinearRegression()
|
||||||
|
linear_Regr.fit(X, Y)
|
||||||
|
|
||||||
|
lasso = Lasso(alpha=.05)
|
||||||
|
lasso.fit(X, Y)
|
||||||
|
|
||||||
|
recurs_sokr_RFE = RFE(linear_Regr, n_features_to_select=1)
|
||||||
|
recurs_sokr_RFE.fit(X, Y)
|
||||||
|
|
||||||
|
new_RFE = []
|
||||||
|
elem_ind = 0
|
||||||
|
for value in recurs_sokr_RFE.ranking_:
|
||||||
|
new_RFE.append(recurs_sokr_RFE.ranking_.max() - value + 1)
|
||||||
|
elem_ind += 1
|
||||||
|
|
||||||
|
|
||||||
|
names = ["x%s" % i for i in range(1, 15)]
|
||||||
|
|
||||||
|
ranks = {}
|
||||||
|
ranks["Linear"] = rank_to_dict(linear_Regr.coef_, names)
|
||||||
|
ranks["Lasso"] = rank_to_dict(lasso.coef_, names)
|
||||||
|
ranks["RFE"] = rank_to_dict(np.array(new_RFE), names)
|
||||||
|
|
||||||
|
mean = {}
|
||||||
|
# Пройти по словарю
|
||||||
|
for key, value in ranks.items():
|
||||||
|
# Пройти по списку значений которые являются парой имя:оценка
|
||||||
|
for item in value.items():
|
||||||
|
# Имя = ключ для mean
|
||||||
|
if(item[0] not in mean):
|
||||||
|
mean[item[0]] = 0
|
||||||
|
mean[item[0]] += item[1]
|
||||||
|
|
||||||
|
for key, value in mean.items():
|
||||||
|
res = value/len(ranks)
|
||||||
|
mean[key] = round(res, 2)
|
||||||
|
|
||||||
|
mean_1 = [None, None]
|
||||||
|
mean_2 = [None, None]
|
||||||
|
mean_3 = [None, None]
|
||||||
|
mean_4 = [None, None]
|
||||||
|
|
||||||
|
for key, value in mean.items():
|
||||||
|
if(mean_1[0] == None or value >= mean_1[0]):
|
||||||
|
mean_4 = mean_3
|
||||||
|
mean_3 = mean_2
|
||||||
|
mean_2 = mean_1
|
||||||
|
mean_1 = [value, key]
|
||||||
|
else :
|
||||||
|
if (mean_2[0] == None or value >= mean_2[0]):
|
||||||
|
mean_4 = mean_3
|
||||||
|
mean_3 = mean_2
|
||||||
|
mean_2 = [value, key]
|
||||||
|
else:
|
||||||
|
if (mean_3[0] == None or value >= mean_3[0]):
|
||||||
|
mean_4 = mean_3
|
||||||
|
mean_3 = [value, key]
|
||||||
|
else:
|
||||||
|
if (mean_4[0] == None or value >= mean_4[0]):
|
||||||
|
mean_4 = [value, key]
|
||||||
|
|
||||||
|
mean_mass = []
|
||||||
|
mass_linear = []
|
||||||
|
mass_lasso = []
|
||||||
|
mass_RFE = []
|
||||||
|
for key, value in mean.items():
|
||||||
|
mean_mass.append(value)
|
||||||
|
for key, value in ranks['Linear'].items():
|
||||||
|
mass_linear.append(value)
|
||||||
|
for key, value in ranks['Lasso'].items():
|
||||||
|
mass_lasso.append(value)
|
||||||
|
for key, value in ranks['RFE'].items():
|
||||||
|
mass_RFE.append(value)
|
||||||
|
|
||||||
|
data = {"Linear": mass_linear,
|
||||||
|
"Lasso": mass_lasso,
|
||||||
|
"RFE": mass_RFE,
|
||||||
|
"Mean": mean_mass}
|
||||||
|
df = pandas.DataFrame(data, index=names)
|
||||||
|
|
||||||
|
return "<html>" \
|
||||||
|
"<h1>Ранжирование признаков</h1>" \
|
||||||
|
"<h2>Вариант 10. Линейная регрессия, Лассо, Рекурсивное сокращение признаков</h2>" \
|
||||||
|
"<h2>Отобразить оценки/значения каждого признака каждым методом, и среднюю оценку</h2>" \
|
||||||
|
"<h2>4 самых важных признака: 1) " + mean_1[1] + "; 2) " + mean_2[1] + "; 3) " + mean_3[1] + "; 4) " + mean_4[1] + "</h2>" \
|
||||||
|
"<div>" + df.to_html() + "</div>" \
|
||||||
|
"</html>"
|
||||||
|
|
||||||
|
def rank_to_dict(ranks, names):
|
||||||
|
ranks = np.abs(ranks)
|
||||||
|
|
||||||
|
minmax = MinMaxScaler()
|
||||||
|
|
||||||
|
ranks = minmax.fit_transform(np.array(ranks).reshape(14, 1)).ravel()
|
||||||
|
ranks = map(lambda x: round(x, 2), ranks)
|
||||||
|
return dict(zip(names, ranks))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(debug=True)
|
BIN
zhukova_alina_lab_2/img_screen_1.png
Normal file
BIN
zhukova_alina_lab_2/img_screen_1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
42
zhukova_alina_lab_2/readme.md
Normal file
42
zhukova_alina_lab_2/readme.md
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
## Задание
|
||||||
|
Выполнить ранжирование признаков с помощью указанных по варианту моделей.
|
||||||
|
Отобразить получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку.
|
||||||
|
Провести анализ получившихся результатов.
|
||||||
|
Указать самые значимые четыре признака по среднему значению
|
||||||
|
|
||||||
|
Вариант №10
|
||||||
|
|
||||||
|
Методы:
|
||||||
|
+ Линейная регрессия
|
||||||
|
+ Лассо
|
||||||
|
+ Рекурсивное сокращение признаков
|
||||||
|
|
||||||
|
## Используемые технологии
|
||||||
|
В лабораторной были использованы библиотеки:
|
||||||
|
+ numpy - позволяет работать с массивами и матрицами
|
||||||
|
+ pandas - позволяет работать с наборами данных
|
||||||
|
+ sklearn - используется для работы с моделями и методами машинного обучения
|
||||||
|
+ Flask - предоставляет способ быстрого создания веб-страниц для визуализации работы приложения
|
||||||
|
|
||||||
|
## Используемые компоненты
|
||||||
|
+ LinearRegression - библиотечная реализация модели линейной регрессии
|
||||||
|
+ Lasso - модификация линейной регрессии
|
||||||
|
+ RFE - модель рекурсивноего исключения признаков
|
||||||
|
|
||||||
|
## Как запустить
|
||||||
|
Запустить файл flask-server, который поднимет локальный сервер
|
||||||
|
и позволит обратиться к программе через браузер по ссылке [http://127.0.0.1:5000/](http://127.0.0.1:5000/)
|
||||||
|
|
||||||
|
## Что делает программа
|
||||||
|
Генерирует набор данных с 14 признаками размером 750, делит его на обучающую и тестовую выборки.
|
||||||
|
По очереди обучает на данных обучающей выборки 3 модели:
|
||||||
|
модель линейной регрессии, модель лассо и модель рекурсивного сокращения признаков.
|
||||||
|
|
||||||
|
После обучения из каждой модели берутся оценки значимостей признаков.
|
||||||
|
Исходя из полученных оценок высчитываются средние оценки для признаков,
|
||||||
|
полученные данные отражаеются в виде таблицы. Указываются самые значимые 4 признака
|
||||||
|
|
||||||
|
## Скриншоты работы программы
|
||||||
|
|
||||||
|
Полученные оценки значимости признаков
|
||||||
|
![img.png](img_screen_1.png)
|
Loading…
Reference in New Issue
Block a user