Compare commits

...

14 Commits

Author SHA1 Message Date
e034d93062 kurmyza_pavel_lab_4 is ready 2023-10-28 10:00:04 +04:00
71cad406c2 Merge pull request 'gusev_vladislav_lab_5 is ready' (#90) from gusev_vladislav_lab_5 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/90
2023-10-27 11:38:00 +04:00
a076fd78ae Merge pull request 'gusev_vladislav_lab_2 is ready' (#89) from gusev_vladislav_lab_2 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/89
2023-10-27 11:37:46 +04:00
124f682c8b Merge pull request 'zavrazhnova_svetlana_lab_5' (#91) from zavrazhnova_svetlana_lab_5 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/91
2023-10-27 11:29:37 +04:00
8834f99ecf Merge pull request 'podkorytova_yulia_lab1 is ready' (#92) from podkorytova_yulia_lab_1 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/92
2023-10-27 11:19:18 +04:00
dd0d45ef93 Merge pull request 'podkorytova_yulia_lab2 is ready' (#93) from podkorytova_yulia_lab_2 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/93
2023-10-27 11:19:01 +04:00
c7060e6719 Merge pull request 'sergeev_evgenii_lab_2_is_done' (#94) from sergeev_evgenii_lab_2 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/94
2023-10-27 11:17:36 +04:00
yulia
23bc64c816 podkorytova_yulia_lab2 2023-10-27 05:35:21 +04:00
yulia
be1b6a74ae podkorytova_yulia_lab1 2023-10-27 01:23:28 +04:00
Евгений Сергеев
32821e551a Done lab2 2023-10-27 01:16:35 +04:00
Svetlnkk
10799cb639 fix conflict 2023-10-26 21:06:18 +04:00
vladg
0f61b37f8b gusev_vladislav_lab_5 is ready 2023-10-26 17:31:14 +04:00
vladg
3a68c16a44 gusev_vladislav_lab_2 is ready 2023-10-26 11:49:09 +04:00
Svetlnkk
716e7b7ee6 zavrazhnova_svetlana_lab_5 is ready 2023-10-20 17:51:44 +04:00
28 changed files with 174069 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
### Вариант 9
### Задание на лабораторную работу:
Выполнить ранжирование признаков с помощью указанных по варианту моделей:
- Лассо (Lasso)
- Сокращение признаков Случайными деревьями (Random Forest Regressor)
- Линейная корреляция (f_regression)
### Как запустить лабораторную работу:
Выполняем файл gusev_vladislav_lab_2.py, в консоль будут выведены результаты.
### Технологии
NumPy - библиотека для работы с многомерными массивами. Sklearn - библиотека с большим количеством алгоритмов машинного обучения.
### По коду
В начале генерируем исходные данные: 750 строк-наблюдений и 14 столбцов-признаков, задаем функцию-выход: регрессионную проблему Фридмана, добавляем зависимость признаков
Далее создаем пустой словарь для хранения рангов признаков, используем методы из библиотеки Sklearn: Lasso, RandomForestRegressor и f_regression для задания по варианту.
Далее необходимо объявить функцию def rank_to_dict(ranks, names): для соотнесения нашего списка рангов и списка оценок по признакам. Возвращает он словарь типа (имя_признака: оценка_признака) и оценки приведены к единому диапазону от 0 до 1 и округлены до сотых.
В конце формируем среднее по каждому признаку, сортируем по убыванию и выводим на экран.
Пример:
![img.png](img.png)
Признаки х4 и х14 имеют наивысшие ранги, что говорит об их наибольшей значимости для решения задачи
Далее x2 и x12 занимают второе место по значимости (средняя значимость)
х1, х11 ниже среднего
х5, х8, х7 низкая значимость
х9, х3, х13, х10, х6 очень низкая значимость

View File

@@ -0,0 +1,53 @@
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
#генерируем исходные данные: 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))
names = ["x%s" % i for i in range(1,15)]
#Создается пустой словарь для хранения рангов признаков
ranks = {}
#Lasso
lasso = Lasso(alpha=0.5)
lasso.fit(X, Y)
ranks["Lasso"] = dict(zip(names, lasso.coef_))
#Случайные деревья
rf = RandomForestRegressor(n_estimators=100)
rf.fit(X, Y)
ranks["Random Forest"] = dict(zip(names, rf.feature_importances_))
#Линейная корреляция
f_scores, p_values = f_regression(X, Y)
ranks["f_regression"] = dict(zip(names, f_scores))
def rank_to_dict(ranks, names):
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))
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]}')

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,24 @@
### Вариант 9
### Задание на лабораторную работу:
Использовать регрессию по варианту для данных из курсовой работы. Самостоятельно сформулировав задачу. Интерпретировать результаты и оценить, насколько хорошо он подходит для решения сформулированной задачи.
### Как запустить лабораторную работу:
Выполняем файл gusev_vladislav_lab_5.py, будет выведен график на экран.
### Технологии
NumPy - библиотека для работы с многомерными массивами. Mathplotlib - библиотека для визуализации данных двумерной и трехмерной графикой. Sklearn - библиотека с большим количеством алгоритмов машинного обучения.
### Задача
Мною было принято решение посмотреть, как зависит
### По коду
1) Для начала загружаем данные из csv файла
2) Разделяем данные на обучающее и тестовые
3) Рескейлим данные из столбца price, который был в диапозоне от 370 до 2700 к диапозону от 0 до 1
4) Обучаем модель, находим R^2 (среднеквадратическая ошибка) и коэффициент детерминации
5) Выводим графики
![img.png](img.png)
### Вывод
- Среднеквадарическая ошибка получилась довольно низкой, что говорит нам о точности тестовых и предсказанных значений, однако коэффициент детерминации получился крайне низким, даже отрицательным. Это значит, что модель не понимает зависимости данных.
- Итог: гребневая модель регресси не применима к нашей задаче

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,34 @@
import pandas as pd
from sklearn.linear_model import Ridge
from sklearn import metrics
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
import numpy as np
# загрузка данных из файла
data = pd.read_csv('diamonds_prices.csv')
scaler = MinMaxScaler()
x_train = data[['price', 'carat', 'depth']].iloc[0:round(len(data) / 100 * 99)]
y_train = data['table'].iloc[0:round(len(data) / 100 * 99)]
y_train = scaler.fit_transform(y_train.values.reshape(-1, 1)) # приводим к виду от 0 до 1
y_train = y_train.flatten()
x_test = data[['price', 'carat', 'depth']].iloc[round(len(data) / 100 * 99):len(data)]
y_test = data['table'].iloc[round(len(data) / 100 * 99):len(data)]
y_test = scaler.fit_transform(y_test.values.reshape(-1, 1)) # приводим к виду от 0 до 1
y_test = y_test.flatten()
rid = Ridge(alpha=1.0)
rid.fit(x_train.values, y_train)
y_predict = rid.predict(x_test.values)
mid_square = np.round(np.sqrt(metrics.mean_squared_error(y_test, y_predict)),3) # рассчёт Ср^2
coeff_determ = np.round(metrics.r2_score(y_test, y_predict), 2) # рассчёт коэффициента детерминации
plt.plot(y_test, c="red", label="y тестовые ")
plt.plot(y_predict, c="green", label="y предсказанные \n"
"Ср^2 = " + str(mid_square) + "\n"
"Coeff_determ = " + str(coeff_determ))
plt.legend(loc='upper right')
plt.title("Гребневая регрессия")
plt.show()

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

View File

@@ -0,0 +1,46 @@
# Лабораторная работа №4
## ПИбд-41, Курмыза Павел
Датасет по варианту: https://www.kaggle.com/datasets/jessemostipak/hotel-booking-demand.
Данный набор данных содержит информацию о бронировании городской и курортной гостиниц и включает в себя такие
сведения, как время бронирования, продолжительность пребывания, количество взрослых, детей и/или младенцев, количество
свободных парковочных мест и т.д.
## Как запустить ЛР
- Запустить файл main.py
## Используемые технологии
- Язык программирования Python
- Библиотеки: sklearn, numpy, pandas
## Что делает программа
Программа решает задачу регрессии на выбранном датасете: предсказание возможности бронирования номера в отеле
определенного типа (курортный отель или гостиничный). Решение достигается в несколько этапов:
- Предобработка данных
- Стандартизация данных и приведение их к виду, удобном для работы с моделями ML
- Использование модели логистической регрессии
- Оценка точности модели для решения данной задачи
## Тестирование
Для решения задачи регрессии была выбрана модель LogisticRegression.
LogisticRegression - это статистическая модель, которая в своей базовой форме использует логистическую функцию для
моделирования двоичной зависимой переменной. В анализе регрессии, логистическая регрессия оценивает параметры
логистической модели (вид бинарной регрессии).
Оценка точности модели:
![Отчет](report.jpg)
## Вывод
По итогу тестирования было выявлено, что данная модель может быть использована для решения задачи предсказания
возможности бронирования номера в отеле определенного типа. Однако, оценка точности модели и матрица неточностей
указывают на то, что в 20-30% случаев модель будет ошибаться.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,47 @@
import pandas as pd
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.metrics import classification_report
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# Считываем данные датасета
data = pd.read_csv('hotel_bookings.csv')
# Удаляем столбцы, содержащие неопределенные данные
data = data.drop(['country', 'agent', 'company'], axis=1)
data = data.dropna()
# Находим категориальные признаки
list_1 = list(data.columns)
list_cate = []
for i in list_1:
if data[i].dtype == 'object':
list_cate.append(i)
# Производим кодирование признаков в числовой формат для того, чтобы модель могла с ними работать
le = LabelEncoder()
for i in list_cate:
data[i] = le.fit_transform(data[i])
# Исключаем тип отеля из набора входных данных
y = data['hotel']
x = data.drop('hotel', axis=1)
# Выделяем данные для обучения и тестирования
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0, test_size=0.2)
# Создаем и обучаем модель логистической регрессии
reg = LogisticRegression()
reg.fit(x_train, y_train)
# Используем модель на тестовой выборке и оцениваем точность
y_pred_reg = reg.predict(x_test)
acc_reg = accuracy_score(y_test, y_pred_reg)
# Выводим результаты оценки точности и обучения
print("Classification Report is:\n", classification_report(y_test, y_pred_reg))
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred_reg))
print("\nTraining Score:", reg.score(x_train, y_train) * 100)
print(f"Accuracy Score of Logistic Regression is {acc_reg}")

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

View File

@@ -0,0 +1,37 @@
# Лабораторная работа 1. Работа с типовыми наборами данных и различными моделями
### Задание на лабораторную:
Используя код из пункта «Регуляризация и сеть прямого распространения», сгенерируйте определенный тип данных и сравните на нем 3 модели (по варианту). Постройте графики, отобразите качество моделей, объясните полученные результаты.
**Вариант 20.**
Данные: make_circles (noise=0.2, factor=0.5, random_state=rs)
Модели:
* Линейную регрессию
* Полиномиальную регрессию (со степенью 5)
* Гребневую полиномиальную регрессию (со степенью 5, alpha= 1.0)
***
### Как запустить лабораторную работу:
Для запуска лабораторной работы необходимо открыть файл `lr1.py`, нажать на ПКМ и в выпадающем списке выбрать опцию "Run".
***
### Технологии:
**NumPy (Numerical Python)** - это библиотека для научных вычислений в Python, которая обеспечивает эффективные вычисления и манипуляции с данными.
**Matplotlib** - это библиотека визуализации данных для языка программирования Python, которая предоставляет широкий спектр инструментов для создания различных типов графиков, диаграмм и визуализаций данных.
**Scikit-learn (Sklearn)** - это библиотека для языка программирования Python, которая предоставляет инструменты для разработки и применения различных алгоритмов машинного обучения, включая классификацию, регрессию, кластеризацию, снижение размерности и многое другое. Scikit-learn также предлагает функции для предобработки данных, оценки моделей и выбора наилучших параметров.
***
### Что делает лабораторная работа:
В лабораторной работе генерируется набор данных при помощи функции *make_circles* с параметрами из задания.
Далее происходит разделение данных на обучащий и тестовый наборы при помощи функции *train_test_split*.
После создаются 3 модели (линейная, полиномиальная и гребневая полиномиальная), а дальше происходит обучение моделей, предсказание и оценка качества.
Результатом работы являются показатели качества моделей, выведенные в консоль, и 3 графика, отображающие данные, их классификацию и границы решения моделей.
***
### Пример выходных данных:
***Качество моделей:***
![](scoreRes.jpg)
***Графики:***
![](plotRes.jpg)
***
**Вывод**: результаты показали, что для сгенерированного набора данных из 3 моделей наиболее точной оказалась полиномиальная регрессия (со степенью 5), гребневая полиномиальная регрессия (со степенью 5, alpha= 1.0), которая идентична полиномиальной регрессии, стала второй по точности, а линейная регрессия показала самую низкую точность.

View File

@@ -0,0 +1,45 @@
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.datasets import make_circles
from sklearn.linear_model import LinearRegression, Ridge
rs = np.random.RandomState(50)
X, y = make_circles(noise=0.2, factor=0.5, random_state=rs) # генерация данных
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=42)
# создание моделей
linear_regression = LinearRegression()
polynomial_regression = make_pipeline(PolynomialFeatures(degree=5), LinearRegression())
ridge_polynomial_regression = make_pipeline(PolynomialFeatures(degree=5), Ridge(alpha=1.0))
models = [("Линейная регрессия", linear_regression),
("Полиномиальная регрессия", polynomial_regression),
("Гребневая полиномиальная регрессия", ridge_polynomial_regression)]
# тренируем модель
for name, model in models:
model.fit(X_train, y_train) # обучение модели
y_predict = model.predict(X_test) # предсказание
score = model.score(X_train, y_train) # оценка качества
print(name + ': качество модели = ' + str(score))
# построение графиков
cm = plt.cm.RdBu
cm_bright = ListedColormap(['#FF0000', '#0000FF'])
for i, (name, model) in enumerate(models):
current_subplot = plt.subplot(1, 3, i + 1)
h = .02 # шаг регулярной сетки
x0_min, x0_max = X[:, 0].min() - .5, X[:, 0].max() + .5
x1_min, x1_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx0, xx1 = np.meshgrid(np.arange(x0_min, x0_max, h), np.arange(x1_min, x1_max, h))
Z = model.predict(np.c_[xx0.ravel(), xx1.ravel()])
Z = Z.reshape(xx0.shape)
current_subplot.contourf(xx0, xx1, Z, cmap=cm, alpha=.8)
current_subplot.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright)
current_subplot.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0.4)
plt.title(name)
plt.show()

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -0,0 +1,42 @@
# Лабораторная работа 2. Ранжирование признаков
### Задание на лабораторную:
Используя код из пункта «Решение задачи ранжирования признаков», выполните ранжирование признаков с помощью указанных по варианту моделей. Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку. Проведите анализ получившихся результатов. Какие четыре признака оказались самыми важными по среднему значению? (Названия\индексы признаков и будут ответом на задание).
**Вариант 20.** Линейная регрессия (LinearRegression), Гребневая регрессия
(Ridge), Лассо (Lasso), Линейная корреляция (f_regression).
***
### Как запустить лабораторную работу:
Для запуска лабораторной работы необходимо открыть файл `lr2.py`, нажать на ПКМ и в выпадающем списке выбрать опцию "Run".
***
### Технологии:
**NumPy (Numerical Python)** - это библиотека для научных вычислений в Python, которая обеспечивает эффективные вычисления и манипуляции с данными.
**Scikit-learn (Sklearn)** - это библиотека для языка программирования Python, которая предоставляет инструменты для разработки и применения различных алгоритмов машинного обучения, включая классификацию, регрессию, кластеризацию, снижение размерности и многое другое. Scikit-learn также предлагает функции для предобработки данных, оценки моделей и выбора наилучших параметров.
***
### Что делает лабораторная работа:
В лабораторной работе генерируются исходные данные (750 строк-наблюдений и 14 столбцов-признаков), задается зависимость для функции-выхода Y с использованием формулы регрессионной проблемы Фридмана, а также добавляется зависимость между признаками.
Далее создаются 4 модели (линейная регрессия, гребневая регрессия, лассо и линейная корреляция).
Для каждой модели происходит тренировка и оценка рангов признаков с помощью функции *rank_to_dict*.
Средние оценки признаков вычисляются при помощи функции *mean_ranks*.
Результатом работы являются оценки признаков для каждой из 4 моделей и средние оценки признаков, выведенные в консоль.
***
### Пример выходных данных:
**ОЦЕНКИ ПРИЗНАКОВ**
![](linear_regression.jpg)
![](ridge.jpg)
![](lasso.jpg)
![](f_regression.jpg)
**СРЕДНИЕ ОЦЕНКИ ПРИЗНАКОВ**
![](mean.jpg)
***
**Вывод**: результаты показали, что признаки "х4", "х1", "х2" и "х14" - это четыре самых важных признака по среднему значению, при этом признак "х14" был признан ошибочно значимым.
Модель *Лассо* выявила все значимые признаки (х1-х5), не взяв никакого лишнего.
Модель *Линейная регрессия* верно выявила значимость признаков *x1, x2, x3, х4*, но потеряла значимый признак *x5* и ошибочно включила признак *x11* в значимые.
Модель *Гребневая регрессия* верно выявила значимость признаков *x1, x2, x4, х5*, но потеряла значимый признак *x3* и ошибочно включила признак *x14* в значимые.
Модель *Линейная корреляция* верно выявила значимость признаков *x1, x2, x4*, но потеряла значимые признак *x3, х5* и ошибочно включила признаки *x12, х14* в значимые.

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -0,0 +1,67 @@
from sklearn.feature_selection import f_regression
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.preprocessing import MinMaxScaler
import numpy as np
def rank_to_dict(ranks, names):
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))
def mean_ranks(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]
for key, value in mean.items():
res = value / len(ranks)
mean[key] = round(res, 2)
sorted_mean = sorted(mean.items(), key=lambda x: x[1], reverse=True)
return sorted_mean
# генерируем исходные данные: 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))
# создаем модели
linear_regression = LinearRegression()
ridge = Ridge()
lasso = Lasso(alpha=.05)
f, pval = f_regression(X, Y, center=True)
models = [("Линейная регрессия", linear_regression),
("Гребневая регрессия", ridge),
("Лассо", lasso),
("Линейная корреляция", f)]
names = ["x%s" % i for i in range(1,15)] # список содержащий, имена признаков
ranks = {} # словарь для хранения рангов признаков
for (name, model) in models:
if name != "Линейная корреляция":
model.fit(X, Y) # тренируем модель
ranks[name] = rank_to_dict(model.coef_, names) # преобразуем признаки в словарь
else:
ranks[name] = rank_to_dict(model, names)
print("-----ОЦЕНКИ ПРИЗНАКОВ-----")
for key, value in ranks.items():
print(key, ":")
for item in value.items():
print(item[0], "-", item[1])
print()
print("---СРЕДНИЕ ОЦЕНКИ ПРИЗНАКОВ---")
for r in mean_ranks(ranks):
print(r[0], "-", r[1])

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,112 @@
from sklearn.feature_selection import RFE
from sklearn.linear_model import Ridge, Lasso, LinearRegression
from sklearn.preprocessing import MinMaxScaler
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
n_features = 10
n = 800
# Создаем группу графиков 4 на 3
figure = plt.figure(1, figsize=(16, 9))
# Создаем 4 графика
axis = figure.subplots(1, 4)
# Генерируем исходные данные: 750 строк-наблюдений и 10 столбцов-признаков
np.random.seed(0)
size = n
X = np.random.uniform(0, 1, (size, n_features))
# Задаем функцию-выход: регрессионную проблему Фридмана
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[:, n_features-4:] = X[:, :4] + np.random.normal(0, .025, (size, 4))
# Функция для преобразования вывода оценок к словарю
def rank_to_dict(r, tags):
r = np.abs(r)
minmax = MinMaxScaler()
r = minmax.fit_transform(np.array(r).reshape(n_features, 1)).ravel()
r = map(lambda x: round(x, 2), r)
return dict(zip(tags, r))
# Добавляет данные на графики
def add_scatter(k, v, i):
# График данных по каждой модели
pred = lambda x: "x" + str(x + 1)
axis[i].bar(list(pred(i) for i in range(n_features)), list(v.values()), label=k)
axis[i].set_title(k)
# Гребневая модель
ridge = Ridge()
ridge.fit(X, Y)
# Случайное Лассо
lasso = Lasso(alpha=.05)
lasso.fit(X, Y)
# Рекурсивное сокращение признаков
# Создаю классификатор для оценки важности признаков
rfe = RFE(estimator=LinearRegression(),
n_features_to_select=4) # сюда еще можно засунуть n_features_to_select=n - сохраняем
# определенное количество признаков
rfe.fit(X, Y)
# Создаем вывод
names = ["x%s" % i for i in range(1, n_features + 1)]
rfe_res = rfe.ranking_
# Приводим значения RFE модели к диапазону (0, 1)
for i in range(rfe_res.size):
rfe_res[i] = n_features - rfe_res[i]
ranks = {"Ridge": rank_to_dict(ridge.coef_, names), "Lasso": rank_to_dict(lasso.coef_, names),
"RFE": rank_to_dict(rfe.ranking_, names)}
# Создаем пустой список для данных
mean = {}
# «Бежим» по списку ranks
for key, value in ranks.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)
mean[key] = round(res, 2)
# Сортируем и распечатываем список
mean = dict(sorted(mean.items(), key=lambda y: y[1], reverse=True))
ranks["Mean"] = mean
for key, value in ranks.items():
ranks[key] = dict(sorted(value.items(), key=lambda y: y[1], reverse=True))
# Создаем DataFrame из результатов ранжирования
df = pd.DataFrame(ranks)
# Выводим результаты на экран
print("Ранжирование признаков:")
print(df)
# Визуализируем результаты
i = 0
for key, value in ranks.items():
add_scatter(key, value, i)
i += 1
plt.show()

View File

@@ -0,0 +1,47 @@
# Лабораторная работа 2. Ранжирование признаков
## Задание
Выполнить ранжирование признаков с помощью указанных по варианту моделей.
Отобразить получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку.
Провести анализ получившихся результатов. Определить, какие четыре признака оказались самыми важными по среднему значению.
Вариант 4 (24).
Модели:
* Гребневая регрессия (Ridge)
* Случайное Лассо (RandomizedLasso)
* Рекурсивное сокращение признаков (Recursive Feature Elimination RFE)
### Запуск программы
Файл lab2.py содержит и запускает программу
### Описание программы
Программа создаёт набор данных с 10 (n_features) признаками для последующего их ранжирования и обрабатывает тремя моделями по варианту.
Программа строит столбчатые диаграммы, которые показывают как распределились оценки важности признаков и выводит в консоль отсортированные по убыванию важности признаки.
Таким образом можно легко определить наиважнейшие признаки.
### Результаты тестирования
По результатам тестирования, можно сказать следующее:
* Гребневая регрессия показывает хорошие результаты, выделяет все 8 значимых признаков.
* Случайное лассо справляется хуже других моделей, выделяет только 4 значимых признака.
* Рекурсивное сокращение признаков показывает хорошие результаты, правильно выделяя 9 значимых признаков.
* Среднее значение позволяет c хорошей уверенностью определять истинные значимые признаки. (x4, x2, x1, x5)
Вывод:
Если вы хотите уменьшить размерность данных и выбрать определенное количество признаков, рассмотрите модель RFE.
Если вам важно сохранить все признаки, но учитывать их важность, модель Ridge может быть подходящей.
Если вам нужно сильно ужать данные и выбрать только наиболее важные признаки, рассмотрите модель Lasso.
Пример консольных результатов:
Ridge Lasso RFE Mean
x4 1.00 1.00 1.00 0.33
x2 0.73 0.68 1.00 0.24
x1 0.65 0.66 1.00 0.22
x5 0.40 0.26 0.50 0.13
x10 0.32 0.00 0.83 0.11
x7 0.24 0.00 0.67 0.08
x8 0.19 0.00 1.00 0.06
x9 0.03 0.00 0.33 0.01
x3 0.00 0.00 0.17 0.00
x6 0.00 0.00 0.00 0.00
По данным результатам можно заключить, что наиболее влиятельные признаки по убыванию: x4, x2, x1, x5.

View File

@@ -0,0 +1,16 @@
# Задание
Предсказать, является ли транзакция мошеннической или нет на основе других данных о транзакции, таких как сумма транзакции, местоположение, банк, возраст и пол клиента
### Как запустить лабораторную работу:
ЛР запускается в файле zavrazhnova_svetlana_lab_5.py через Run, а затем в консоли должны появится вычисления
### Технологии
Методы PolynomialFeatures и LogisticRegression из библиотеки sklearn
### Что делает лабораторная:
Обучаются модели логистической и полиномиальной регрессии на обучающих данных и используются эти модели для предсказания мошеннических транзакций на тестовых данных. Оценивается точность каждой модели с помощью метрики accuracy.
### Пример выходных значений:
![result.png](result.png)
### Вывод:
Точность полиномиальной регрессии и логистической регрессии равны 1.0, это означает, что обе модели предсказали метки классов на тестовом наборе данных без ошибок. То есть они смогли точно определить, является ли транзакция мошеннической или нет.

View File

@@ -0,0 +1,87 @@
transaction_id,transaction_amount,location,merchant,age,gender,fraud_label
1,1000.00,New York,ABC Corp,35,M,0
2,500.00,Chicago,XYZ Inc,45,F,0
3,2000.00,Los Angeles,ABC Corp,28,M,1
4,1500.00,San Francisco,XYZ Inc,30,F,0
5,800.00,Chicago,ABC Corp,50,F,0
6,3000.00,New York,XYZ Inc,42,M,1
7,1200.00,San Francisco,ABC Corp,55,F,0
8,900.00,Los Angeles,XYZ Inc,37,M,0
9,2500.00,Chicago,ABC Corp,33,F,1
10,1800.00,New York,XYZ Inc,48,M,0
11,750.00,San Francisco,ABC Corp,29,F,0
12,2200.00,Chicago,XYZ Inc,51,M,0
13,900.00,New York,ABC Corp,40,F,0
14,1600.00,Los Angeles,XYZ Inc,26,M,0
15,3000.00,San Francisco,ABC Corp,45,F,1
16,1200.00,Chicago,XYZ Inc,34,M,0
17,800.00,New York,ABC Corp,47,F,0
18,1900.00,Los Angeles,XYZ Inc,32,M,0
19,1100.00,San Francisco,ABC Corp,52,F,0
20,4000.00,Chicago,XYZ Inc,38,M,1
21,900.00,New York,ABC Corp,31,F,0
22,1700.00,Los Angeles,XYZ Inc,49,M,0
23,1000.00,San Francisco,ABC Corp,36,F,0
24,2300.00,Chicago,XYZ Inc,27,M,1
25,950.00,New York,ABC Corp,41,F,0
26,1400.00,Los Angeles,XYZ Inc,54,M,0
27,2800.00,San Francisco,ABC Corp,39,F,1
28,1100.00,Chicago,XYZ Inc,44,M,0
29,750.00,New York,ABC Corp,30,F,0
30,2000.00,Los Angeles,XYZ Inc,46,M,0
31,1250.00,San Francisco,ABC Corp,35,F,0
32,2100.00,Chicago,XYZ Inc,43,M,0
33,950.00,New York,ABC Corp,56,F,0
34,1800.00,Los Angeles,XYZ Inc,29,M,0
35,3200.00,San Francisco,ABC Corp,48,F,1
36,1300.00,Chicago,XYZ Inc,37,M,0
37,900.00,New York,ABC Corp,51,F,0
38,2000.00,Los Angeles,XYZ Inc,33,M,0
39,1050.00,San Francisco,ABC Corp,42,F,0
40,2400.00,Chicago,XYZ Inc,26,M,0
41,800.00,New York,ABC Corp,45,F,0
42,1500.00,Los Angeles,XYZ Inc,31,M,0
43,2800.00,San Francisco,ABC Corp,50,F,1
44,1350.00,Chicago,XYZ Inc,28,M,0
45,920.00,New York,ABC Corp,47,F,0
46,2000.00,Los Angeles,XYZ Inc,36,M,0
47,1125.00,San Francisco,ABC Corp,52,F,0
48,1900.00,Chicago,XYZ Inc,38,M,1
49,850.00,New York,ABC Corp,32,F,0
50,1750.00,Los Angeles,XYZ Inc,49,M,0
51,950.00,San Francisco,ABC Corp,27,F,0
52,2300.00,Chicago,XYZ Inc,41,M,0
53,850.00,New York,ABC Corp,54,F,0
54,1600.00,Los Angeles,XYZ Inc,39,M,0
55,3000.00,San Francisco,ABC Corp,46,F,1
56,1250.00,Chicago,XYZ Inc,35,M,0
57,800.00,New York,ABC Corp,56,F,0
58,2200.00,Los Angeles,XYZ Inc,29,M,0
59,1050.00,San Francisco,ABC Corp,48,F,0
60,4000.00,Chicago,XYZ Inc,37,M,1
61,950.00,New York,ABC Corp,30,F,0
62,1700.00,Los Angeles,XYZ Inc,49,M,0
63,1000.00,San Francisco,ABC Corp,36,F,0
64,2800.00,Chicago,XYZ Inc,27,M,1
65,900.00,New York,ABC Corp,41,F,0
66,1400.00,Los Angeles,XYZ Inc,54,M,0
67,3200.00,San Francisco,ABC Corp,39,F,1
68,1100.00,Chicago,XYZ Inc,44,M,0
69,750.00,New York,ABC Corp,30,F,0
70,2000.00,Los Angeles,XYZ Inc,46,M,0
71,1250.00,San Francisco,ABC Corp,35,F,0
72,2100.00,Chicago,XYZ Inc,43,M,0
73,950.00,New York,ABC Corp,56,F,0
74,1800.00,Los Angeles,XYZ Inc,29,M,0
75,3200.00,San Francisco,ABC Corp,48,F,1
76,1300.00,Chicago,XYZ Inc,37,M,0
77,900.00,New York,ABC Corp,51,F,0
78,2000.00,Los Angeles,XYZ Inc,33,M,0
79,1050.00,San Francisco,ABC Corp,42,F,0
80,2400.00,Chicago,XYZ Inc,26,M,0
81,800.00,New York,ABC Corp,45,F,0
82,1500.00,Los Angeles,XYZ Inc,31,M,0
83,2800.00,San Francisco,ABC Corp,50,F,1
84,1350.00,Chicago,XYZ Inc,28,M,0
85,920.00,New York,ABC Corp,47,F,0
86,2000.00,Los Angeles,XYZ Inc,36,M,0
1 transaction_id transaction_amount location merchant age gender fraud_label
2 1 1000.00 New York ABC Corp 35 M 0
3 2 500.00 Chicago XYZ Inc 45 F 0
4 3 2000.00 Los Angeles ABC Corp 28 M 1
5 4 1500.00 San Francisco XYZ Inc 30 F 0
6 5 800.00 Chicago ABC Corp 50 F 0
7 6 3000.00 New York XYZ Inc 42 M 1
8 7 1200.00 San Francisco ABC Corp 55 F 0
9 8 900.00 Los Angeles XYZ Inc 37 M 0
10 9 2500.00 Chicago ABC Corp 33 F 1
11 10 1800.00 New York XYZ Inc 48 M 0
12 11 750.00 San Francisco ABC Corp 29 F 0
13 12 2200.00 Chicago XYZ Inc 51 M 0
14 13 900.00 New York ABC Corp 40 F 0
15 14 1600.00 Los Angeles XYZ Inc 26 M 0
16 15 3000.00 San Francisco ABC Corp 45 F 1
17 16 1200.00 Chicago XYZ Inc 34 M 0
18 17 800.00 New York ABC Corp 47 F 0
19 18 1900.00 Los Angeles XYZ Inc 32 M 0
20 19 1100.00 San Francisco ABC Corp 52 F 0
21 20 4000.00 Chicago XYZ Inc 38 M 1
22 21 900.00 New York ABC Corp 31 F 0
23 22 1700.00 Los Angeles XYZ Inc 49 M 0
24 23 1000.00 San Francisco ABC Corp 36 F 0
25 24 2300.00 Chicago XYZ Inc 27 M 1
26 25 950.00 New York ABC Corp 41 F 0
27 26 1400.00 Los Angeles XYZ Inc 54 M 0
28 27 2800.00 San Francisco ABC Corp 39 F 1
29 28 1100.00 Chicago XYZ Inc 44 M 0
30 29 750.00 New York ABC Corp 30 F 0
31 30 2000.00 Los Angeles XYZ Inc 46 M 0
32 31 1250.00 San Francisco ABC Corp 35 F 0
33 32 2100.00 Chicago XYZ Inc 43 M 0
34 33 950.00 New York ABC Corp 56 F 0
35 34 1800.00 Los Angeles XYZ Inc 29 M 0
36 35 3200.00 San Francisco ABC Corp 48 F 1
37 36 1300.00 Chicago XYZ Inc 37 M 0
38 37 900.00 New York ABC Corp 51 F 0
39 38 2000.00 Los Angeles XYZ Inc 33 M 0
40 39 1050.00 San Francisco ABC Corp 42 F 0
41 40 2400.00 Chicago XYZ Inc 26 M 0
42 41 800.00 New York ABC Corp 45 F 0
43 42 1500.00 Los Angeles XYZ Inc 31 M 0
44 43 2800.00 San Francisco ABC Corp 50 F 1
45 44 1350.00 Chicago XYZ Inc 28 M 0
46 45 920.00 New York ABC Corp 47 F 0
47 46 2000.00 Los Angeles XYZ Inc 36 M 0
48 47 1125.00 San Francisco ABC Corp 52 F 0
49 48 1900.00 Chicago XYZ Inc 38 M 1
50 49 850.00 New York ABC Corp 32 F 0
51 50 1750.00 Los Angeles XYZ Inc 49 M 0
52 51 950.00 San Francisco ABC Corp 27 F 0
53 52 2300.00 Chicago XYZ Inc 41 M 0
54 53 850.00 New York ABC Corp 54 F 0
55 54 1600.00 Los Angeles XYZ Inc 39 M 0
56 55 3000.00 San Francisco ABC Corp 46 F 1
57 56 1250.00 Chicago XYZ Inc 35 M 0
58 57 800.00 New York ABC Corp 56 F 0
59 58 2200.00 Los Angeles XYZ Inc 29 M 0
60 59 1050.00 San Francisco ABC Corp 48 F 0
61 60 4000.00 Chicago XYZ Inc 37 M 1
62 61 950.00 New York ABC Corp 30 F 0
63 62 1700.00 Los Angeles XYZ Inc 49 M 0
64 63 1000.00 San Francisco ABC Corp 36 F 0
65 64 2800.00 Chicago XYZ Inc 27 M 1
66 65 900.00 New York ABC Corp 41 F 0
67 66 1400.00 Los Angeles XYZ Inc 54 M 0
68 67 3200.00 San Francisco ABC Corp 39 F 1
69 68 1100.00 Chicago XYZ Inc 44 M 0
70 69 750.00 New York ABC Corp 30 F 0
71 70 2000.00 Los Angeles XYZ Inc 46 M 0
72 71 1250.00 San Francisco ABC Corp 35 F 0
73 72 2100.00 Chicago XYZ Inc 43 M 0
74 73 950.00 New York ABC Corp 56 F 0
75 74 1800.00 Los Angeles XYZ Inc 29 M 0
76 75 3200.00 San Francisco ABC Corp 48 F 1
77 76 1300.00 Chicago XYZ Inc 37 M 0
78 77 900.00 New York ABC Corp 51 F 0
79 78 2000.00 Los Angeles XYZ Inc 33 M 0
80 79 1050.00 San Francisco ABC Corp 42 F 0
81 80 2400.00 Chicago XYZ Inc 26 M 0
82 81 800.00 New York ABC Corp 45 F 0
83 82 1500.00 Los Angeles XYZ Inc 31 M 0
84 83 2800.00 San Francisco ABC Corp 50 F 1
85 84 1350.00 Chicago XYZ Inc 28 M 0
86 85 920.00 New York ABC Corp 47 F 0
87 86 2000.00 Los Angeles XYZ Inc 36 M 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1,41 @@
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# Чтение данных из файла CSV
data = pd.read_csv('fraud_dataset.csv')
# Разделение данных на признаки (X) и целевую переменную (y)
X = data[['transaction_amount', 'location', 'merchant', 'age', 'gender']]
y = data['fraud_label']
# Преобразование категориальных признаков в числовые с помощью One-Hot Encoding
X = pd.get_dummies(X, columns=['location', 'merchant', 'age', 'gender'])
# Разделение данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Применение полиномиальной регрессии
poly = PolynomialFeatures(degree=2)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)
poly_reg = LogisticRegression(max_iter=1000)
poly_reg.fit(X_train_poly, y_train)
# Применение логистической регрессии
log_reg = LogisticRegression(max_iter=1000)
log_reg.fit(X_train, y_train)
# Предсказание меток классов на тестовом наборе данных
y_pred_poly = poly_reg.predict(X_test_poly)
y_pred = log_reg.predict(X_test)
# Вычисление точности предсказания
accuracy_poly = accuracy_score(y_test, y_pred_poly)
accuracy = accuracy_score(y_test, y_pred)
print('Точность полиномиальной регрессии:', accuracy_poly)
print('Точность логистической регрессии:', accuracy)