Merge pull request 'gusev_vladislav_lab_2 is ready' (#89) from gusev_vladislav_lab_2 into main

Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/89
This commit is contained in:
Alexey 2023-10-27 11:37:46 +04:00
commit a076fd78ae
3 changed files with 89 additions and 0 deletions

View File

@ -0,0 +1,36 @@
### Вариант 9
### Задание на лабораторную работу:
Выполнить ранжирование признаков с помощью указанных по варианту моделей:
- Лассо (Lasso)
- Сокращение признаков Случайными деревьями (Random Forest Regressor)
- Линейная корреляция (f_regression)
### Как запустить лабораторную работу:
Выполняем файл gusev_vladislav_lab_2.py, в консоль будут выведены результаты.
### Технологии
NumPy - библиотека для работы с многомерными массивами. Sklearn - библиотека с большим количеством алгоритмов машинного обучения.
### По коду
В начале генерируем исходные данные: 750 строк-наблюдений и 14 столбцов-признаков, задаем функцию-выход: регрессионную проблему Фридмана, добавляем зависимость признаков
Далее создаем пустой словарь для хранения рангов признаков, используем методы из библиотеки Sklearn: Lasso, RandomForestRegressor и f_regression для задания по варианту.
Далее необходимо объявить функцию def rank_to_dict(ranks, names): для соотнесения нашего списка рангов и списка оценок по признакам. Возвращает он словарь типа (имя_признака: оценка_признака) и оценки приведены к единому диапазону от 0 до 1 и округлены до сотых.
В конце формируем среднее по каждому признаку, сортируем по убыванию и выводим на экран.
Пример:
![img.png](img.png)
Признаки х4 и х14 имеют наивысшие ранги, что говорит об их наибольшей значимости для решения задачи
Далее x2 и x12 занимают второе место по значимости (средняя значимость)
х1, х11 ниже среднего
х5, х8, х7 низкая значимость
х9, х3, х13, х10, х6 очень низкая значимость

View File

@ -0,0 +1,53 @@
from sklearn.linear_model import Lasso
from sklearn.ensemble import RandomForestRegressor
from sklearn.feature_selection import f_regression
from sklearn.preprocessing import MinMaxScaler
import numpy as np
#генерируем исходные данные: 750 строк-наблюдений и 14 столбцов-признаков
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))
names = ["x%s" % i for i in range(1,15)]
#Создается пустой словарь для хранения рангов признаков
ranks = {}
#Lasso
lasso = Lasso(alpha=0.5)
lasso.fit(X, Y)
ranks["Lasso"] = dict(zip(names, lasso.coef_))
#Случайные деревья
rf = RandomForestRegressor(n_estimators=100)
rf.fit(X, Y)
ranks["Random Forest"] = dict(zip(names, rf.feature_importances_))
#Линейная корреляция
f_scores, p_values = f_regression(X, Y)
ranks["f_regression"] = dict(zip(names, f_scores))
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))
mean = {}
for key, value in ranks.items():
for item in value.items():
if(item[0] not in mean):
mean[item[0]] = 0
mean[item[0]] += item[1]
sorted_mean = sorted(mean.items(), key=lambda x: x[1], reverse=True)
result = {}
for item in sorted_mean:
result[item[0]] = item[1]
print(f'{item[0]}: {item[1]}')

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB