import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression from sklearn.feature_selection import RFE from sklearn.ensemble import RandomForestRegressor from sklearn.preprocessing import MinMaxScaler # Используя код из [1](пункт «Решение задачи ранжирования признаков», стр. 205), # выполните ранжирование признаков с помощью указанных по варианту моделей. # Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку. # Проведите анализ получившихся результатов. # Какие четыре признака оказались самыми важными по среднему значению? # (Названия\индексы признаков и будут ответом на задание). # Линейная регрессия (LinearRegression) # Рекурсивное сокращение признаков (Recursive Feature Elimination –RFE), # Сокращение признаков Случайными деревьями (Random Forest Regressor) # Модели model_LR = LinearRegression() model_RFE = RFE(LinearRegression(), n_features_to_select=1) model_RFR = RandomForestRegressor() # Оценки моделей model_scores = {} # Cлучайные данные для регрессии def generation_data_and_start(): np.random.seed(0) size = 750 X_ = np.random.uniform(0, 1, (size, 14)) y_ = (10 * np.sin(np.pi * X_[:, 0] * X_[:, 1]) + 20 * (X_[:, 2] - .5) ** 2 + 10 * X_[:, 3] + 5 * X_[:, 4] ** 5 + np.random.normal(0, 1)) X_[:, 10:] = X_[:, :4] + np.random.normal(0, .025, (size, 4)) # DataFrame для данных data = pd.DataFrame(X_) data['y'] = y_ models_study_and_scores(data.drop('y', axis=1), data['y']) print_scores() # Обучение и оценка моделей def models_study_and_scores(X, y): # Линейная регрессия model_LR.fit(X, y) # Нормализация коэффициентов признаков norm_coef = MinMaxScaler().fit_transform(np.abs(model_LR.coef_).reshape(-1, 1)) model_scores["Линейная регрессия"] = norm_coef.flatten() # Рекурсивное сокращение признаков model_RFE.fit(X, y) # Нормализация рангов norm_rank = 1 - (model_RFE.ranking_ - 1) / (np.max(model_RFE.ranking_) - 1) model_scores["Рекурсивное сокращение признаков"] = norm_rank # Сокращение признаков Случайными деревьями model_RFR.fit(X, y) # Нормализация значений важности признаков norm_imp = MinMaxScaler().fit_transform(model_RFR.feature_importances_.reshape(-1, 1)) model_scores["Сокращение признаков Случайными деревьями"] = norm_imp.flatten() # Вывод оценок def print_scores(): print() print(f"---- Оценки признаков ----") print() for name, scores in model_scores.items(): print(f"{name}:") for feature, score in enumerate(scores, start=1): print(f"Признак №{feature}: {score:.3f}") print(f"Средняя оценка признаков: {np.mean(scores):.3f}") print() # 4 наиболее важных признака по среднему значению scores = np.mean(list(model_scores.values()), axis=0) sorted_f = sorted(enumerate(scores, start=1), key=lambda x: x[1], reverse=True) imp_features = sorted_f[:4] print("Четыре наиболее важных признака:") for f, score in imp_features: print(f"Признак №{f}: {score:.3f}") generation_data_and_start()