IIS_2023_1/faskhutdinov_idris_lab_2/main.py

84 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from sklearn.linear_model import Ridge
from sklearn.feature_selection import f_regression
from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import MinMaxScaler
import numpy as np
# Вариант 6
# Используя код из источника (пункт «Решение задачи ранжирования признаков»,
# стр. 205), выполните ранжирование признаков с помощью указанных по
# варианту моделей. Отобразите получившиеся значения\оценки каждого
# признака каждым методом\моделью и среднюю оценку. Проведите анализ
# получившихся результатов. Какие четыре признака оказались самыми
# 45
# важными по среднему значению? (Названия\индексы признаков и будут
# ответом на задание).
# Гребневая регрессия (Ridge)
# Сокращение признаков Случайными деревьями (Random Forest Regressor)
# Линейная корреляция (f_regression)
# генерируем исходные данные: 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))
# 1. Гребневая регрессия
ridge = Ridge(alpha=7)
ridge.fit(X, Y)
# 2. Случайные деревья
randomforest = RandomForestRegressor(n_estimators=100, random_state=0)
randomforest.fit(X, Y)
# 3. Линейная корреляция
linear_corellation = f_regression(X, Y, center = True)[0]
# Создание списка с именами признаков
names = ["x%s" % i for i in range(1, 15)]
# Создается пустой словарь для хранения рангов признаков
ranks = {}
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))
ranks["Ridge"] = rank_to_dict(ridge.coef_, names)
ranks["Random Forest"] = rank_to_dict(randomforest.feature_importances_, names)
ranks["Linear Correlation"] = rank_to_dict(linear_corellation, names)
#Создаем пустой список для данных
mean = {}
#«Бежим» по списку ranks
for key, value in ranks.items():
#«Пробегаемся» по списку значений ranks, которые являются парой имя:оценка
for item in value.items():
#имя будет ключом для нашего mean
#если элемента с текущим ключем в mean нет - добавляем
if(item[0] not in mean):
mean[item[0]] = 0
#суммируем значения по каждому ключу-имени признака
mean[item[0]] += item[1]
#находим среднее по каждому признаку
for key, value in ranks.items():
ranks[key] = sorted(value.items(), key=lambda x: x[1], reverse=True)
for key, value in ranks.items():
print(key)
print(value)
sorted_mean = sorted(mean.items(), key=lambda x: x[1], reverse=True)
result = {}
for item in sorted_mean:
result[item[0]] = item[1]
print(f'{item[0]}: {item[1]}')