diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..b610ec7 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1695412818437 + + + + + + + \ No newline at end of file diff --git a/zavrazhnova_svetlana_lab_2/README.md b/zavrazhnova_svetlana_lab_2/README.md new file mode 100644 index 0000000..95eecf7 --- /dev/null +++ b/zavrazhnova_svetlana_lab_2/README.md @@ -0,0 +1,30 @@ +### Задание по варианту +Лассо (Lasso),Сокращение признаков Случайными деревьями (Random Forest Regressor), Линейная корреляция (f_regression) + +### Как запустить лабораторную работу +ЛР запускается через файл `zavrazhnova_svetlana_lab_2.py` + +### Какие технологии использовали +импорт класса `MinMaxScaler`, выполняющего масштабирование данных до заданного диапазона (от 0 до 1). +Необходимость его использования объясняется следующим: каждая модель регрессии дает оценки +важности признаков в своем диапазоне. Для того чтобы найти признак с максимальной средней важностью по трем моделям, нам необходимо привести выданные ими оценки к одному виду. +Модели линейной регрессии, ридж-регрессии и лассо-регрессии из библиотеки `scikit-learn` + +### Что делает +Применение регрессионных моделей для определения важности признаков. + +Результат работы программы показывает ранжирование признаков по их значимости для задачи. Чем больше значение ранга, тем более значимый признак. +Полученные ранги можно использовать для отбора наиболее значимых признаков и сокращения размерности данных. + +### Примеры выходных значений + +![example program result](result.png) + +В данном случае, в соответствии с полученными результатами, можно сказать следующее: + +1. Признаки 'x4' и 'x14' имеют наивысшие ранги (больше 380), что указывает на их большую значимость в решении задачи. +2. Признаки 'x2' и 'x12' имеют средние ранги (от 170 до 180), что означает их среднюю значимость. +3. Признаки 'x1' и 'x11' имеют ранги около 120, что указывает на их относительную значимость. +4. Признаки 'x5', 'x8' и 'x7' имеют низкие ранги (от 5 до 17), что говорит о их низкой значимости. +5. Признаки 'x9', 'x3', 'x13', 'x10' и 'x6' имеют очень низкие ранги (меньше 3), что указывает на их минимальную значимость или наличие практически нулевых эффектов. + diff --git a/zavrazhnova_svetlana_lab_2/result.png b/zavrazhnova_svetlana_lab_2/result.png new file mode 100644 index 0000000..2bda0ed Binary files /dev/null and b/zavrazhnova_svetlana_lab_2/result.png differ diff --git a/zavrazhnova_svetlana_lab_2/zavrazhnova_svetlana_lab_2.py b/zavrazhnova_svetlana_lab_2/zavrazhnova_svetlana_lab_2.py new file mode 100644 index 0000000..693ef46 --- /dev/null +++ b/zavrazhnova_svetlana_lab_2/zavrazhnova_svetlana_lab_2.py @@ -0,0 +1,54 @@ +from sklearn.linear_model import Lasso +from sklearn.ensemble import RandomForestRegressor +from sklearn.feature_selection import f_regression +from sklearn.preprocessing import MinMaxScaler +import numpy as np + +np.random.seed(0) +size = 750 +#входные данные. +X = np.random.uniform(0, 1, (size, 14)) + +#Генерируется целевая переменная Y на основе математической функции от входных данных X. +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)) + +names = ["x%s" % i for i in range(1,15)] +#Создается пустой словарь для хранения рангов признаков +ranks = {} + +#Создается экземпляр модели лассо-регрессии +lasso = Lasso(alpha=.05) +#Модель подгоняется под входные данные X и целевую переменную Y +lasso.fit(X, Y) +ranks["Lasso"] = dict(zip(names, lasso.coef_)) + +rf = RandomForestRegressor(n_estimators=100, random_state=0) +rf.fit(X, Y) +ranks["Random Forest"] = dict(zip(names, rf.feature_importances_)) + +f, _ = f_regression(X, Y, center=True) +ranks["f_regression"] = dict(zip(names, f)) + +def rank_to_dict(ranks, names): + ranks = np.abs(ranks) + minmax = MinMaxScaler() + #масштабирование рангов с помощью MinMaxScaler + ranks = minmax.fit_transform(np.array(ranks).reshape(-1, 1)).ravel() + ranks = map(lambda x: round(x, 2), ranks) + return dict(zip(names, ranks)) + +#словарь для хранения средних рангов признаков +mean = {} +for key, value in ranks.items(): + for item in value.items(): + if item[0] not in mean: + mean[item[0]] = 0 + mean[item[0]] += item[1] + +sorted_mean = sorted(mean.items(), key=lambda x: x[1], reverse=True) +result = {} +for item in sorted_mean: + result[item[0]] = item[1] + print(f'{item[0]}: {item[1]}')