diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d13d270 --- /dev/null +++ b/.gitignore @@ -0,0 +1,141 @@ +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +.idea \ No newline at end of file diff --git a/basharin_sevastyan_lab_2/README.md b/basharin_sevastyan_lab_2/README.md new file mode 100644 index 0000000..9aa5309 --- /dev/null +++ b/basharin_sevastyan_lab_2/README.md @@ -0,0 +1,42 @@ +## Лабораторная работа 2. Вариант 5. +### Задание +Выполнить ранжирование признаков. Отобразить получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку. Провести анализ получившихся результатов. Какие четыре признака оказались самыми важными по среднему значению? + +Модели: + +- Гребневая регрессия `Ridge`, +- Рекурсивное сокращение признаков `Recursive Feature Elimination – RFE`, +- Сокращение признаков Случайными деревьями `Random Forest Regressor` + +### Как запустить +Для запуска программы необходимо с помощью командной строки в корневой директории файлов прокета прописать: +``` +python main.py +``` + +### Используемые технологии +- `numpy` (псевдоним `np`): NumPy - это библиотека для научных вычислений в Python. +- `sklearn` (scikit-learn): Scikit-learn - это библиотека для машинного обучения и анализа данных в Python. Из данной библиотеки были использованы следующие модули: + - `LinearRegression` - линейная регрессия - это алгоритм машинного обучения, используемый для задач бинарной классификации. + - `Ridge` - инструмент работы с моделью "Гребневая регрессия" + - `RFE` - инструмент оценки важности признаков "Рекурсивное сокращение признаков" + - `RandomForestRegressor` - инструмент работы с моделью "Регрессор случайного леса" + +### Описание работы +1. Программа генерирует данные для обучения моделей, содержащие матрицу признаков X и вектор целевой переменной y. +1. Создает DataFrame data, в котором столбцы представляют признаки, а последний столбец - целевую переменную. +1. Разделяет данные на матрицу признаков X и вектор целевой переменной y +1. Создает список обученных моделей для ранжирования признаков: гребневой регрессии, рекурсивного сокращения признаков и сокращения признаков случайными деревьями. +1. Создает словарь model_scores для хранения оценок каждой модели. +1. Выводит оценки признаков каждой модели и их средние оценки. +1. Находит четыре наиболее важных признака по средней оценке и выводит их индексы и значения. + +### Результат работы +![](ridge.png "Гребневая регрессия") +![](rfe.png "Рекурсивное сокращение признаков") +![](rfr.png "Сокращение признаков Случайными деревьями") +![](res.png "Четыре самых важных") + +### Вывод +Четыре наиболее важных признака, определенных на основе средних оценок, включают +Признак 1, Признак 3, Признак 12 и Признак 6. \ No newline at end of file diff --git a/basharin_sevastyan_lab_2/main.py b/basharin_sevastyan_lab_2/main.py new file mode 100644 index 0000000..8603b2a --- /dev/null +++ b/basharin_sevastyan_lab_2/main.py @@ -0,0 +1,67 @@ +import numpy as np +import pandas as pd +from sklearn.datasets import make_regression +from sklearn.linear_model import Ridge, LinearRegression +from sklearn.ensemble import RandomForestRegressor +from sklearn.feature_selection import RFE +from sklearn.preprocessing import MinMaxScaler + +''' Задание +Используя код из [1](пункт «Решение задачи ранжирования признаков», стр. 205), выполните ранжирование признаков с +помощью указанных по вариантумоделей. Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и +среднюю оценку. Проведите анализ получившихся результатов. Какие четырепризнака оказались самыми важными по среднему +значению? (Названия\индексы признаков и будут ответом на задание). + +Вариант 5. +Гребневая регрессия (Ridge), Рекурсивное сокращение признаков (Recursive Feature Elimination – RFE), +Сокращение признаков Случайными деревьями (Random Forest Regressor). +''' + +# создание данных +random_state = np.random.RandomState(2) +X, y = make_regression(n_samples=750, n_features=15, noise=0.1, random_state=random_state) +data = pd.DataFrame(X, columns=[f'Признак {i}' for i in range(X.shape[1])]) +data['Целевая переменная'] = y +X = data.drop('Целевая переменная', axis=1) +y = data['Целевая переменная'] + +ridge = Ridge(alpha=1) # Гребневая регрессия +ridge.fit(X, y) + +recFE = RFE(LinearRegression(), n_features_to_select=1) # Рекурсивное сокращение признаков +recFE.fit(X, y) + +rfr = RandomForestRegressor() # Сокращение признаков Случайными деревьями +rfr.fit(X, y) + +models = [('Ridge', ridge), + ('RFE', recFE), + ('RFR', rfr)] +model_scores = [] + +for name, model in models: + if name == 'Ridge': + coef = model.coef_ + normalized_coef = MinMaxScaler().fit_transform(coef.reshape(-1, 1)) + model_scores.append((name, normalized_coef.flatten())) + elif name == 'RFE': + rankings = model.ranking_ + normalized_rankings = 1 - (rankings - 1) / (np.max(rankings) - 1) + model_scores.append((name, normalized_rankings)) + elif name == 'RFR': + feature_importances = model.feature_importances_ + normalized_importances = MinMaxScaler().fit_transform(feature_importances.reshape(-1, 1)) + model_scores.append((name, normalized_importances.flatten())) + +for name, scores in model_scores: + print(f"{name} оценки признаков:") + for feature, score in enumerate(scores, start=1): + print(f"Признак {feature}: {score:.2f}") + print(f"Средняя оценка: {np.mean(scores):.2f}") + +all_feature_scores = np.mean(list(map(lambda x: x[1], model_scores)), axis=0) +sorted_features = sorted(enumerate(all_feature_scores, start=1), key=lambda x: x[1], reverse=True) +top_features = sorted_features[:4] +print("Четыре наиболее важных признака:") +for feature, score in top_features: + print(f"Признак {feature}: {score:.2f}") diff --git a/basharin_sevastyan_lab_2/res.png b/basharin_sevastyan_lab_2/res.png new file mode 100644 index 0000000..1dc7f4b Binary files /dev/null and b/basharin_sevastyan_lab_2/res.png differ diff --git a/basharin_sevastyan_lab_2/rfe.png b/basharin_sevastyan_lab_2/rfe.png new file mode 100644 index 0000000..b9e636f Binary files /dev/null and b/basharin_sevastyan_lab_2/rfe.png differ diff --git a/basharin_sevastyan_lab_2/rfr.png b/basharin_sevastyan_lab_2/rfr.png new file mode 100644 index 0000000..41009db Binary files /dev/null and b/basharin_sevastyan_lab_2/rfr.png differ diff --git a/basharin_sevastyan_lab_2/ridge.png b/basharin_sevastyan_lab_2/ridge.png new file mode 100644 index 0000000..717c629 Binary files /dev/null and b/basharin_sevastyan_lab_2/ridge.png differ