From c943260db9562d89698090e7eed899464f4f4b8c Mon Sep 17 00:00:00 2001
From: DmitriyAntonov
Date: Sat, 30 Sep 2023 20:26:46 +0400
Subject: [PATCH] =?UTF-8?q?=D0=BB=D0=B0=D0=B1=D0=B0=202=20done?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
antonov_dmitry_lab_2/README.md | 104 ++++++++++++++++++++++++++++++++
antonov_dmitry_lab_2/example.py | 50 +++++++++++++++
antonov_dmitry_lab_2/lab2.py | 71 ++++++++++++++++++++++
3 files changed, 225 insertions(+)
create mode 100644 antonov_dmitry_lab_2/README.md
create mode 100644 antonov_dmitry_lab_2/example.py
create mode 100644 antonov_dmitry_lab_2/lab2.py
diff --git a/antonov_dmitry_lab_2/README.md b/antonov_dmitry_lab_2/README.md
new file mode 100644
index 0000000..4dc1ae4
--- /dev/null
+++ b/antonov_dmitry_lab_2/README.md
@@ -0,0 +1,104 @@
+# Лаб 2
+
+Ранжирование признаков
+
+Используя код из (пункт «Решение задачи ранжирования признаков», стр. 205),
+выполните ранжирование признаков с помощью указанных по варианту моделей.
+Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку.
+Проведите анализ получившихся результатов.
+Какие четыре признака оказались самыми важными по среднему значению?
+(Названия\индексы признаков и будут ответом на задание).
+
+# Вариант 3
+
+Данные: make_classification (n_samples=500, n_features=2,
+n_redundant=0, n_informative=2, random_state=rs, n_clusters_per_class=1)
+
+# Запуск
+
+Выполнением скрипта файла (вывод в консоль + рисует графики).
+
+# Модели:
+
+1. Линейная регрессия
+1. Полиномиальная регрессия (со степенью 3)
+1. Гребневая полиномиальная регрессия (со степенью 3, alpha = 1.0)
+
+# Графики
+
+
+Качество каждой модели может быть оценено на основе среднеквадратичной ошибки (MSE).
+Более низкая MSE указывает на лучшее соответствие данным.
+Однако выбор модели зависит от набора данных и лежащей в основе взаимосвязи между объектами и целевой переменной.
+
+Линейная регрессия: Линейная регрессия предполагает линейную зависимость между признаками и целевой переменной.
+Это хорошо работает, когда взаимосвязь линейна, а шум в наборе данных минимален.
+Лучше всего сработала на наборе лун. Хуже всего на кругах.
+На линейном наборе показала себя на равне с остальными.
+
+Полиномиальная и гребневая показали примерно одинаково на всех наборах.
+
+Полиномиальная регрессия (степень=3):
+Полиномиальная регрессия обеспечивает более гибкую подгонку за счет полинома более высокого порядка(кубическая кривая).
+Она может выявить более сложные взаимосвязи между объектами и целевой переменной.
+Она может сработать лучше, чем линейная регрессия, если истинная взаимосвязь нелинейна.
+
+Гребневая регрессия (степень= 3, альфа=1,0):
+В случае полиномиальной регрессии с регуляризацией (альфа=1,0) модель добавляет коэффициент регуляризации
+для управления сложностью обучения. Регуляризация помогает предотвратить переобучение, когда набор
+данных содержит шум или когда он ограничен.
+
+
+
+
Набор лун (moon_dataset)
+
+
+
+
Графики регрессии
+
+
+
+
+ Линейная MSE: 0.0936
+ Полиномиальная (degree=3) MSE: 0.0674
+ Гребневая (degree=3, alpha=1.0) MSE: 0.0682
+
+
+
+
+
Набор кругов (circles_dataset)
+
+
+
+
Графики регрессии
+
+
+
+
+ Линейная MSE: 0.2684
+ Полиномиальная (degree=3) MSE: 0.1341
+ Гребневая (degree=3, alpha=1.0) MSE: 0.1312
+
+
+
+
+
Набор линейный (linearly_dataset)
+
+
+
+
Графики регрессии
+
+
+
+
+ Линейная MSE: 0.1101
+ Полиномиальная (degree=3) MSE: 0.1045
+ Гребневая (degree=3, alpha=1.0) MSE: 0.1078
+
+
+
+
+Итоговая модель подбирается учитывая зависимость в данных,
+как правило полиномиальная регрессия справляется лучше, а коэф регуляризации в гребневой регрессии помогает избежать
+переобучения.
+
\ No newline at end of file
diff --git a/antonov_dmitry_lab_2/example.py b/antonov_dmitry_lab_2/example.py
new file mode 100644
index 0000000..0d6b861
--- /dev/null
+++ b/antonov_dmitry_lab_2/example.py
@@ -0,0 +1,50 @@
+import numpy as np
+from sklearn.datasets import make_regression
+from sklearn.feature_selection import RFECV, f_regression
+from sklearn.linear_model import LinearRegression
+from sklearn.ensemble import RandomForestRegressor
+
+# генерируем исходные данные: 100 строк-наблюдений и 10 столбцов-признаков
+X, y = make_regression(n_samples=100, n_features=10, random_state=42)
+
+# линейная модель
+linear_reg = LinearRegression()
+linear_reg.fit(X, y)
+linear_ranking_lr = np.abs(linear_reg.coef_)
+
+# cокращение признаков cлучайными деревьями (Random Forest Regressor)
+rf_reg = RandomForestRegressor()
+rfecv = RFECV(estimator=rf_reg)
+rfecv.fit(X, y)
+rfecv_ranking = rfecv.ranking_
+
+# линейная корреляция (f_regression)
+f_reg, _ = f_regression(X, y)
+linear_corr_ranking = f_reg
+
+# ранжирование признаков и вычисление средней оценки
+all_rankings = np.vstack((linear_ranking_lr, rfecv_ranking, linear_corr_ranking))
+average_ranking = np.mean(all_rankings, axis=0)
+
+# средние показатели четырех наиболее важных характеристик
+most_important_indices = np.argsort(average_ranking)[-4:]
+
+# результаты
+print("ранги линейной модели:")
+print(linear_ranking_lr)
+print("")
+
+print("ранги после сокращения признаков Random Forest:")
+print(rfecv_ranking)
+print("")
+
+print("ранги линейнейной корреляции (f_regression):")
+print(linear_corr_ranking)
+print("")
+
+print("ранги по средней оценке:")
+print(average_ranking)
+print("")
+
+print("4 выделенных главных признака:")
+print(most_important_indices)
\ No newline at end of file
diff --git a/antonov_dmitry_lab_2/lab2.py b/antonov_dmitry_lab_2/lab2.py
new file mode 100644
index 0000000..fe975dc
--- /dev/null
+++ b/antonov_dmitry_lab_2/lab2.py
@@ -0,0 +1,71 @@
+from operator import itemgetter
+
+from sklearn.feature_selection import f_regression
+from sklearn.linear_model import LinearRegression, Ridge, Lasso
+from sklearn.preprocessing import MinMaxScaler
+import numpy as np
+
+# генерируем исходные данные: 750 строк-наблюдений и 14 столбцов-признаков
+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))
+
+# линейная модель
+lr = LinearRegression()
+lr.fit(X, Y)
+# гребневая модель
+ridge = Ridge(alpha=7)
+ridge.fit(X, Y)
+# Лассо
+lasso = Lasso(alpha=.05)
+lasso.fit(X, Y)
+
+names = ["x%s" % i for i in range(1, 15)]
+
+
+def rank_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))
+
+
+ranks = {}
+ranks["Linear reg"] = rank_to_dict(lr.coef_, names)
+ranks["Ridge"] = rank_to_dict(ridge.coef_, names)
+ranks["Lasso"] = rank_to_dict(lasso.coef_, names)
+
+# Создаем пустой список для данных
+mean = {}
+# «Бежим» по списку ranks
+for key, value in ranks.items():
+ # «Пробегаемся» по списку значений ranks, которые являются парой имя:оценка
+ for item in value.items():
+ # имя будет ключом для нашего mean
+ # если элемента с текущим ключем в mean нет - добавляем
+ 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)
+
+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)
+
+f, pval = f_regression(X, Y, center=True)