Compare commits

...

2 Commits

2 changed files with 111 additions and 0 deletions

View File

@ -0,0 +1,63 @@
from sklearn.feature_selection import f_regression
from sklearn.linear_model import LinearRegression, Lasso, LassoCV
from sklearn.preprocessing import MinMaxScaler
import numpy as np
from tabulate import tabulate
#генерируем исходные данные: 750 строк-наблюдений и 14 столбцов-признаков
np.random.seed(1)
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))
#линейная модель
lr = LinearRegression()
lr.fit(X, Y)
#Лассо
lasso = LassoCV()
lasso.fit(X, Y)
#f_regression
f, pval = f_regression(X, Y, center=True)
def ranks_minmax(ranks):
ranks = np.abs(ranks)
minmax = MinMaxScaler()
ranks = minmax.fit_transform(np.array(ranks).reshape(14,1)).ravel()
return np.round(ranks, 2)
names = ["x%s" % i for i in range(1,15)]
lrCoef = ranks_minmax(lr.coef_)
lassoCoef = ranks_minmax(lasso.coef_)
fCoef = ranks_minmax(f)
mean = []
for i in range(len(lrCoef)):
mean.append(round((lrCoef[i] + lassoCoef[i] + fCoef[i]) / 3, 2))
firstRow = np.append(['Линейная регрессия'], lrCoef)
secondRow = np.append(['Лассо'], lassoCoef)
thirdRow = np.append(['Линейная корреляция'], fCoef)
fourthRow = np.append(['Среднее'], mean)
names = np.append(['Тип'], names)
print(tabulate([firstRow,
secondRow,
thirdRow,
fourthRow],
headers=names))
print()
print("Индексы максимальных значений")
print()
names = np.append(["Место по важности"], ["%s" % i for i in range(1,15)])
firstRow = np.append(['Линейная регрессия'], [1] + np.argsort(lrCoef)[::-1])
secondRow = np.append(['Лассо'], [1] + np.argsort(lassoCoef)[::-1])
thirdRow = np.append(['Линейная корреляция'], [1] + np.argsort(fCoef)[::-1])
fourthRow = np.append(['Среднее'], [1] + np.argsort(mean)[::-1])
print(tabulate([firstRow,
secondRow,
thirdRow,
fourthRow],
headers=names))

View File

@ -0,0 +1,48 @@
# Задание
Используя код из [1] (пункт «Решение задачи ранжирования признаков», стр. 205), выполните ранжирование признаков с помощью указанных по варианту моделей. Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку. Проведите анализ получившихся результатов. Какие четыре признака оказались самыми важными по среднему значению? (Названия\индексы признаков и будут ответом на задание).
## Задание по варианту
* Линейная регрессия (LinearRegression)
* Случайное Лассо (RandomizedLasso) : Не поддерживается текущей версией библиотеки, поэтому использовалось просто Losso
* Линейная корреляция (f_regression)
## Решение
### Запуск программы
Для запуска программы необходимо запустить файл main.py, содержащий код программы
### Используемые технологии
Программа использует следующие библиотеки:
- numpy - библиотека для работы с массивами и матрицами.
- matplotlib - библиотека для создания графиков и визуализации данных.
- sklearn - библиотека для машинного обучения и анализа данных.
- tabulate - библиотека для вывода данных в виде таблицы.
### Что делает программа
Программа генерирует набор из 750 строк случайных данных, по 14 свойствам. Далее с помощью трех различных моделей узнаем какие из параметров модели считают важными.
Программа выводит по 4 самых важных параметра для каждой модели.
### Тесты
Тип x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14
------------------- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----- ----- ----- ----- -----
Линейная регрессия 0.27 0.69 0.11 1 0.34 0 0 0.01 0 0.05 0.32 0 0.14 0.02
Лассо 0.28 0.71 0 1 0.35 0 0 0 0 0.04 0.34 0 0.01 0
Линейная корреляция 0.26 0.43 0.01 1 0.11 0 0.02 0 0 0 0.26 0.43 0.01 0.98
Среднее 0.27 0.61 0.04 1 0.27 0 0.01 0 0 0.03 0.31 0.14 0.05 0.33
Индексы максимальных значений
Место по важности 1 2 3 4 5 6 7 8 9 10 11 12 13 14
------------------- --- --- --- --- --- --- --- --- --- ---- ---- ---- ---- ----
Линейная регрессия 4 2 5 11 1 13 3 10 14 8 12 9 7 6
Лассо 4 2 5 11 1 10 13 14 12 9 8 7 6 3
Линейная корреляция 4 14 12 2 11 1 5 7 13 3 10 9 8 6
Среднее 4 2 14 11 5 1 12 13 3 10 7 9 8 6
Параметры x1-x5 напрямую влияют на результат.
Параметры x11-x14 зависят от них.
Параметры x5-x10 создают шум.
Это значит, что оценка результата выбора признаков моделью будет основываться на возможности выделить признаки x1-x5 и x11-x14 в топе признаков, при этом не захватив остальные признаки.
Модель линейной регрессии смогла выделить 7 важных признаков подряд.
Модель лассо выделила только 5 важных признаков подряд.
Модель линейной корреляции выделила 7 важных признаков подряд.
Это значит, что ни одна из трех моделей не смогла до конца определить все 9 важных признаков, делая часть из них не важными, или назначая шумовые признаки выше.
Отдельно стоит отметить модель линейной регрессии, хотя она не смогла выделить 9 признаков. Её выделение семи признаков содержит весь набор признаков x1-x5. А это означает, что благодаря модели линейной регрессии порог выборки можно задать так, что будут выбраны все параметры напрямую влияющие на результат. При этом выборка не будет содержать ни одного шумового параметра x6-x10.
Средний результат трех моделей, делает важными все параметры из набора x1-x5, x11-x14.
Вывод: Модель Линейной регрессии показала себя лучше всего, позволив отобрать самые важные параметры так, что в них войдут все параметры напрямую влияющие на результат.
Так при пороге в >0.05 в выборку войдут параметры x1-x5, x11, x13.
Кроме того использование среднего результата трех моделей тоже имеет место быть, как потенциально более стабильный вариант.