IIS_2023_1/basharin_sevastyan_lab_2/main.py

68 lines
3.4 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.datasets import make_regression
from sklearn.linear_model import Ridge, LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.feature_selection import RFE
from sklearn.preprocessing import MinMaxScaler
''' Задание
Используя код из [1](пункт «Решение задачи ранжирования признаков», стр. 205), выполните ранжирование признаков с
помощью указанных по вариантумоделей. Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и
среднюю оценку. Проведите анализ получившихся результатов. Какие четырепризнака оказались самыми важными по среднему
значению? (Названия\индексы признаков и будут ответом на задание).
Вариант 5.
Гребневая регрессия (Ridge), Рекурсивное сокращение признаков (Recursive Feature Elimination RFE),
Сокращение признаков Случайными деревьями (Random Forest Regressor).
'''
# создание данных
random_state = np.random.RandomState(2)
X, y = make_regression(n_samples=750, n_features=15, noise=0.1, random_state=random_state)
data = pd.DataFrame(X, columns=[f'Признак {i}' for i in range(X.shape[1])])
data['Целевая переменная'] = y
X = data.drop('Целевая переменная', axis=1)
y = data['Целевая переменная']
ridge = Ridge(alpha=1) # Гребневая регрессия
ridge.fit(X, y)
recFE = RFE(LinearRegression(), n_features_to_select=1) # Рекурсивное сокращение признаков
recFE.fit(X, y)
rfr = RandomForestRegressor() # Сокращение признаков Случайными деревьями
rfr.fit(X, y)
models = [('Ridge', ridge),
('RFE', recFE),
('RFR', rfr)]
model_scores = []
for name, model in models:
if name == 'Ridge':
coef = model.coef_
normalized_coef = MinMaxScaler().fit_transform(coef.reshape(-1, 1))
model_scores.append((name, normalized_coef.flatten()))
elif name == 'RFE':
rankings = model.ranking_
normalized_rankings = 1 - (rankings - 1) / (np.max(rankings) - 1)
model_scores.append((name, normalized_rankings))
elif name == 'RFR':
feature_importances = model.feature_importances_
normalized_importances = MinMaxScaler().fit_transform(feature_importances.reshape(-1, 1))
model_scores.append((name, normalized_importances.flatten()))
for name, scores in model_scores:
print(f"{name} оценки признаков:")
for feature, score in enumerate(scores, start=1):
print(f"Признак {feature}: {score:.2f}")
print(f"Средняя оценка: {np.mean(scores):.2f}")
all_feature_scores = np.mean(list(map(lambda x: x[1], model_scores)), axis=0)
sorted_features = sorted(enumerate(all_feature_scores, start=1), key=lambda x: x[1], reverse=True)
top_features = sorted_features[:4]
print("Четыре наиболее важных признака:")
for feature, score in top_features:
print(f"Признак {feature}: {score:.2f}")