simonov_nikita_lab_2
This commit is contained in:
parent
b26c54a7e4
commit
5746fc2084
66
simonov_nikita_lab_2/lab2.py
Normal file
66
simonov_nikita_lab_2/lab2.py
Normal file
@ -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)
|
152
simonov_nikita_lab_2/readme.md
Normal file
152
simonov_nikita_lab_2/readme.md
Normal file
@ -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), вместо оценки коэффициентов признаков в регрессионных моделях.
|
Loading…
Reference in New Issue
Block a user