68 lines
3.4 KiB
Python
68 lines
3.4 KiB
Python
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}")
|