IIS_2023_1/basharin_sevastyan_lab_2/main.py

68 lines
3.4 KiB
Python
Raw Normal View History

2023-10-29 14:03:33 +04:00
import numpy as np
2023-10-29 17:07:56 +04:00
import pandas as pd
from sklearn.datasets import make_regression
2023-10-29 15:23:51 +04:00
from sklearn.linear_model import Ridge, LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.feature_selection import RFE
2023-10-29 17:07:56 +04:00
from sklearn.preprocessing import MinMaxScaler
2023-10-29 15:23:51 +04:00
''' Задание
Используя код из [1](пункт «Решение задачи ранжирования признаков», стр. 205), выполните ранжирование признаков с
помощью указанных по вариантумоделей. Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и
среднюю оценку. Проведите анализ получившихся результатов. Какие четырепризнака оказались самыми важными по среднему
значению? (Названия\индексы признаков и будут ответом на задание).
Вариант 5.
Гребневая регрессия (Ridge), Рекурсивное сокращение признаков (Recursive Feature Elimination RFE),
Сокращение признаков Случайными деревьями (Random Forest Regressor).
'''
# создание данных
2023-10-29 17:07:56 +04:00
random_state = np.random.RandomState(2)
2023-10-29 15:23:51 +04:00
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['Целевая переменная']
2023-10-29 17:07:56 +04:00
ridge = Ridge(alpha=1) # Гребневая регрессия
ridge.fit(X, y)
2023-10-29 15:23:51 +04:00
2023-10-29 17:07:56 +04:00
recFE = RFE(LinearRegression(), n_features_to_select=1) # Рекурсивное сокращение признаков
recFE.fit(X, y)
2023-10-29 15:23:51 +04:00
2023-10-29 17:07:56 +04:00
rfr = RandomForestRegressor() # Сокращение признаков Случайными деревьями
rfr.fit(X, y)
2023-10-29 15:23:51 +04:00
2023-10-29 17:07:56 +04:00
models = [('Ridge', ridge),
2023-10-29 15:23:51 +04:00
('RFE', recFE),
('RFR', rfr)]
2023-10-29 17:07:56 +04:00
model_scores = []
2023-10-29 15:23:51 +04:00
for name, model in models:
2023-10-29 17:07:56 +04:00
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}")