IIS_2023_1/romanova_adelina_lab_2
2023-11-28 01:00:12 +04:00
..
main.py romanova_adelina_lab_2 is ready 2023-11-28 01:00:12 +04:00
RandomizedLass.py romanova_adelina_lab_2 is ready 2023-11-28 01:00:12 +04:00
README.md romanova_adelina_lab_2 is ready 2023-11-28 01:00:12 +04:00
req.txt romanova_adelina_lab_2 is ready 2023-11-28 01:00:12 +04:00

Лабораторная работа №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, а не использовать коэффициенты признаков регрессионных моделей.