diff --git a/arzamaskina_milana_lab_2/README.md b/arzamaskina_milana_lab_2/README.md new file mode 100644 index 0000000..3539c06 --- /dev/null +++ b/arzamaskina_milana_lab_2/README.md @@ -0,0 +1,50 @@ +## Лабораторная работа №2 + +### Ранжирование признаков + +Вариант №2 + +## Задание: + +Используя код из [1] (пункт «Решение задачи ранжирования признаков», стр. 205), +выполните ранжирование признаков с помощью указанных по варианту моделей. +Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку. +Проведите анализ получившихся результатов. +Какие четыре признака оказались самыми важными по среднему значению? +(Названия\индексы признаков и будут ответом на задание). + +Модели: ++ Линейная регрессия (LinearRegression) ++ Рекурсивное сокращение признаков (Recursive Feature Elimination –RFE), ++ Сокращение признаков Случайными деревьями (Random Forest Regressor) + +### Какие технологии использовались: + +Используемые библиотеки: +* numpy +* pandas +* sklearn + +### Как запустить: + +* установить python, numpy, pandas, sklearn +* запустить проект (стартовая точка - main.py) + +### Что делает программа: + +* Генерирует данные и обучает модели: LinearRegression, Recursive Feature Elimination (RFE), Random Forest Regressor +* Производится ранжирование признаков с помощью моделей +* Отображение получившихся результатов: значения признаков для каждой модели и 4 самых важных признака по среднему значению + +### 4 самых важных признака по среднему значению +* Признак №1 : 0.887 +* Признак №4 : 0.821 +* Признак №2 : 0.741 +* Признак №11 : 0.600 + +#### Результаты работы программы: + +![Result1](img_result_1.png) +![Result2](img_result_2.png) +![Result3](img_result_3.png) +![Result4](img_result_4.png) \ No newline at end of file diff --git a/arzamaskina_milana_lab_2/img_result_1.png b/arzamaskina_milana_lab_2/img_result_1.png new file mode 100644 index 0000000..579f8d8 Binary files /dev/null and b/arzamaskina_milana_lab_2/img_result_1.png differ diff --git a/arzamaskina_milana_lab_2/img_result_2.png b/arzamaskina_milana_lab_2/img_result_2.png new file mode 100644 index 0000000..c462fcb Binary files /dev/null and b/arzamaskina_milana_lab_2/img_result_2.png differ diff --git a/arzamaskina_milana_lab_2/img_result_3.png b/arzamaskina_milana_lab_2/img_result_3.png new file mode 100644 index 0000000..278319b Binary files /dev/null and b/arzamaskina_milana_lab_2/img_result_3.png differ diff --git a/arzamaskina_milana_lab_2/img_result_4.png b/arzamaskina_milana_lab_2/img_result_4.png new file mode 100644 index 0000000..0392818 Binary files /dev/null and b/arzamaskina_milana_lab_2/img_result_4.png differ diff --git a/arzamaskina_milana_lab_2/main.py b/arzamaskina_milana_lab_2/main.py new file mode 100644 index 0000000..c223f9d --- /dev/null +++ b/arzamaskina_milana_lab_2/main.py @@ -0,0 +1,84 @@ +import numpy as np +import pandas as pd +from sklearn.linear_model import LinearRegression +from sklearn.feature_selection import RFE +from sklearn.ensemble import RandomForestRegressor +from sklearn.preprocessing import MinMaxScaler + +# Используя код из [1](пункт «Решение задачи ранжирования признаков», стр. 205), +# выполните ранжирование признаков с помощью указанных по варианту моделей. +# Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку. +# Проведите анализ получившихся результатов. +# Какие четыре признака оказались самыми важными по среднему значению? +# (Названия\индексы признаков и будут ответом на задание). + +# Линейная регрессия (LinearRegression) +# Рекурсивное сокращение признаков (Recursive Feature Elimination –RFE), +# Сокращение признаков Случайными деревьями (Random Forest Regressor) + +# Модели +model_LR = LinearRegression() +model_RFE = RFE(LinearRegression(), n_features_to_select=1) +model_RFR = RandomForestRegressor() + +# Оценки моделей +model_scores = {} + +# Cлучайные данные для регрессии +def generation_data_and_start(): + np.random.seed(0) + size = 750 + X_ = np.random.uniform(0, 1, (size, 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)) + + # DataFrame для данных + data = pd.DataFrame(X_) + data['y'] = y_ + + models_study_and_scores(data.drop('y', axis=1), data['y']) + print_scores() + +# Обучение и оценка моделей +def models_study_and_scores(X, y): + + # Линейная регрессия + model_LR.fit(X, y) + # Нормализация коэффициентов признаков + norm_coef = MinMaxScaler().fit_transform(np.abs(model_LR.coef_).reshape(-1, 1)) + model_scores["Линейная регрессия"] = norm_coef.flatten() + + # Рекурсивное сокращение признаков + model_RFE.fit(X, y) + # Нормализация рангов + norm_rank = 1 - (model_RFE.ranking_ - 1) / (np.max(model_RFE.ranking_) - 1) + model_scores["Рекурсивное сокращение признаков"] = norm_rank + + # Сокращение признаков Случайными деревьями + model_RFR.fit(X, y) + # Нормализация значений важности признаков + norm_imp = MinMaxScaler().fit_transform(model_RFR.feature_importances_.reshape(-1, 1)) + model_scores["Сокращение признаков Случайными деревьями"] = norm_imp.flatten() + +# Вывод оценок +def print_scores(): + print() + print(f"---- Оценки признаков ----") + print() + for name, scores in model_scores.items(): + print(f"{name}:") + for feature, score in enumerate(scores, start=1): + print(f"Признак №{feature}: {score:.3f}") + print(f"Средняя оценка признаков: {np.mean(scores):.3f}") + print() + + # 4 наиболее важных признака по среднему значению + scores = np.mean(list(model_scores.values()), axis=0) + sorted_f = sorted(enumerate(scores, start=1), key=lambda x: x[1], reverse=True) + imp_features = sorted_f[:4] + print("Четыре наиболее важных признака:") + for f, score in imp_features: + print(f"Признак №{f}: {score:.3f}") + +generation_data_and_start() \ No newline at end of file