diff --git a/simonov_nikita_lab_2/lab2.py b/simonov_nikita_lab_2/lab2.py new file mode 100644 index 0000000..8376efb --- /dev/null +++ b/simonov_nikita_lab_2/lab2.py @@ -0,0 +1,66 @@ +from operator import itemgetter +import numpy as np +from sklearn.ensemble import RandomForestRegressor +from sklearn.feature_selection import RFE +from sklearn.linear_model import LinearRegression, Ridge +from sklearn.preprocessing import MinMaxScaler + +np.random.seed(0) +size = 750 +X = np.random.uniform(0, 1, (size, 14)) # Данные: 750 строк-наблюдений и 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)) + +ridge = Ridge(alpha=1) +ridge.fit(X, Y) + +lr = LinearRegression() +lr.fit(X, Y) +rfe = RFE(lr) +rfe.fit(X, Y) + +rfr = RandomForestRegressor() +rfr.fit(X, Y) + +def rank_ridge_rfr_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)) + +def rank_rfe_to_dict(ranks, names): + new_ranks = [float(1 / x) for x in ranks] + new_ranks = map(lambda x: round(x, 2), new_ranks) + return dict(zip(names, new_ranks)) + +if __name__ == '__main__': + names = ["x%s" % i for i in range(1, 15)] + ranks = dict() + + ranks["Ridge"] = rank_ridge_rfr_to_dict(ridge.coef_, names) + ranks["Recursive Feature Elimination"] = rank_rfe_to_dict(rfe.ranking_, names) + ranks["Random Forest Regression"] = rank_ridge_rfr_to_dict(rfr.feature_importances_, names) + + for key, value in ranks.items(): + ranks[key] = sorted(value.items(), key=itemgetter(1), reverse=True) + for key, value in ranks.items(): + print(key) + print(value) + + mean = {} + for key, value in ranks.items(): + for item in value: + 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 = sorted(mean.items(), key=itemgetter(1), reverse=True) + print("Mean") + print(mean) diff --git a/simonov_nikita_lab_2/readme.md b/simonov_nikita_lab_2/readme.md new file mode 100644 index 0000000..3c44420 --- /dev/null +++ b/simonov_nikita_lab_2/readme.md @@ -0,0 +1,152 @@ +# Лабораторная работа №2. Вариант 5. + +## Задание + +Выполнить ранжирование признаков с помощью указанных по варианту моделей. Отобразить получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку. Провести анализ получившихся результатов. + +- Гребневая регрессия (Ridge) +- Рекурсивное сокращение признаков (Recursive Feature Elimination – RFE) +- Сокращение признаков Случайными деревьями (Random Forest) + +## Содержание +- [Лабораторная работа №2. Вариант 5.](#лабораторная-работа-2-вариант-5) + - [Задание](#задание) + - [Содержание](#содержание) + - [Введение](#введение) + - [Зависимости](#зависимости) + - [Запуск приложения](#запуск-приложения) + - [Описание кода](#описание-кода) + - [Заключение](#заключение) + - [Оценка работы моделей](#оценка-работы-моделей) + - [Общий вывод](#общий-вывод) + +## Введение + +Данный код демонстрирует, как провести анализ важности признаков при помощи различных моделей: гребневой регрессии (Ridge), рекурсивного сокращения признаков (RFE) и случайного леса (Random Forest). Кроме того, код рассчитывает среднюю важность признаков по всем моделям. + +## Зависимости + +Для работы этого приложения необходимы следующие библиотеки Python: + +- Matplotlib +- scikit-learn +- NumPy + +Вы можете установить их с помощью pip: + +```bash +pip install numpy scikit-learn matplotlib +``` + +## Запуск приложения + +Чтобы запустить эту программу, выполните следующую команду: + +```bash +python lab2.py +``` +В консоль выведется резудьтат. + +## Описание кода + +- Генерируется синтетический набор данных с 750 наблюдениями и 14 признаками. + +```python +np.random.seed(0) +size = 750 +X = np.random.uniform(0, 1, (size, 14)) +``` + +- Задаем функцию-выход и добавляем зависимость признаков + +```python +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)) +``` + +- Для анализа важности признаков используются три разные модели: гребневая регрессия (Ridge), RFE и случайный лес (Random Forest). + +```python +ridge = Ridge(alpha=1) +ridge.fit(X, Y) + +lr = LinearRegression() +lr.fit(X, Y) +rfe = RFE(lr) +rfe.fit(X, Y) + +rfr = RandomForestRegressor() +rfr.fit(X, Y) +``` + +- Модели обучаются на данных для оценки важности признаков. +- Две функции, `rank_ridge_rfr_to_dict` и `rank_rfe_to_dict`, нормализуют и возвращают рейтинги важности признаков в виде словарей. + +```python +def rank_ridge_rfr_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)) + +def rank_rfe_to_dict(ranks, names): + new_ranks = [float(1 / x) for x in ranks] + new_ranks = map(lambda x: round(x, 2), new_ranks) + return dict(zip(names, new_ranks)) +``` + +- В коде рассчитываются и выводятся рейтинги важности признаков для каждой модели и средний рейтинг важности признаков. + + +## Заключение + +### Оценка работы моделей + +В консоль выводятся оценки значимости признаков каждой модели, а также средние оценки значимости признаков всех моделей + +```bash +Ridge +[('x4', 1.0), ('x1', 0.98), ('x2', 0.8), ('x14', 0.61), ('x5', 0.54), ('x12', 0.39), ('x3', 0.25), ('x13', 0.19), ('x11', 0.16), ('x6', 0.08), ('x8', 0.07), ('x7', 0.02), ('x10', +0.02), ('x9', 0.0)] +Recursive Feature Elimination +[('x1', 1.0), ('x2', 1.0), ('x3', 1.0), ('x4', 1.0), ('x5', 1.0), ('x11', 1.0), ('x13', 1.0), ('x12', 0.5), ('x14', 0.33), ('x8', 0.25), ('x6', 0.2), ('x10', 0.17), ('x7', 0.14), +('x9', 0.12)] +Random Forest Regression +[('x14', 1.0), ('x2', 0.84), ('x4', 0.77), ('x1', 0.74), ('x11', 0.36), ('x12', 0.35), ('x5', 0.28), ('x3', 0.12), ('x13', 0.12), ('x6', 0.01), ('x7', 0.01), ('x8', 0.01), ('x9', +0.01), ('x10', 0.0)] +Mean +[('x4', 0.92), ('x1', 0.91), ('x2', 0.88), ('x14', 0.65), ('x5', 0.61), ('x11', 0.51), ('x3', 0.46), ('x13', 0.44), ('x12', 0.41), ('x8', 0.11), ('x6', 0.1), ('x7', 0.06), ('x10', 0.06), ('x9', 0.04)] +``` + +Модель Ridge: + +- Самыми значимыми признаками, оцененными с использованием модели Ridge, являются x4, x1 и x2, обладающие оценками важности близкими к 1.0. Также к значимым можно отнести x5 и x14, которого не должно быть. +- не был отмечен важный признак x3. + +Модель Recursive Feature Elimination: + +- Модель RFE довольно точно выделила важные признаки, включая x1, x2, x3, x4 и x5, которые получили оценку важности равную 1.0. +- Признаки x11 и x13 были ошибочно оценены как важные. + +Модель Random Forest Regression: + +- Важность признаков с использованием модели Random Forest Regression дает представление о том, как признаки влияют на предсказания модели.Самые важные признаки согласно этой модели включают x14, x2, x4 и x1, но важность x3 и x5 существенно ниже. +- Модель также ошибочно приписала важность признаку x14. + +Средняя оценка: + +Средняя оценка важности признаков была рассчитана на основе результатов трех моделей и даёт общее представление об их значимости. +Наиболее значимыми признаками, в среднем, оказались x1, x2, x4 и x5. +Важность признака x3 снизилась в среднем, но он все равно остается значимым. +Признаки x11 и x14 оцениваются как значимые средним образом, хотя это может быть результатом ошибок моделей. + +### Общий вывод + +- Модель Ridge и метод Recursive Feature Elimination (RFE) совершили по одной ошибке каждая, но RFE не потерял ни одного значимого признака. +- Модель RandomForestRegressor показала наименьшую точность в оценке значимости признаков, что привело к потере двух значимых признаков и добавлению одного лишнего. +- Однако, средняя оценка значимости признаков также содержит три ошибки, как и первая модель. + +Исходя из этих результатов, можно заключить, что для ранжирования признаков предпочтительно использовать специализированные инструменты, такие как Recursive Feature Elimination (RFE), вместо оценки коэффициентов признаков в регрессионных моделях. \ No newline at end of file