kurmyza_pavel_lab_2 is ready #77
59
kurmyza_pavel_lab_2/README.md
Normal file
59
kurmyza_pavel_lab_2/README.md
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
# Лабораторная работа №2
|
||||||
|
|
||||||
|
## ПИбд-41, Курмыза Павел, Вариант 13
|
||||||
|
|
||||||
|
## Как запустить ЛР
|
||||||
|
|
||||||
|
- Запустить файл main.py
|
||||||
|
|
||||||
|
## Используемые технологии
|
||||||
|
|
||||||
|
- Язык программирования Python
|
||||||
|
- Библиотеки: sklearn, numpy
|
||||||
|
|
||||||
|
## Что делает программа
|
||||||
|
|
||||||
|
Выполняет ранжирование 14 признаков для регрессионной проблемы Фридмана с помощью моделей:
|
||||||
|
|
||||||
|
- Рекурсивное сокращение признаков (Recursive Feature Elimination – RFE)
|
||||||
|
- Сокращение признаков Случайными деревьями (Random Forest Regressor)
|
||||||
|
- Линейная корреляция (f_regression)
|
||||||
|
|
||||||
|
Отображение получившихся результатов: 4 самых важных признака по среднему значению, значения признаков для каждой
|
||||||
|
модели.
|
||||||
|
|
||||||
|
## Результаты
|
||||||
|
|
||||||
|
### RFE
|
||||||
|
|
||||||
|
{'x1': 1.0, 'x2': 1.0, 'x3': 1.0, 'x4': 1.0, 'x5': 1.0, 'x11': 1.0, 'x13': 1.0, 'x12': 0.86, 'x14': 0.71, 'x8': 0.57, '
|
||||||
|
x6': 0.43, 'x10': 0.29, 'x7': 0.14, 'x9': 0.0}
|
||||||
|
|
||||||
|
### RFR
|
||||||
|
|
||||||
|
{'x14': 1.0, 'x2': 0.84, 'x4': 0.77, 'x1': 0.74, 'x11': 0.36, 'x12': 0.35, 'x5': 0.28, 'x3': 0.12, 'x13': 0.12, 'x6':
|
||||||
|
0.01, 'x7': 0.01, 'x8': 0.01, 'x9': 0.01, 'x10': 0.0}
|
||||||
|
|
||||||
|
### f_regression
|
||||||
|
|
||||||
|
{'x4': 1.0, 'x14': 0.97, 'x2': 0.57, 'x12': 0.56, 'x1': 0.44, 'x11': 0.43, 'x5': 0.17, 'x8': 0.13, 'x7': 0.1, 'x9':
|
||||||
|
0.08, 'x10': 0.05, 'x6': 0.04, 'x3': 0.01, 'x13': 0.0}
|
||||||
|
|
||||||
|
### Средние значения
|
||||||
|
|
||||||
|
{'x1': 0.33, 'x2': 0.33, 'x3': 0.33, 'x4': 0.33, 'x5': 0.33, 'x11': 0.33, 'x13': 0.33, 'x12': 0.29, 'x14': 0.24, 'x8':
|
||||||
|
0.19, 'x6': 0.14, 'x10': 0.1, 'x7': 0.05, 'x9': 0.0}
|
||||||
|
|
||||||
|
## Вывод
|
||||||
|
|
||||||
|
По итогу тестирования было выявлено:
|
||||||
|
|
||||||
|
1. Модель рекурсивного сокращения признаков отдала предпочтение многим важным параметрам таким как x1, x2, x3, x4, x5,
|
||||||
|
x11, x13, x12, x14.
|
||||||
|
2. Модель сокращения признаков случайными деревьями выявила в качестве важных признаков x14, x2, x4, x1. Несмотря на то,
|
||||||
|
что признак x3 не был выявлен, его влияние может быть учтено через скоррелированный параметр x14.
|
||||||
|
3. Метод линейной корреляции (f_regression) сделал наилучшее взвешивание, отдав предпочтение прзинакам x4, x14, x2, x12.
|
||||||
|
Несмотря на то, что признаки x1 и x3 не были выявлены, их влияние может быть учтено через скоррелированные параметры
|
||||||
|
x12 и x14.
|
||||||
|
|
||||||
|
Согласно среднему значению, важными признаками являются: x1, x2, x3, x4, x5.
|
94
kurmyza_pavel_lab_2/main.py
Normal file
94
kurmyza_pavel_lab_2/main.py
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
from sklearn.linear_model import LinearRegression
|
||||||
|
from sklearn.feature_selection import RFE, f_regression
|
||||||
|
import numpy as np
|
||||||
|
from sklearn.preprocessing import MinMaxScaler
|
||||||
|
from operator import itemgetter
|
||||||
|
from sklearn.ensemble import RandomForestRegressor
|
||||||
|
|
||||||
|
|
||||||
|
def rank_to_dict(ranks, names):
|
||||||
|
ranks = np.abs(ranks)
|
||||||
|
|
||||||
|
minmax = MinMaxScaler()
|
||||||
|
|
||||||
|
ranks = minmax.fit_transform(np.array(ranks).reshape(FEATURES_AMOUNT, 1)).ravel()
|
||||||
|
ranks = map(lambda x: round(x, 2), ranks)
|
||||||
|
return dict(zip(names, ranks))
|
||||||
|
|
||||||
|
|
||||||
|
def flip_array(arr):
|
||||||
|
return -1 * arr + np.max(arr)
|
||||||
|
|
||||||
|
|
||||||
|
def sort_by_desc(dictionary):
|
||||||
|
return dict(sorted(dictionary.items(), key=itemgetter(1), reverse=True))
|
||||||
|
|
||||||
|
|
||||||
|
def calc_mean(ranks):
|
||||||
|
mean = {}
|
||||||
|
|
||||||
|
for key, value in ranks.items():
|
||||||
|
for item in value.items():
|
||||||
|
if item[0] not in mean:
|
||||||
|
mean[item[0]] = 0
|
||||||
|
mean[item[0]] += item[1]
|
||||||
|
|
||||||
|
for key, value in mean.items():
|
||||||
|
res = value / len(ranks)
|
||||||
|
mean[key] = round(res, 2)
|
||||||
|
|
||||||
|
return sort_by_desc(mean)
|
||||||
|
|
||||||
|
|
||||||
|
# Исходные данные составляют 750 строк-наблюдений и 14 столбцов-признаков
|
||||||
|
|
||||||
|
FEATURES_SIZE = 750
|
||||||
|
FEATURES_AMOUNT = 14
|
||||||
|
|
||||||
|
# Генерация случайных исходных данных
|
||||||
|
|
||||||
|
np.random.seed(0)
|
||||||
|
x = np.random.uniform(0, 1, (FEATURES_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, (FEATURES_SIZE, 4))
|
||||||
|
|
||||||
|
# Создаём модель рекурсивного сокращения признаков на основе линейной модели и обучаем её
|
||||||
|
|
||||||
|
regression = LinearRegression()
|
||||||
|
regression.fit(x, y)
|
||||||
|
rfe = RFE(regression)
|
||||||
|
rfe.fit(x, y)
|
||||||
|
|
||||||
|
# Создаём модель сокращения признаков случайными деревьями и обучаем её
|
||||||
|
|
||||||
|
rfr = RandomForestRegressor()
|
||||||
|
rfr.fit(x, y)
|
||||||
|
|
||||||
|
# Создаём модель линейной корреляции и обучаем её
|
||||||
|
|
||||||
|
f, _ = f_regression(x, y, center=False)
|
||||||
|
|
||||||
|
# Аккумулируем наименования признаков
|
||||||
|
|
||||||
|
features_names = ["x%s" % i for i in range(1, FEATURES_AMOUNT + 1)]
|
||||||
|
|
||||||
|
# Собираем отображения значений каждого признака каждой моделью
|
||||||
|
|
||||||
|
features_ranks = {
|
||||||
|
'RFE': sort_by_desc(rank_to_dict(flip_array(rfe.ranking_), features_names)),
|
||||||
|
'RFR': sort_by_desc(rank_to_dict(rfr.feature_importances_, features_names)),
|
||||||
|
'f_regression': sort_by_desc(rank_to_dict(f, features_names))
|
||||||
|
}
|
||||||
|
|
||||||
|
# Подсчитываем среднюю оценку и выводим результаты
|
||||||
|
|
||||||
|
print(f"Результаты:"
|
||||||
|
f"\n RFE \n{features_ranks['RFE']}"
|
||||||
|
f"\n RFR \n{features_ranks['RFR']}"
|
||||||
|
f"\n f_regression \n {features_ranks['f_regression']}"
|
||||||
|
f"\n Средние значения \n{calc_mean(features_ranks)}")
|
Loading…
Reference in New Issue
Block a user