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:
commit
a076fd78ae
36
gusev_vladislav_lab_2/README.md
Normal file
36
gusev_vladislav_lab_2/README.md
Normal 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 очень низкая значимость
|
||||||
|
|
53
gusev_vladislav_lab_2/gusev_vladislav_lab_2.py
Normal file
53
gusev_vladislav_lab_2/gusev_vladislav_lab_2.py
Normal 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]}')
|
||||||
|
|
BIN
gusev_vladislav_lab_2/img.png
Normal file
BIN
gusev_vladislav_lab_2/img.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
Loading…
Reference in New Issue
Block a user