IIS_2023_1/antonov_dmitry_lab_2/lab2.py
2023-09-30 20:26:46 +04:00

72 lines
2.6 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 operator import itemgetter
from sklearn.feature_selection import f_regression
from sklearn.linear_model import LinearRegression, Ridge, Lasso
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))
# линейная модель
lr = LinearRegression()
lr.fit(X, Y)
# гребневая модель
ridge = Ridge(alpha=7)
ridge.fit(X, Y)
# Лассо
lasso = Lasso(alpha=.05)
lasso.fit(X, Y)
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 = {}
ranks["Linear reg"] = rank_to_dict(lr.coef_, names)
ranks["Ridge"] = rank_to_dict(ridge.coef_, names)
ranks["Lasso"] = rank_to_dict(lasso.coef_, 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=itemgetter(1), reverse=True)
print("MEAN")
print(mean)
for key, value in ranks.items():
ranks[key] = sorted(value.items(), key=itemgetter(1), reverse=True)
for key, value in ranks.items():
print(key)
print(value)
f, pval = f_regression(X, Y, center=True)