diff --git a/verina_daria_lab_2/README.md b/verina_daria_lab_2/README.md new file mode 100644 index 0000000..e037536 --- /dev/null +++ b/verina_daria_lab_2/README.md @@ -0,0 +1,35 @@ +# IIS_2023_1 +

Задание

+

+Используя код из [1](пункт «Решение задачи ранжирования признаков», стр. 205), выполните ранжирование признаков с помощью указанных по варианту моделей. Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку. Проведите анализ получившихся результатов. Какие четыре признака оказались самыми важными по среднему значению? (Названия\индексы признаков и будут ответом на задание). +

+

+7 Вариант. +

+

Как запустить программу

+Запустить скрипт verina_daria_lab_2/main.py, после чего в консоль будут выведены результаты выполнения программы. +

Стек технологий

+

+

+ +

Описание кода

+

+Программа выполняет ранжирование и сравнение признаков с использованием трех различных методов: LassoCV, Lasso и Random Forest для последующего их ранжирования и обрабатывает тремя моделями по варианту. +Таким образом можно легко определить наиважнейшие признаки. +

+
Результат:
+ + +

+

+

\ No newline at end of file diff --git a/verina_daria_lab_2/main.py b/verina_daria_lab_2/main.py new file mode 100644 index 0000000..339b6df --- /dev/null +++ b/verina_daria_lab_2/main.py @@ -0,0 +1,71 @@ +from sklearn.linear_model import LassoCV +from sklearn.ensemble import RandomForestRegressor +from sklearn.feature_selection import RFE +from sklearn.preprocessing import MinMaxScaler +import numpy as np +import pandas as pd + +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)) + +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, size)) + +X[:, 10:] = X[:, :4] + np.random.normal(0, .025, (size, 4)) + +lasso_cv = LassoCV(alphas=np.linspace(0.001, 1, 100), cv=5) +lasso_cv.fit(X, Y) + +rf = RandomForestRegressor(n_estimators=100) +rfe = RFE(estimator=rf, n_features_to_select=1, step=1) +rfe.fit(X, Y) + +# названия признаков +names = ["x%s" % i for i in range(1, 15)] + +# Stable Randomized Lasso Simulation +n_resampling = 200 +rlasso_coefs = np.zeros((X.shape[1], n_resampling)) +for i in range(n_resampling): + Y_permuted = np.random.permutation(Y) + rlasso = LassoCV(alphas=np.linspace(0.001, 1, 100), cv=5) + rlasso.fit(X, Y_permuted) + rlasso_coefs[:, i] = rlasso.coef_ + +rlasso_scores = np.std(rlasso_coefs, axis=1) + +# словарь для ранжирования +ranks = {"Lasso": rank_to_dict(lasso_cv.coef_, names), + "RFE": rank_to_dict(rfe.ranking_, names), + "RandomizedLassoSim": rank_to_dict(rlasso_scores, names)} + +mean = {} +for method, values in ranks.items(): + for feature, score in values.items(): + # Если элемента с текущим ключом в mean нет - добавляем + if feature not in mean: + mean[feature] = 0 + # Суммируем значения по каждому ключу-имени признака + mean[feature] += score +df_ranks = pd.DataFrame(ranks) + +# Выводим ранжирование +print("ПО КАЖДОМУ МЕТОДУ:") +print(df_ranks) + +# Находим среднее по каждому признаку +for feature, score in mean.items(): + mean[feature] = round(score / len(ranks), 2) + +# Отсортированные средние значени +mean = sorted(mean.items(), key=lambda x: x[1], reverse=True) +print("СРЕДНИЕ") +print(mean) diff --git a/verina_daria_lab_2/result1.png b/verina_daria_lab_2/result1.png new file mode 100644 index 0000000..9479691 Binary files /dev/null and b/verina_daria_lab_2/result1.png differ diff --git a/verina_daria_lab_2/result2.png b/verina_daria_lab_2/result2.png new file mode 100644 index 0000000..8650a67 Binary files /dev/null and b/verina_daria_lab_2/result2.png differ