IIS_2023_1/belyaeva_ekaterina_lab_2/main.py
2023-10-20 16:12:55 +04:00

74 lines
2.9 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
# генерируем исходные данные: 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))
# Гребневая регрессия
ridge = Ridge(alpha=7)
ridge.fit(X, Y)
# Случайные деревья
rf = RandomForestRegressor(n_estimators=100, random_state=0)
rf.fit(X, Y)
ranks = {}
names = ["x%s" % i for i in range(1, 15)]
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(rf.feature_importances_, names)
# Вычисляем коэффициенты корреляции между признаками и целевой переменной
correlation_coeffs = f_regression(X, Y)[0]
# Добавляем результаты корреляции в словарь ranks
ranks["Correlation"] = rank_to_dict(correlation_coeffs, 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 mean.items():
res = value / len(ranks)
mean[key] = round(res, 2)
# Сортируем и распечатываем список
mean = sorted(mean.items(), key=lambda x: x[1], reverse=True)
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)
print("Mean Importance:")
for item in mean:
print(item[0], ":", item[1])