diff --git a/senkin_alexander_lab_2/.gitignore b/senkin_alexander_lab_2/.gitignore new file mode 100644 index 0000000..e9aa8fb --- /dev/null +++ b/senkin_alexander_lab_2/.gitignore @@ -0,0 +1 @@ + .idea/ \ No newline at end of file diff --git a/senkin_alexander_lab_2/README.md b/senkin_alexander_lab_2/README.md new file mode 100644 index 0000000..a7a24c4 --- /dev/null +++ b/senkin_alexander_lab_2/README.md @@ -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 признаки \ No newline at end of file diff --git a/senkin_alexander_lab_2/img.png b/senkin_alexander_lab_2/img.png new file mode 100644 index 0000000..bec9f5a Binary files /dev/null and b/senkin_alexander_lab_2/img.png differ diff --git a/senkin_alexander_lab_2/senkin_alexander_lab_2.py b/senkin_alexander_lab_2/senkin_alexander_lab_2.py new file mode 100644 index 0000000..e0ed5b9 --- /dev/null +++ b/senkin_alexander_lab_2/senkin_alexander_lab_2.py @@ -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]}') \ No newline at end of file