diff --git a/martysheva_tamara_lab_2/README.md b/martysheva_tamara_lab_2/README.md new file mode 100644 index 0000000..52d96bd --- /dev/null +++ b/martysheva_tamara_lab_2/README.md @@ -0,0 +1,49 @@ +# Лабораторная работа 2. Ранжирование признаков +### Вариант № 18 +Используя код из пункта «Решение задачи ранжирования признаков», +выполните ранжирование признаков с помощью указанных по +варианту моделей. Отобразите получившиеся оценки каждого +признака каждой моделью и среднюю оценку. Проведите анализ +получившихся результатов. Какие четыре признака оказались самыми +важными по среднему значению? (Названия\индексы признаков и будут +ответом на задание). + +**Модели**: +* Лассо (Lasso) +* Рекурсивное сокращение признаков (Recursive Feature Elimination – RFE) +* Линейная корреляция (f_regression) +*** +## *Как запустить лабораторную работу:* +Чтобы запустить программу, открываем файл lab2 в PyCharm и нажимаем на зеленый треугольник в правом верхнем углу. +*** +## *Использованные технологии:* +**Scikit-learn** - один из наиболее широко используемых пакетов Python для Data Science и Machine Learning. Он позволяет выполнять множество операций и предоставляет множество алгоритмов. + +**NumPy** — это фундаментальный пакет для научных вычислений на Python. + +**Pandas** — это библиотека с открытым исходным кодом, предоставляющая высокопроизводительные, простые в использовании структуры данных и инструменты анализа данных для языка программирования Python. + +**Operator** — предоставляет функции для встроенных операторов и функции для создания вызываемых объектов, которые извлекают элементы, атрибуты и методы вызова. +*** +## *Что делает ЛР:* +В данной работе анализируется работа нескольких моделей, способных оценить важность признаков +в регрессионной проблеме Фридмана. Генерируются исходные данные, в которых признаки x1-x5 +являются влиятельными, а признаки x11-x14 зависимыми от других признаков. Далее три модели (по варианту) +ранжируют признаки по их значимости. + +**Результатом работы программы** являются: вывод оценок важности признаков по моделям и вывод средних оценок важности признаков (в консоли). +*** +## *Пример выходных данных:* +>Вывод в консоли: + +![](https://sun9-4.userapi.com/impg/mWP_l-9Hew6DDSzL-XDoVtLC6x9V3smayeyJGw/0w0t35B3Bm0.jpg?size=604x266&quality=96&sign=5e50ac631ba8bb78ad8796d1e030a579&type=album) +![](https://sun9-74.userapi.com/impg/CgXruyB6e9nbe3LHxemcSRquslcD-M6YMzWmRA/WJ5QF0yTkBg.jpg?size=801x329&quality=96&sign=b11fa4cc83bf7a82ec6d280994193488&type=album) +*** +**Вывод**: +*Модель Лассо* отобрала признаки x1-x5 (кроме x3) как значимые параметры, а оценки всех остальных признаков приравняла к нулю. Ранжирование получилось весьма точным (включился бы x3 - было бы совсем точно), а зависимые признаки не были отмечены важными ни в какой степени. + +*Модель Рекурсивного сокращения признаков* сработала лучше Лассо: влиятельные признаки (x1-x5) и 2 из 4 зависимых признаков (x11 и x13) - обозначила точно значимыми. Оставшиеся зависимые признаки (x12 и x14) оценила чуть менее, но важными. + +*Модель Линейной корреляции* из значимых (x1-x5) выделила важным только x4, признаки x1 и x2 слабо важными, а x5 и x3 незначимыми. Среди зависимых признаков (x11-x14) важным оказался x14. + +Cамыми важными признаками по среднему значению оказались: x4, x2, x1, x5. diff --git a/martysheva_tamara_lab_2/lab2.py b/martysheva_tamara_lab_2/lab2.py new file mode 100644 index 0000000..5cbe201 --- /dev/null +++ b/martysheva_tamara_lab_2/lab2.py @@ -0,0 +1,71 @@ +from sklearn.linear_model import Lasso, LinearRegression +from sklearn.feature_selection import RFE, f_regression +from sklearn.preprocessing import MinMaxScaler +import numpy as np +import pandas as pd +from operator import itemgetter + +#Генерируем исходные данные +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)) + +#Создаем и тренируем модели +lasso = Lasso(alpha=.05) +lasso.fit(X, Y) +# +lr = LinearRegression() +lr.fit(X, Y) +rfe = RFE(lr) +rfe.fit(X, Y) +# +f, pval = f_regression(X, Y, center=True) + +# Функция для преобразования оценок признаков в словарь +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 average_ranks(ranks): + avg_ranks = {} + for key, value in ranks.items(): + for item in value.items(): + if (item[0] not in avg_ranks): + avg_ranks[item[0]] = 0 + avg_ranks[item[0]] += item[1] + + for key, value in avg_ranks.items(): + res = value / len(ranks) + avg_ranks[key] = round(res, 2) + avg_ranks = sorted(avg_ranks.items(), key=itemgetter(1), reverse=True) + return avg_ranks + +#Создаем список с именами признаков +names = ["x%s" % i for i in range(1, 15)] +ranks = dict() +#Применяем функцию к моделям +ranks["Lasso"] = rank_to_dict(lasso.coef_, names) +ranks["RFE"] = rank_to_dict(rfe.ranking_, names) +ranks["F_reg"] = rank_to_dict(f, names) +#Т.к. в RFE ранг "1" = признак важный, а если больше "1" - то менее важный +#поменяем оценки на противоположные +record_key = 'RFE' +for key, value in ranks[record_key].items(): + ranks[record_key][key] = 1 - value + +# Вывод оценок каждого признака +table_ranks = pd.DataFrame.from_dict(ranks, orient='columns') +print("Оценки важности признаков по моделям: Лассо, Рекурсивное сокращение признаков, Линейная корреляция:") +print(table_ranks) +# Вывод средних оценок каждого признака +table_avg_ranks = pd.DataFrame.from_records(average_ranks(ranks)) +print("Средние оценки важности признаков") +print(table_avg_ranks.to_string(index=False, header=False))