Compare commits
6 Commits
zhelepov_a
...
sergeev_ev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d30447af5d | ||
|
|
ee9a6c0499 | ||
|
|
8942f824d5 | ||
|
|
f11ba4d365 | ||
| 9644582307 | |||
| 3d8201635c |
@@ -46,12 +46,12 @@ P.S. я знаю про хак "хочу скопировать у товари
|
||||
|
||||
4. Как только Вы закончили работу над лабораторной работой, то находясь в своей ветке (убедитесь в этом пожалуйста, использую команду git branch - ваша текущая ветка будет подсвечена), вы должны закоммитить и запушить свои изменения в репозиторий, другими словами сохранить их в репозиторий.
|
||||
|
||||
- git commit -m "zhelepov_alex_lab_1 is ready"
|
||||
- git push origin
|
||||
> git commit -m "zhelepov_alex_lab_1 is ready"
|
||||
> git push origin
|
||||
|
||||
P.S. я знаю про хак "скопируй у товарища и закоммить - все равно он (я) смотреть не будет" - не сработает - давайте быть честными и делать все самостоятельно. А во-вторых, на реальной работе так не прокатит - скорее всего Вас просто уволят.
|
||||
|
||||
5. После этого Вы должны перейти в наш gitlab и создать merge request, назначив его на меня. Дополнительно лучше маякнуть меня в нашем [телеграм-чате](https://t.me/+XSq2xEbEuD05N2Vi). Я проведу ревью и отпишу замечания, которые нужно будет исправить. Если все хорошо, то вмержу ваш pull-request в мастер-ветку. Данное состояние говорит о том, что ваша л/р принята.
|
||||
5. После этого Вы должны перейти в наш git и создать merge request, назначив его на меня. Дополнительно лучше маякнуть меня в нашем [телеграм-чате](https://t.me/+XSq2xEbEuD05N2Vi). Я проведу ревью и отпишу замечания, которые нужно будет исправить. Если все хорошо, то вмержу ваш pull-request в мастер-ветку. Данное состояние говорит о том, что ваша л/р принята.
|
||||
|
||||
6. **Важный момент**: Устно я не принимаю лабораторные работы (подойти к компьютеру, посмотреть код, поставить оценку), только через репозиторий и после успешного code review ревью кода вашей л/р и ее результатов в виде отчета. Это делается для того, чтобы вы привыкали к воркфлоу, который применяется практически всеми IT-компаниями, где между разработчиками в основном общение идет через "текст". Что касается лабораторных работ в расписании - они используются в качестве консультаций, а сдача и проверка л/р идет только через репозиторий (то есть все замечания вы получаете на code review). Проверяю я обычно лабораторную в течение 1-3 дней после создания pull-request-а (всегда можно маякнуть меня в нашем telegram-чате).
|
||||
|
||||
|
||||
92
sergeev_evgenii_lab_1/lab1.py
Normal file
92
sergeev_evgenii_lab_1/lab1.py
Normal file
@@ -0,0 +1,92 @@
|
||||
import numpy as np
|
||||
from matplotlib import pyplot as plt
|
||||
from matplotlib.colors import ListedColormap
|
||||
from sklearn.linear_model import LinearRegression, Ridge
|
||||
from sklearn.metrics import mean_squared_error
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.pipeline import make_pipeline
|
||||
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
|
||||
from sklearn.datasets import make_classification
|
||||
|
||||
# Просто рандомное число для генерации одних и тех же данных
|
||||
rs = 10
|
||||
|
||||
# Создаем данные с определенными параметрами
|
||||
# n_samples - количество объектов
|
||||
# n_features - количество признаков
|
||||
# n_redundant - количество ненужных признаков
|
||||
# n_informative - количество информативных признаков, которые учитываются (начиная с первого признака)
|
||||
# random_state - рандомное число для генерации одних и тех же данных
|
||||
# n_clusters_per_class - количество кластеров на класс
|
||||
# X - матрица признаков (объекты - строки), y - целевая переменная для предсказывания
|
||||
X, y = make_classification(n_samples=500,
|
||||
n_features=2,
|
||||
n_redundant=0,
|
||||
n_informative=2,
|
||||
random_state=rs,
|
||||
n_clusters_per_class=1)
|
||||
|
||||
# Стандартизируем данные
|
||||
X = StandardScaler().fit_transform(X)
|
||||
|
||||
# Разделяем наши данные на тестовые и тренировочные
|
||||
# test_size - % тренировочных
|
||||
# random_state - рандомное число для того, чтобы брать всегда определенные объекты
|
||||
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)
|
||||
|
||||
# Создаем рандомный генератор
|
||||
rng = np.random.RandomState(2)
|
||||
|
||||
# Добавляем "рандом" в данные
|
||||
X += 2 * rng.uniform(size=X.shape)
|
||||
linearly_dataset = (X, y)
|
||||
|
||||
# Создаем группу графиков 4 на 3
|
||||
figure = plt.figure(1, figsize=(16, 9))
|
||||
|
||||
# Создаем n графиков
|
||||
axis = figure.subplots(4)
|
||||
|
||||
# Лист цветов
|
||||
cm = ListedColormap(['#5b3655', "#18d1e4"])
|
||||
|
||||
# Переменная для ошибок регрессий
|
||||
errors = []
|
||||
|
||||
# Функция для выполнения всех регрессий (Линейной, полиномиальной, гребневой полиномиальной)
|
||||
def make_regression(model):
|
||||
# Тренируем
|
||||
model.fit(X_train, y_train)
|
||||
# Проверяем
|
||||
model = model.predict(X_test)
|
||||
# Вычисляем ошибку
|
||||
errors.append(mean_squared_error(y_test, model))
|
||||
return model
|
||||
|
||||
|
||||
# Добавляет данные на графики
|
||||
def add_scatter(label, data, i):
|
||||
# График данных по каждой модели
|
||||
axis[i].scatter(X_test[:, 0], X_test[:, 1], c=data, cmap=cm)
|
||||
axis[i].set_title(label)
|
||||
axis[i].set_xlabel('X')
|
||||
axis[i].set_ylabel('Y')
|
||||
|
||||
|
||||
# Получаем данные и добавляем для каждого график
|
||||
results = {add_scatter('Начальные', y_test, 0),
|
||||
add_scatter('Линейная регрессия', make_regression(LinearRegression()), 1),
|
||||
add_scatter('Полиномиальная регрессия',
|
||||
make_regression(make_pipeline(PolynomialFeatures(degree=3), LinearRegression())), 2),
|
||||
add_scatter('Гребневая полиномиальная регрессия',
|
||||
make_regression(make_pipeline(PolynomialFeatures(degree=3), Ridge(alpha=1.0))), 3)
|
||||
}
|
||||
|
||||
# Добавляем расстояние между графиками
|
||||
figure.subplots_adjust(hspace=0.5)
|
||||
plt.show()
|
||||
|
||||
# Сравнение качества регрессий
|
||||
print('Линейная - средняя ошибка', errors[0] * 100, ' %')
|
||||
print('Полиномиальная (степень=3) - средняя ошибка', errors[1] * 100, ' %')
|
||||
print('Гребневая (степень=3, alpha=1.0) - средняя ошибка', errors[2] * 100, ' %')
|
||||
34
sergeev_evgenii_lab_1/readme.md
Normal file
34
sergeev_evgenii_lab_1/readme.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Лабораторная работа 1. Работа с типовыми наборами данных и различными моделями
|
||||
## Задание
|
||||
Сгенерировать определенный тип данных и сравнить на нем 3 модели. Построить графики, отобразить качество моделей,
|
||||
объяснить полученные результаты.
|
||||
Вариант 3 (24)
|
||||
Данные: make_classification
|
||||
(n_samples=500, n_features=2, n_redundant=0, n_informative=2, random_state=rs, n_clusters_per_class=1)
|
||||
Модели:
|
||||
· Линейную регрессию
|
||||
· Полиномиальную регрессию (со степенью 3)
|
||||
· Гребневую полиномиальную регрессию (со степенью 3, alpha= 1.0)
|
||||
|
||||
|
||||
### Запуск программы
|
||||
Файл lab1.py содержит и запускает программу
|
||||
|
||||
### Описание программы
|
||||
Генерирует набор данных, показывает окно с графиками и пишет среднюю ошибку моделей обучения
|
||||
Использует библиотеки: matplotlib для демонстрации графиков и sklearn для создания и использования моделей.
|
||||
|
||||
### Результаты тестирования
|
||||
Для значения rs=10 результаты такие:
|
||||
y - linear_y - polyn_y - ridge_y
|
||||
0 - 0.092 - 0.058 - 0.062
|
||||
0 - 0.023 - -0.132 - -0.125
|
||||
1 - 1.32 - 0.789 - 0.8
|
||||
1 - 0.84 - 1.068 - 1.06
|
||||
|
||||
### Вывод
|
||||
Из представленных данных можно сделать вывод,
|
||||
что линейная регрессия и гребневая регрессия,
|
||||
в целом, предсказывают значения, близкие к исходным,
|
||||
и хорошо справляются с задачей. Полиномиальная регрессия
|
||||
иногда может давать менее точные прогнозы, особенно когда данные имеют сложную структуру.
|
||||
Reference in New Issue
Block a user