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