# Лабораторная работа №2. Вариант 21 ## Тема: Ранжирование признаков ## Модели: - LinearRegression - RandomizedLasso - Recursive Feature Elimination (RFE) ## Как запустить программу: Установить *python, numpy, matplotlib, sklearn* ``` python main.py --top_k=6 ``` ## Какие технологии использовались: Язык программирования Python, библиотеки numpy, matplotlib, sklearn Среда разработки VSCode # Что делает лабораторная работа: Генерирует данные и обучает такие модели, как: ```LinearRegression, RandomizedLasso, Recursive Feature Elimination (RFE)``` Производиться ранжирование признаков с помощью моделей ```LinearRegression, RandomizedLasso, Recursive Feature Elimination (RFE)``` Отображение получившихся результатов: top_k самых важных признака по среднему значению, значения признаков для каждой модели Функция ```get_arguments()``` использует модуль argparse для обработки аргументов командной строки. В данном случае, скрипт ожидает аргумент --top_k, который по умолчанию установлен в 4. ``` def get_arguments(): parser = argparse.ArgumentParser() parser.add_argument('--top_k', type=int, default=4, help='Кол-во самых выжных признаков') args = parser.parse_args() return args ``` Функция ```data_gen()``` генерирует искусственные данные для регрессионной задачи. Здесь используется функция Фридмана для создания зависимости целевой переменной Y от признаков X. ``` def data_gen(): # --- генерируем исходные данные: 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)) return X, Y ``` Функция ```rank_to_dict()```, которая преобразует ранги признаков в словарь, нормализуя их значения от 0 до 1. ``` 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)) ``` Функция ```print_sorted_data()``` печатает отсортированные оценки признаков. Функцию ```estimation()``` вычисляет средние оценки признаков на основе данных о рангах. В блоке ```if __name__=="__main__":``` сначала получает аргументы командной строки, затем генерирует данные, обучает линейную регрессию, применяет рекурсивное сокращение признаков и случайное Лассо, а затем оценивает и выводит наиболее важные признаки с использованием средних оценок. ### Линейная регрессия (Linear Regression) Это простой метод машинного обучения, который используется для прогнозирования непрерывной переменной на основе одной или нескольких других переменных. В нашем случае линейная регрессия используется для обучения модели на данных, а затем коэффициенты модели используются для ранжирования важности признаков ### Рекурсивное сокращение признаков (RFE) Это метод выбора признаков, который работает путем итеративного удаления признаков и переобучения модели, чтобы определить, какие признаки наиболее важны для предсказания. В коде RFE используется для обучения модели на данных, а затем ранжирование признаков модели используется для ранжирования важности признаков ### Случайное Лассо (Randomized Lasso) Это метод регуляризации, который добавляет штраф к коэффициентам модели в зависимости от их величины. Это делается для предотвращения переобучения модели. В коде случайное Лассо используется для обучения модели на данных, а затем коэффициенты модели используются для ранжирования важности признаков ## Оценка работы моделей ``` {'x1': 0.33, 'x4': 0.23, 'x2': 0.2, 'x11': 0.2, 'x3': 0.17, 'x13': 0.16, 'x5': 0.06, 'x12': 0.06, 'x14': 0.04, 'x6': 0.01, 'x8': 0.01, 'x7': 0.0, 'x9': 0.0, 'x10': 0.0} --------------------------------------------------------------------------- Параметр - x1, значение - 0.33 Параметр - x4, значение - 0.23 Параметр - x2, значение - 0.2 Параметр - x11, значение - 0.2 --------------------------------------------------------------------------- Linear reg [('x1', 1.0), ('x4', 0.69), ('x2', 0.61), ('x11', 0.59), ('x3', 0.51), ('x13', 0.48), ('x5', 0.19), ('x12', 0.19), ('x14', 0.12), ('x8', 0.03), ('x6', 0.02), ('x10', 0.01), ('x7', 0.0), ('x9', 0.0)] RFE [('x9', 1.0), ('x7', 0.86), ('x10', 0.71), ('x6', 0.57), ('x8', 0.43), ('x14', 0.29), ('x12', 0.14), ('x1', 0.0), ('x2', 0.0), ('x3', 0.0), ('x4', 0.0), ('x5', 0.0), ('x11', 0.0), ('x13', 0.0)] RandomizedLasso [('x4', 1.0), ('x2', 0.37), ('x1', 0.36), ('x5', 0.32), ('x6', 0.02), ('x8', 0.02), ('x3', 0.01), ('x7', 0.0), ('x9', 0.0), ('x10', 0.0), ('x11', 0.0), ('x12', 0.0), ('x13', 0.0), ('x14', 0.0)] ``` Хуже всех показала себя модель случайного Лассо, потеряв три значимые признака и добавив один лишний. Модели линейной регрессии и RFE допустили по одной ошибке, однако последняя не потеряла ни одного значимого признака. Значимость в среднем получилась неудовлетворительной и выдала три ошибки, как и первая модель. Исходя из этого, можно сделать вывод, что для ранжирования признаков лучше использовать специально созданные для этого инструменты по типу RFE, а не использовать коэффициенты признаков регрессионных моделей.