diff --git a/faskhutdinov_idris_lab_2/Readme.md b/faskhutdinov_idris_lab_2/Readme.md new file mode 100644 index 0000000..745673d --- /dev/null +++ b/faskhutdinov_idris_lab_2/Readme.md @@ -0,0 +1,57 @@ +# Лабораторная работа №2. Работа с типовыми наборами данных и различными моделями +## 6 вариант +### Задание: +Используя код из источника (пункт «Решение задачи ранжирования признаков», +стр. 205), выполните ранжирование признаков с помощью указанных по +варианту моделей. Отобразите получившиеся значения\оценки каждого +признака каждым методом\моделью и среднюю оценку. Проведите анализ +получившихся результатов. Какие четыре признака оказались самыми +важными по среднему значению? (Названия\индексы признаков и будут +ответом на задание). + +* Гребневая регрессия (Ridge) +* Сокращение признаков +Случайными деревьями (Random Forest Regressor) +* Линейная корреляция (f_regression) + + +### Как запустить лабораторную +1. Запустить файл main.py + +### Используемые технологии +1. Библиотека numpy +2. Библиотека scikit-learn +3. Python +4. IDE PyCharm + +### Описание лабораторной работы + +Программа выполняет ранжирование признаков в задаче регрессии. Сначала происходит генерация исходных данных с использованием 14 признаков X +Задается функция-выход: регрессионная проблема Фридмана. Добавляется зависимость признаков, после чего используются модели по варианту. Результаты обработки +сохраняются в словаре ranks, после чего сортируются и выводятся в консоль. + +### Результат +Программа выводит в консоль следующие данные: +* Ridge +[('x4', 1.0), ('x14', 0.92), ('x1', 0.76), ('x2', 0.75), ('x12', 0.67), ('x5', 0.61), ('x11', 0.59), ('x6', 0.08), ('x8', 0.08), ('x3', 0.06), ('x7', 0.03), ('x10', 0.01), ('x9', 0.0), ('x13', 0.0)] +* Random Forest +[('x14', 1.0), ('x2', 0.76), ('x1', 0.66), ('x4', 0.55), ('x11', 0.29), ('x12', 0.28), ('x5', 0.23), ('x3', 0.1), ('x13', 0.09), ('x7', 0.01), ('x6', 0.0), ('x8', 0.0), ('x9', 0.0), ('x10', 0.0)] +* Linear Correlation +[('x4', 1.0), ('x14', 0.98), ('x2', 0.45), ('x12', 0.44), ('x1', 0.3), ('x11', 0.29), ('x5', 0.04), ('x8', 0.02), ('x7', 0.01), ('x9', 0.01), ('x3', 0.0), ('x6', 0.0), ('x10', 0.0), ('x13', 0.0)] + +1. x4: 1.0 +2. x14: 0.92 +3. x1: 0.76 +4. x2: 0.75 +5. x12: 0.67 +6. x5: 0.61 +7. x11: 0.59 +8. x6: 0.08 +9. x8: 0.08 +10. x3: 0.06 +11. x7: 0.03 +12. x10: 0.01 +13. x9: 0.0 +14. x13: 0.0 + +В результате работы программы видно, что наиболее важными признаками оказались x4 и x14, другие оказались намного менее важными. Стоит отметить, что случайные деревья оказали существенно отличающийся результат, в сравнении с гребневой регрессией и линейной корреляцией. diff --git a/faskhutdinov_idris_lab_2/main.py b/faskhutdinov_idris_lab_2/main.py new file mode 100644 index 0000000..0dccacf --- /dev/null +++ b/faskhutdinov_idris_lab_2/main.py @@ -0,0 +1,84 @@ +from sklearn.linear_model import Ridge +from sklearn.feature_selection import f_regression +from sklearn.ensemble import RandomForestRegressor +from sklearn.preprocessing import MinMaxScaler +import numpy as np + +# Вариант 6 +# Используя код из источника (пункт «Решение задачи ранжирования признаков», +# стр. 205), выполните ранжирование признаков с помощью указанных по +# варианту моделей. Отобразите получившиеся значения\оценки каждого +# признака каждым методом\моделью и среднюю оценку. Проведите анализ +# получившихся результатов. Какие четыре признака оказались самыми +# 45 +# важными по среднему значению? (Названия\индексы признаков и будут +# ответом на задание). + +# Гребневая регрессия (Ridge) +# Сокращение признаков Случайными деревьями (Random Forest Regressor) +# Линейная корреляция (f_regression) + +# генерируем исходные данные: 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)) + +# 1. Гребневая регрессия + +ridge = Ridge(alpha=7) +ridge.fit(X, Y) + +# 2. Случайные деревья +randomforest = RandomForestRegressor(n_estimators=100, random_state=0) +randomforest.fit(X, Y) + +# 3. Линейная корреляция +linear_corellation = f_regression(X, Y, center = True)[0] + +# Создание списка с именами признаков +names = ["x%s" % i for i in range(1, 15)] +# Создается пустой словарь для хранения рангов признаков +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)) + +ranks["Ridge"] = rank_to_dict(ridge.coef_, names) +ranks["Random Forest"] = rank_to_dict(randomforest.feature_importances_, names) +ranks["Linear Correlation"] = rank_to_dict(linear_corellation, 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 ranks.items(): + ranks[key] = sorted(value.items(), key=lambda x: x[1], reverse=True) +for key, value in ranks.items(): + print(key) + print(value) + +sorted_mean = sorted(mean.items(), key=lambda x: x[1], reverse=True) +result = {} +for item in sorted_mean: + result[item[0]] = item[1] + print(f'{item[0]}: {item[1]}') \ No newline at end of file