from sklearn.linear_model import LinearRegression, Ridge, Lasso from sklearn.ensemble import RandomForestRegressor from sklearn.preprocessing import MinMaxScaler import numpy as np # Генерация исходных данных: 750 строк-наблюдений и 14 столбцов-признаков 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)) # Создание моделей и их обучение # Линейная модель lr = LinearRegression() lr.fit(X, Y) # Гребневая модель ridge = Ridge(alpha=7) ridge.fit(X, Y) # Лассо lasso = Lasso(alpha=.05) lasso.fit(X, Y) # Регрессор случайного леса rfr = RandomForestRegressor() rfr.fit(X, Y) # Список, содержащий имена признаков names = ["x%s" % i for i in range(1, 15)] # Функция создания записи в словаре оценок важности признаков def rank_to_dict(ranks): ranks = np.abs(ranks) minmax = MinMaxScaler() ranks = minmax.fit_transform(np.array(ranks).reshape(14, 1)).ravel() ranks = map(lambda x: round(x, 2), ranks) return dict(zip(names, ranks)) # Словарь, содержащий оценки важности признаков ranks_dict = dict() # Добавление записей в словарь ranks_dict["Linear regression"] = rank_to_dict(lr.coef_) ranks_dict["Ridge"] = rank_to_dict(ridge.coef_) ranks_dict["Lasso"] = rank_to_dict(lasso.coef_) ranks_dict["Random Forest Regressor"] = rank_to_dict(rfr.feature_importances_) def print_ranks(): for key, value in ranks_dict.items(): print(key) print(value) def print_ranks_sorted(): for key, value in ranks_dict.items(): print(key) value_sorted = sorted(value.items(), key=lambda x: x[1], reverse=True) print(value_sorted) def get_means(): # Создаем пустой список для средних оценок mean = {} for key, value in ranks_dict.items(): # Пробегаемся по словарю значений ranks, которые являются парой имя:оценка for item in value.items(): # Имя будет ключом для нашего mean # Если элемента с текущим ключом в mean нет - добавляем if item[0] not in mean: mean[item[0]] = 0 # Суммируем значения по каждому ключу-имени признака mean[item[0]] += item[1] # Находим среднее по каждому признаку for key, value in mean.items(): res = value / len(ranks_dict) mean[key] = round(res, 2) # сортируем список mean_sorted = sorted(mean.items(), key=lambda x: x[1], reverse=True) return mean_sorted def print_means(): for item in get_means(): print(item) print("Оценки каждого признака каждой моделью:") print_ranks() print("\nОценки каждого признака каждой моделью, отсортированные по убыванию:") print_ranks_sorted() print("\nСредние оценки признаков:") print_means()