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