IIS_2023_1/arzamaskina_milana_lab_2/main.py

84 lines
3.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.

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()