tsyppo_anton_lab_2 is ready #270
73
tsyppo_anton_lab_2/README.md
Normal file
73
tsyppo_anton_lab_2/README.md
Normal 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
BIN
tsyppo_anton_lab_2/img.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 36 KiB |
63
tsyppo_anton_lab_2/main.py
Normal file
63
tsyppo_anton_lab_2/main.py
Normal 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)
|
Loading…
Reference in New Issue
Block a user