From 8c47411bf1b5219ae548d797a023de85cd643b08 Mon Sep 17 00:00:00 2001 From: DmitriyAntonov Date: Sun, 8 Oct 2023 10:52:30 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BB=D0=B0=D0=B1=D0=B0=203=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B0=D0=B4=D0=B81?= 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 deletions(-) delete mode 100644 antonov_dmitry_lab_2/README.md delete mode 100644 antonov_dmitry_lab_2/example.py delete mode 100644 antonov_dmitry_lab_2/lab2.py diff --git a/antonov_dmitry_lab_2/README.md b/antonov_dmitry_lab_2/README.md deleted file mode 100644 index 4dc1ae4..0000000 --- a/antonov_dmitry_lab_2/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# Лаб 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 deleted file mode 100644 index 0d6b861..0000000 --- a/antonov_dmitry_lab_2/example.py +++ /dev/null @@ -1,50 +0,0 @@ -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 deleted file mode 100644 index fe975dc..0000000 --- a/antonov_dmitry_lab_2/lab2.py +++ /dev/null @@ -1,71 +0,0 @@ -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)