diff --git a/gusev_vladislav_lab_2/README.md b/gusev_vladislav_lab_2/README.md new file mode 100644 index 0000000..afc2fc3 --- /dev/null +++ b/gusev_vladislav_lab_2/README.md @@ -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 очень низкая значимость + diff --git a/gusev_vladislav_lab_2/gusev_vladislav_lab_2.py b/gusev_vladislav_lab_2/gusev_vladislav_lab_2.py new file mode 100644 index 0000000..1ab41b1 --- /dev/null +++ b/gusev_vladislav_lab_2/gusev_vladislav_lab_2.py @@ -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]}') + diff --git a/gusev_vladislav_lab_2/img.png b/gusev_vladislav_lab_2/img.png new file mode 100644 index 0000000..bf1bf97 Binary files /dev/null and b/gusev_vladislav_lab_2/img.png differ