From 2a1d17c98f7ffc8fa24c65697503585860cbe021 Mon Sep 17 00:00:00 2001 From: KondrashinMikhail Date: Sat, 25 Nov 2023 17:47:27 +0400 Subject: [PATCH] kondrashin_mikhail_lab_2_ready --- kondrashin_mikhail_lab_2/README.md | 36 +++++++++++++++++++ kondrashin_mikhail_lab_2/data.py | 12 +++++++ kondrashin_mikhail_lab_2/images/result.png | Bin 0 -> 41356 bytes kondrashin_mikhail_lab_2/main.py | 22 ++++++++++++ kondrashin_mikhail_lab_2/ranks.py | 40 +++++++++++++++++++++ 5 files changed, 110 insertions(+) create mode 100644 kondrashin_mikhail_lab_2/README.md create mode 100644 kondrashin_mikhail_lab_2/data.py create mode 100644 kondrashin_mikhail_lab_2/images/result.png create mode 100644 kondrashin_mikhail_lab_2/main.py create mode 100644 kondrashin_mikhail_lab_2/ranks.py diff --git a/kondrashin_mikhail_lab_2/README.md b/kondrashin_mikhail_lab_2/README.md new file mode 100644 index 0000000..871b9ea --- /dev/null +++ b/kondrashin_mikhail_lab_2/README.md @@ -0,0 +1,36 @@ +#### Кондрашин Михаил ПИбд-41 + +## Лабораторная работа 2. Ранжирование признаков + +### Задание: + +* Линейная регрессия (LinearRegression) +* Сокращение признаков случайными деревьями (Random Forest Regressor) +* Линейная корреляция (f_regression) + +### Запуск лабораторной работы: + +* установить `python`, `numpy`, `matplotlib`, `sklearn` +* запустить проект (стартовая точка класс `main.py`) + +### Используемые технологии: + +* Язык программирования `Python`, +* Библиотеки `numpy`, `matplotlib`, `sklearn` +* Среда разработки `IntelliJ IDEA` (В версии "Ultimate edition" можно писать на python) + +### Описание решения: + +Программа выполняет ранжирование признаков для регрессионной модели: +* Линейная регрессия (LinearRegression) +* Сокращение признаков Случайными деревьями (Random Forest Regressor) +* Линейная корреляция (f_regression) + +*14 признаков +*750 наблюдений + +### Результат: +![Result](images/result.png) +* Лучше всего показал себя метод линейной корреляции (x4, x14, x2, x12). Хотя признаки x1 и x3 не были выявлены, их влияние может быть учтено через скоррелированные параметры x12 и x14. +* Самые важные признаки по среднему значению: x1, x4, x2, x11 + diff --git a/kondrashin_mikhail_lab_2/data.py b/kondrashin_mikhail_lab_2/data.py new file mode 100644 index 0000000..ec8345d --- /dev/null +++ b/kondrashin_mikhail_lab_2/data.py @@ -0,0 +1,12 @@ +import numpy as np + + +def generate_data(): + size = 750 + np.random.seed(0) + 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)) + + return X, Y diff --git a/kondrashin_mikhail_lab_2/images/result.png b/kondrashin_mikhail_lab_2/images/result.png new file mode 100644 index 0000000000000000000000000000000000000000..b96745cef9f5334a941a91d5c876063180ccc929 GIT binary patch literal 41356 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
#)r&$Yd}G^#nx7Oevg(zTYYSI> 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 literal 0 HcmV?d00001 diff --git a/kondrashin_mikhail_lab_2/main.py b/kondrashin_mikhail_lab_2/main.py new file mode 100644 index 0000000..f08aa46 --- /dev/null +++ b/kondrashin_mikhail_lab_2/main.py @@ -0,0 +1,22 @@ +from sklearn.ensemble import RandomForestRegressor +from sklearn.feature_selection import f_regression +from sklearn.linear_model import LinearRegression + +from data import generate_data +from ranks import mean_calc_and_sort, get_ranks + + +if __name__ == '__main__': + x, y = generate_data() + + linear = LinearRegression() + linear.fit(x, y) + + rfr = RandomForestRegressor(bootstrap=True) + rfr.fit(x, y) + + f, p_val = f_regression(x, y, center=True) + + ranks = get_ranks(linear, rfr, f) + + print("mean", mean_calc_and_sort(ranks)) diff --git a/kondrashin_mikhail_lab_2/ranks.py b/kondrashin_mikhail_lab_2/ranks.py new file mode 100644 index 0000000..73461a3 --- /dev/null +++ b/kondrashin_mikhail_lab_2/ranks.py @@ -0,0 +1,40 @@ +import numpy as np +from sklearn.preprocessing import MinMaxScaler + + +def get_ranks(linear, rfr, f): + ranks = dict() + features = ["x%s" % i for i in range(1, 15)] + + ranks['Linear'] = rank_to_dict(linear.coef_, features) + ranks['RFR'] = rank_to_dict(rfr.feature_importances_, features) + ranks['f_reg'] = rank_to_dict(f, features) + + return ranks + + +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)) + + +def mean_calc_and_sort(ranks): + mean = {} + + for key, value in ranks.items(): + print(key, value) + for item in value.items(): + 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) + + return mean +