tsyppo_anton_lab_2 is ready #270

Merged
Alexey merged 1 commits from tsyppo_anton_lab_2 into main 2023-12-07 15:03:27 +04:00
3 changed files with 136 additions and 0 deletions

View File

@ -0,0 +1,73 @@
# Лабораторная работа №2: Ранжирование признаков
## Задание. Вариант 8
Всего вариантов 20, мой вариант 28, поэтому взял 8 вариант
Задание:
Используя код из [1](пункт «Решение задачи ранжирования признаков», стр. 205), выполните ранжирование признаков с
помощью указанных по варианту моделей. Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью
и среднюю оценку. Проведите анализ получившихся результатов. Какие четыре признака оказались самыми важными по
среднему значению? (Названия\индексы признаков и будут ответом на задание).
8.Лассо (Lasso), Рекурсивное сокращение признаков (Recursive Feature Elimination RFE), Сокращение признаков
Случайными деревьями (Random Forest Regressor)
## Описание программы
Программа выполняет ранжирование признаков с использованием трех методов: Lasso (лассо), Рекурсивное сокращение
признаков (RFE), и Сокращение признаков Случайными деревьями (Random Forest Regressor). Вводится набор случайных данных,
содержащих 10 признаков, и генерируется целевая переменная на основе линейной комбинации этих признаков.
В конце выводится 4 самых важных признака.
## Как запустить лабораторную работу
1. Установите необходимые библиотеки:
```bash
pip install numpy pandas scikit-learn
```
2. Запустите скрипт:
```bash
python main.py
```
## Использованные технологии
- Python
- NumPy
- Pandas
- scikit-learn
## Что программа делает
Программа выполняет ранжирование признаков в данных с использованием трех различных методов:
1. Lasso (лассо): стремится уменьшить веса некоторых признаков до нуля, что может служить признаком их неважности.
2. Рекурсивное сокращение признаков (RFE): удаляет наименее значимые признаки на каждом шаге, создавая ранжированный
список признаков.
3. Сокращение признаков Случайными деревьями (Random Forest Regressor): оценивает важность каждого признака на том,
как часто признак используется для разделения данных в деревьях случайного леса.
4. Средняя оценка: Для каждого признака вычисляется среднее значение его оценок важности по трем методам.
Это создает обобщенную меру важности для каждого признака.
Итоговый результат представлен в виде таблицы, где для каждого признака указаны его оценки важности по каждому методу,
а также средняя оценка важности. Программа также выводит четыре признака с наивысшими средними оценками, считая их
наиболее важными.
## Тесты
![Графики моделей](img.png)
## Вывод
_Анализ оценок признаков, проведенный с использованием трех различных методов ранжирования, выявил следующие ключевые
выводы:
Feature_8 оценен как наиболее важный признак по всем трем методам. Feature_1, Feature_7 и Feature_3 также считаются
важными, занимая второе, третье и четвертое место соответственно. Оценки признаков варьируются в зависимости от метода,
что подчеркивает важность использования нескольких подходов для достоверного определения важности признаков. Важность
признаков оценивается как среднее значение оценок по трем методам._
---

BIN
tsyppo_anton_lab_2/img.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -0,0 +1,63 @@
import numpy as np
import pandas as pd
from sklearn.linear_model import Lasso
from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import StandardScaler
# Создаём случайные данные
np.random.seed(42)
n_samples = 100
n_features = 10
X = np.random.rand(n_samples, n_features)
true_coefficients = np.array([3, -1, 2, 0, 1, 2, -3, 4, 0, -2])
noise = np.random.normal(0, 0.1, n_samples)
y = np.dot(X, true_coefficients) + noise
# Нормализуем данные
scaler = StandardScaler()
X_normalized = scaler.fit_transform(X)
# Преобразуем данные в DataFrame
columns = [f'Feature_{i}' for i in range(1, n_features + 1)]
df = pd.DataFrame(X_normalized, columns=columns)
df['Target'] = y
# 1. Лассо (Lasso)
lasso = Lasso(alpha=0.1)
lasso.fit(X_normalized, y)
lasso_coefs = np.abs(lasso.coef_)
# 2. Рекурсивное сокращение признаков (RFE)
rfe = RFE(estimator=RandomForestRegressor(), n_features_to_select=1)
rfe.fit(X_normalized, y)
rfe_ranks = rfe.ranking_
# 3. Сокращение признаков Случайными деревьями (Random Forest Regressor)
rf = RandomForestRegressor()
rf.fit(X_normalized, y)
rf_importances = rf.feature_importances_
# 4. Средняя оценка
average_scores = (lasso_coefs + (1 / rfe_ranks) + rf_importances) / 3
# Масштабируем средние оценки так, чтобы они лежали в диапазоне от 0 до 1
scaled_average_scores = (average_scores - np.min(average_scores)) / (np.max(average_scores) - np.min(average_scores))
# Создаем DataFrame для анализа результатов
results_df = pd.DataFrame({
'Lasso': np.round(lasso_coefs, 2),
'RFE Rank': np.round(1 / rfe_ranks, 2),
'Random Forest': np.round(rf_importances, 2),
'Average': np.round(scaled_average_scores, 2)
}, index=columns)
# Выводим результаты
print("Оценки признаков:")
print(results_df)
# Четыре признака с самыми высокими средними оценками
top_features = results_df.nlargest(4, 'Average').index
print("\nСамые важные признаки:")
print(top_features)