diff --git a/tsyppo_anton_lab_2/README.md b/tsyppo_anton_lab_2/README.md new file mode 100644 index 0000000..0b6acf4 --- /dev/null +++ b/tsyppo_anton_lab_2/README.md @@ -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 также считаются +важными, занимая второе, третье и четвертое место соответственно. Оценки признаков варьируются в зависимости от метода, +что подчеркивает важность использования нескольких подходов для достоверного определения важности признаков. Важность +признаков оценивается как среднее значение оценок по трем методам._ + +--- + diff --git a/tsyppo_anton_lab_2/img.png b/tsyppo_anton_lab_2/img.png new file mode 100644 index 0000000..3de9a06 Binary files /dev/null and b/tsyppo_anton_lab_2/img.png differ diff --git a/tsyppo_anton_lab_2/main.py b/tsyppo_anton_lab_2/main.py new file mode 100644 index 0000000..3079d61 --- /dev/null +++ b/tsyppo_anton_lab_2/main.py @@ -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)