IIS_2023_1/arzamaskina_milana_lab_2/main.py

84 lines
3.9 KiB
Python
Raw Normal View History

2023-11-20 16:21:41 +04:00
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import MinMaxScaler
# Используя код из [1](пункт «Решение задачи ранжирования признаков», стр. 205),
# выполните ранжирование признаков с помощью указанных по варианту моделей.
# Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку.
# Проведите анализ получившихся результатов.
# Какие четыре признака оказались самыми важными по среднему значению?
# (Названия\индексы признаков и будут ответом на задание).
# Линейная регрессия (LinearRegression)
# Рекурсивное сокращение признаков (Recursive Feature Elimination RFE),
# Сокращение признаков Случайными деревьями (Random Forest Regressor)
# Модели
model_LR = LinearRegression()
model_RFE = RFE(LinearRegression(), n_features_to_select=1)
model_RFR = RandomForestRegressor()
# Оценки моделей
model_scores = {}
# Cлучайные данные для регрессии
def generation_data_and_start():
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))
# DataFrame для данных
data = pd.DataFrame(X_)
data['y'] = y_
models_study_and_scores(data.drop('y', axis=1), data['y'])
print_scores()
# Обучение и оценка моделей
def models_study_and_scores(X, y):
# Линейная регрессия
model_LR.fit(X, y)
# Нормализация коэффициентов признаков
norm_coef = MinMaxScaler().fit_transform(np.abs(model_LR.coef_).reshape(-1, 1))
model_scores["Линейная регрессия"] = norm_coef.flatten()
# Рекурсивное сокращение признаков
model_RFE.fit(X, y)
# Нормализация рангов
norm_rank = 1 - (model_RFE.ranking_ - 1) / (np.max(model_RFE.ranking_) - 1)
model_scores["Рекурсивное сокращение признаков"] = norm_rank
# Сокращение признаков Случайными деревьями
model_RFR.fit(X, y)
# Нормализация значений важности признаков
norm_imp = MinMaxScaler().fit_transform(model_RFR.feature_importances_.reshape(-1, 1))
model_scores["Сокращение признаков Случайными деревьями"] = norm_imp.flatten()
# Вывод оценок
def print_scores():
print()
print(f"---- Оценки признаков ----")
print()
for name, scores in model_scores.items():
print(f"{name}:")
for feature, score in enumerate(scores, start=1):
print(f"Признак №{feature}: {score:.3f}")
print(f"Средняя оценка признаков: {np.mean(scores):.3f}")
print()
# 4 наиболее важных признака по среднему значению
scores = np.mean(list(model_scores.values()), axis=0)
sorted_f = sorted(enumerate(scores, start=1), key=lambda x: x[1], reverse=True)
imp_features = sorted_f[:4]
print("Четыре наиболее важных признака:")
for f, score in imp_features:
print(f"Признак №{f}: {score:.3f}")
generation_data_and_start()