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