Merge pull request 'senkin_alexander_lab_2 is ready' (#110) from senkin_alexander_lab_2 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/110
This commit is contained in:
commit
02147c3d5f
1
senkin_alexander_lab_2/.gitignore
vendored
Normal file
1
senkin_alexander_lab_2/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.idea/
|
49
senkin_alexander_lab_2/README.md
Normal file
49
senkin_alexander_lab_2/README.md
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
Лабораторная №2
|
||||||
|
|
||||||
|
Вариант №2
|
||||||
|
|
||||||
|
Задание на лабораторную:
|
||||||
|
|
||||||
|
выполните ранжирование признаков с помощью указанных по
|
||||||
|
варианту моделей. Отобразите получившиеся значения\оценки каждого
|
||||||
|
признака каждым методом\моделью и среднюю оценку. Проведите анализ
|
||||||
|
получившихся результатов. Какие четыре признака оказались самыми
|
||||||
|
важными по среднему значению? (Названия\индексы признаков и будут
|
||||||
|
ответом на задание).
|
||||||
|
|
||||||
|
Модели:
|
||||||
|
|
||||||
|
- Линейная регрессия (LinearRegression)
|
||||||
|
- Рекурсивное сокращение
|
||||||
|
признаков (Recursive Feature Elimination – RFE)
|
||||||
|
- Сокращение признаков
|
||||||
|
Случайными деревьями (Random Forest Regressor)
|
||||||
|
|
||||||
|
Как запустить лабораторную работу:
|
||||||
|
|
||||||
|
Чтобы увидеть работу программы, нужно запустить исполняемый питон файл senkin_alexander_lab_2.py, после чего в консоли будут выведены все признаки, их ранжирование и топ 4 признака по среднему значению значимости.
|
||||||
|
|
||||||
|
Библиотеки
|
||||||
|
|
||||||
|
Numpy. иблиотека для работы с массивами и матрицами чисел. Она используется для создания и манипуляции данными.
|
||||||
|
|
||||||
|
Sklearn. Предоставляет инструменты и алгоритмы, которые упрощают задачи, связанные с машинным обучением.
|
||||||
|
|
||||||
|
Описание программы:
|
||||||
|
|
||||||
|
- Генерируем набор данных из 100 точек данных используя функцию make_circles
|
||||||
|
- С помощью функции train_test_split разделяем данные на тестовые и обучающие в соотношении 20 к 80
|
||||||
|
- Добавляем дополнительные признаки, чтобы в сумме было 20 признаков
|
||||||
|
- Создаем 3 модели:
|
||||||
|
- Линейную регрессию (LinearRegression)
|
||||||
|
- Рекурсивное сокращение признаков (Recursive Feature Elimination – RFE)
|
||||||
|
- Сокращение признаков Случайными деревьями (Random Forest Regressor)
|
||||||
|
- Обучаем модели и производим ранжирование
|
||||||
|
- Линейная регрессия дает ранжирование признаков на основе абсолютных коэффициентов.
|
||||||
|
- RFE (Рекурсивное сокращение признаков) ранжирует признаки на основе их значимости для модели.
|
||||||
|
- Random Forest Regressor оценивает важность признаков на основе их вклада в прогнозы модели.
|
||||||
|
- Посредством вычисления среднего ранжирования по всем трем методам мы определяем, какие признаки являются самыми важными с учетом всех трех методов.
|
||||||
|
|
||||||
|
![img.png](img.png)
|
||||||
|
|
||||||
|
Делаем вывод, что по среднему значению самыми важными признаками являются 3, 17, 19 и 20 признаки
|
BIN
senkin_alexander_lab_2/img.png
Normal file
BIN
senkin_alexander_lab_2/img.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 93 KiB |
50
senkin_alexander_lab_2/senkin_alexander_lab_2.py
Normal file
50
senkin_alexander_lab_2/senkin_alexander_lab_2.py
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import numpy as np
|
||||||
|
from sklearn.datasets import make_circles
|
||||||
|
from sklearn.model_selection import train_test_split
|
||||||
|
from sklearn.linear_model import LinearRegression
|
||||||
|
from sklearn.feature_selection import RFE
|
||||||
|
from sklearn.ensemble import RandomForestRegressor
|
||||||
|
|
||||||
|
# Создаем данные
|
||||||
|
rs = 42 # Установите желаемый random_state
|
||||||
|
X, y = make_circles(n_samples=100, noise=0.2, factor=0.5, random_state=rs)
|
||||||
|
|
||||||
|
# Добавим дополнительные признаки
|
||||||
|
X = np.column_stack((X, X**2, X**3, X**4, X**5, X**6, X**7, X**8, X**9, X**10))
|
||||||
|
|
||||||
|
# Разделяем данные на обучающий и тестовый наборы
|
||||||
|
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=rs)
|
||||||
|
|
||||||
|
# Линейная регрессия
|
||||||
|
lr = LinearRegression()
|
||||||
|
lr.fit(X_train, y_train)
|
||||||
|
lr_feature_ranking = np.abs(lr.coef_)
|
||||||
|
|
||||||
|
# RFE (Рекурсивное сокращение признаков)
|
||||||
|
rfe = RFE(lr, n_features_to_select=1)
|
||||||
|
rfe.fit(X_train, y_train)
|
||||||
|
rfe_feature_ranking = rfe.ranking_
|
||||||
|
|
||||||
|
# Случайные деревья
|
||||||
|
rf = RandomForestRegressor(random_state=rs)
|
||||||
|
rf.fit(X_train, y_train)
|
||||||
|
rf_feature_importance = rf.feature_importances_
|
||||||
|
|
||||||
|
# Создаем матрицу, где строки - это признаки, а столбцы - это методы
|
||||||
|
feature_rankings = np.vstack((lr_feature_ranking, rfe_feature_ranking, rf_feature_importance))
|
||||||
|
|
||||||
|
# Вычисляем среднюю оценку для каждого признака
|
||||||
|
mean_rankings = np.mean(feature_rankings, axis=0)
|
||||||
|
|
||||||
|
# Выводим ранжирование признаков и средние оценки
|
||||||
|
feature_names = [f"Feature {i}" for i in range(1, X_train.shape[1] + 1)]
|
||||||
|
for i, feature in enumerate(mean_rankings):
|
||||||
|
print(f'{feature_names[i]}: Linear Regression Rank = {lr_feature_ranking[i]:.2f}, RFE Rank = {rfe_feature_ranking[i]}, Random Forest Importance = {rf_feature_importance[i]:.2f}, Mean Rank = {feature:.2f}')
|
||||||
|
|
||||||
|
# Сортируем признаки по среднему значению
|
||||||
|
sorted_features = np.argsort(mean_rankings)
|
||||||
|
top_4_features = sorted_features[:4]
|
||||||
|
|
||||||
|
print("\nTop 4 features by mean ranking:")
|
||||||
|
for feature_index in top_4_features:
|
||||||
|
print(f'{feature_names[feature_index]}')
|
Loading…
Reference in New Issue
Block a user