diff --git a/shadaev_anton_lab_2/README.md b/shadaev_anton_lab_2/README.md new file mode 100644 index 0000000..61236ec --- /dev/null +++ b/shadaev_anton_lab_2/README.md @@ -0,0 +1,45 @@ +# IIS_2023_1 +

Задание

+

+Используя код из [1](пункт «Решение задачи ранжирования признаков», стр. 205), выполните ранжирование признаков с помощью указанных по варианту моделей. Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку. Проведите анализ получившихся результатов. Какие четыре признака оказались самыми важными по среднему значению? (Названия\индексы признаков и будут ответом на задание). +

+

+9. +

+

+

Способок запуска программы

+Запустить скрипт shadaev_anton_lab_2/main.py, после чего в консоль будут выведены результаты выполнения программы. +

Стек технологий

+

+

+

+

Описание кода

+

+В этом коде мы генерируем 500 наблюдений с 15 признаками. Затем создается словарь для хранения рангов признаков для каждого метода (Lasso, Random Forest, f_regression). + +Функция calculate_ranks() используется для вычисления рангов признаков для каждого метода. Для этого она обучает модель (Lasso или Random Forest) на данных и затем возвращает словарь, где ключами являются имена признаков, а значениями - коэффициенты признаков модели. + +Если используется метод f_regression, функция возвращает словарь с f-статистиками признаков. + +Затем функция create_normalized_rank_dict() используется для нормализации рангов признаков. Она принимает ранги и имена признаков, приводит ранги к абсолютному значению, нормализует их с использованием MinMaxScaler из sklearn.preprocessing и возвращает словарь, где ключами являются имена признаков, а значениями - нормализованные ранги. + +Наконец, код вычисляет среднее значение рангов для каждого признака, сортирует признаки по средним значениям рангов в порядке убывания и выводит признаки и их ранги. +

+
Результат:
+ +

+

+

\ No newline at end of file diff --git a/shadaev_anton_lab_2/img.png b/shadaev_anton_lab_2/img.png new file mode 100644 index 0000000..b0b5e3d Binary files /dev/null and b/shadaev_anton_lab_2/img.png differ diff --git a/shadaev_anton_lab_2/main.py b/shadaev_anton_lab_2/main.py new file mode 100644 index 0000000..9f81af7 --- /dev/null +++ b/shadaev_anton_lab_2/main.py @@ -0,0 +1,66 @@ +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 + +np.random.seed(0) + +# Генерация данных +size = 500 +X = np.random.uniform(0, 1, (size, 15)) +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[:, :5] + np.random.normal(0, .025, (size, 5)) + +# Имена признаков +names = ["x%s" % i for i in range(1, 16)] + +# Ранги признаков +ranks = {} + + +# Функция для расчета рангов +def calculate_ranks(method, X, Y): + if method == "Lasso": + model = Lasso(alpha=0.5) + elif method == "Random Forest": + model = RandomForestRegressor(n_estimators=100) + elif method == "f_regression": + f_scores, _ = f_regression(X, Y) + return dict(zip(names, f_scores)) + model.fit(X, Y) + return dict(zip(names, model.coef_ if method == "Lasso" else model.feature_importances_)) + + +# Ранг для каждого метода +for method in ["Lasso", "Random Forest", "f_regression"]: + ranks[method] = calculate_ranks(method, X, Y) + + +# Нормализация рангов +def create_normalized_rank_dict(ranks, names): + ranks = np.abs(ranks) + minmax = MinMaxScaler() + ranks = minmax.fit_transform( + np.array(ranks).reshape(15, 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]}')