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}")
|