Merge pull request 'zavrazhnova_svetlana_lab_2 is ready' (#10) from zavrazhnova_svetlana_lab_2 into main

Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/10
This commit is contained in:
Alexey 2023-10-02 19:37:05 +04:00
commit 6ad79769f3
4 changed files with 176 additions and 0 deletions

92
.idea/workspace.xml Normal file
View File

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="0ceb130e-88da-4a20-aad6-17f5ab4226ac" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/zavrazhnova_svetlana_lab_2/result.png" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Python Script" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="ProjectId" id="2VlZqWiOX68aCf0o2y0AtYJWURS" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"last_opened_file_path": "D:/ulstukek/Course4/IIS/IISLabs/IIS_2023_1"
}
}]]></component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\ulstukek\Course4\IIS\IISLabs\IIS_2023_1\zavrazhnova_svetlana_lab_1" />
</key>
</component>
<component name="RunManager">
<configuration name="zavrazhnova_svetlana_lab_2" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="IIS_2023_1" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/zavrazhnova_svetlana_lab_2" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/zavrazhnova_svetlana_lab_2/zavrazhnova_svetlana_lab_2.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="Python.zavrazhnova_svetlana_lab_2" />
</list>
</recent_temporary>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="0ceb130e-88da-4a20-aad6-17f5ab4226ac" name="Changes" comment="" />
<created>1695412818437</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1695412818437</updated>
</task>
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
</component>
</project>

View File

@ -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), что указывает на их минимальную значимость или наличие практически нулевых эффектов.

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -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]}')