Compare commits
14 Commits
savenkov_a
...
kurmyza_pa
| Author | SHA1 | Date | |
|---|---|---|---|
| e034d93062 | |||
| 71cad406c2 | |||
| a076fd78ae | |||
| 124f682c8b | |||
| 8834f99ecf | |||
| dd0d45ef93 | |||
| c7060e6719 | |||
|
|
23bc64c816 | ||
|
|
be1b6a74ae | ||
|
|
32821e551a | ||
|
|
10799cb639 | ||
|
|
0f61b37f8b | ||
|
|
3a68c16a44 | ||
|
|
716e7b7ee6 |
36
gusev_vladislav_lab_2/README.md
Normal 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 и округлены до сотых.
|
||||
|
||||
В конце формируем среднее по каждому признаку, сортируем по убыванию и выводим на экран.
|
||||
|
||||
Пример:
|
||||
|
||||

|
||||
|
||||
Признаки х4 и х14 имеют наивысшие ранги, что говорит об их наибольшей значимости для решения задачи
|
||||
|
||||
Далее x2 и x12 занимают второе место по значимости (средняя значимость)
|
||||
|
||||
х1, х11 ниже среднего
|
||||
|
||||
х5, х8, х7 низкая значимость
|
||||
|
||||
х9, х3, х13, х10, х6 очень низкая значимость
|
||||
|
||||
53
gusev_vladislav_lab_2/gusev_vladislav_lab_2.py
Normal 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]}')
|
||||
|
||||
BIN
gusev_vladislav_lab_2/img.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
24
gusev_vladislav_lab_5/README.md
Normal 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) Выводим графики
|
||||
|
||||
|
||||

|
||||
|
||||
### Вывод
|
||||
- Среднеквадарическая ошибка получилась довольно низкой, что говорит нам о точности тестовых и предсказанных значений, однако коэффициент детерминации получился крайне низким, даже отрицательным. Это значит, что модель не понимает зависимости данных.
|
||||
- Итог: гребневая модель регресси не применима к нашей задаче
|
||||
53944
gusev_vladislav_lab_5/diamonds_prices.csv
Normal file
34
gusev_vladislav_lab_5/gusev_vladislav_lab_5.py
Normal 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()
|
||||
BIN
gusev_vladislav_lab_5/img.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
46
kurmyza_pavel_lab_4/README.md
Normal 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 - это статистическая модель, которая в своей базовой форме использует логистическую функцию для
|
||||
моделирования двоичной зависимой переменной. В анализе регрессии, логистическая регрессия оценивает параметры
|
||||
логистической модели (вид бинарной регрессии).
|
||||
|
||||
Оценка точности модели:
|
||||
|
||||

|
||||
|
||||
## Вывод
|
||||
|
||||
По итогу тестирования было выявлено, что данная модель может быть использована для решения задачи предсказания
|
||||
возможности бронирования номера в отеле определенного типа. Однако, оценка точности модели и матрица неточностей
|
||||
указывают на то, что в 20-30% случаев модель будет ошибаться.
|
||||
119391
kurmyza_pavel_lab_4/hotel_bookings.csv
Normal file
47
kurmyza_pavel_lab_4/main.py
Normal 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}")
|
||||
BIN
kurmyza_pavel_lab_4/report.jpg
Normal file
|
After Width: | Height: | Size: 66 KiB |
37
podkorytova_yulia_lab_1/README.md
Normal 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 графика, отображающие данные, их классификацию и границы решения моделей.
|
||||
***
|
||||
### Пример выходных данных:
|
||||
***Качество моделей:***
|
||||

|
||||
|
||||
***Графики:***
|
||||

|
||||
***
|
||||
**Вывод**: результаты показали, что для сгенерированного набора данных из 3 моделей наиболее точной оказалась полиномиальная регрессия (со степенью 5), гребневая полиномиальная регрессия (со степенью 5, alpha= 1.0), которая идентична полиномиальной регрессии, стала второй по точности, а линейная регрессия показала самую низкую точность.
|
||||
45
podkorytova_yulia_lab_1/lr1.py
Normal 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()
|
||||
BIN
podkorytova_yulia_lab_1/plotRes.JPG
Normal file
|
After Width: | Height: | Size: 121 KiB |
BIN
podkorytova_yulia_lab_1/scoreRes.JPG
Normal file
|
After Width: | Height: | Size: 22 KiB |
42
podkorytova_yulia_lab_2/README.md
Normal 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 моделей и средние оценки признаков, выведенные в консоль.
|
||||
***
|
||||
### Пример выходных данных:
|
||||
**ОЦЕНКИ ПРИЗНАКОВ**
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
**СРЕДНИЕ ОЦЕНКИ ПРИЗНАКОВ**
|
||||

|
||||
***
|
||||
**Вывод**: результаты показали, что признаки "х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* в значимые.
|
||||
BIN
podkorytova_yulia_lab_2/f_regression.JPG
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
podkorytova_yulia_lab_2/lasso.JPG
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
podkorytova_yulia_lab_2/linear_regression.JPG
Normal file
|
After Width: | Height: | Size: 21 KiB |
67
podkorytova_yulia_lab_2/lr2.py
Normal 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])
|
||||
BIN
podkorytova_yulia_lab_2/mean.JPG
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
podkorytova_yulia_lab_2/ridge.JPG
Normal file
|
After Width: | Height: | Size: 20 KiB |
112
sergeev_evgenii_lab_2/lab2.py
Normal 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()
|
||||
47
sergeev_evgenii_lab_2/readme.md
Normal 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.
|
||||
16
zavrazhnova_svetlana_lab_5/README.md
Normal file
@@ -0,0 +1,16 @@
|
||||
# Задание
|
||||
Предсказать, является ли транзакция мошеннической или нет на основе других данных о транзакции, таких как сумма транзакции, местоположение, банк, возраст и пол клиента
|
||||
### Как запустить лабораторную работу:
|
||||
ЛР запускается в файле zavrazhnova_svetlana_lab_5.py через Run, а затем в консоли должны появится вычисления
|
||||
|
||||
### Технологии
|
||||
Методы PolynomialFeatures и LogisticRegression из библиотеки sklearn
|
||||
|
||||
### Что делает лабораторная:
|
||||
Обучаются модели логистической и полиномиальной регрессии на обучающих данных и используются эти модели для предсказания мошеннических транзакций на тестовых данных. Оценивается точность каждой модели с помощью метрики accuracy.
|
||||
|
||||
### Пример выходных значений:
|
||||

|
||||
|
||||
### Вывод:
|
||||
Точность полиномиальной регрессии и логистической регрессии равны 1.0, это означает, что обе модели предсказали метки классов на тестовом наборе данных без ошибок. То есть они смогли точно определить, является ли транзакция мошеннической или нет.
|
||||
87
zavrazhnova_svetlana_lab_5/fraud_dataset.csv
Normal 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
|
||||
|
BIN
zavrazhnova_svetlana_lab_5/result.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
41
zavrazhnova_svetlana_lab_5/zavrazhnova_svetlana_lab_5.py
Normal 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)
|
||||