Merge pull request 'kochkareva_elizaveta_lab_1 is ready' (#193) from kochkareva_elizaveta_lab_1 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/193
This commit is contained in:
commit
1a80ebbe76
BIN
kochkareva_elizaveta_lab_1/LinearRegressionChart.png
Normal file
BIN
kochkareva_elizaveta_lab_1/LinearRegressionChart.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 92 KiB |
BIN
kochkareva_elizaveta_lab_1/PerceptronChart.png
Normal file
BIN
kochkareva_elizaveta_lab_1/PerceptronChart.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 106 KiB |
BIN
kochkareva_elizaveta_lab_1/PolynomialRegressionChart.png
Normal file
BIN
kochkareva_elizaveta_lab_1/PolynomialRegressionChart.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 93 KiB |
111
kochkareva_elizaveta_lab_1/README.md
Normal file
111
kochkareva_elizaveta_lab_1/README.md
Normal file
@ -0,0 +1,111 @@
|
||||
|
||||
# Лабораторная работа 1. Вариант 15
|
||||
|
||||
### Задание
|
||||
Сгенерировать данные:
|
||||
`
|
||||
make_classification (n_samples=500, n_features=2,
|
||||
n_redundant=0, n_informative=2, random_state=rs, n_clusters_per_class=1)
|
||||
`
|
||||
|
||||
Сравнить на нем 3 модели:
|
||||
- Линейную регрессию
|
||||
- Полиномиальную регрессию (со степенью 4)
|
||||
- Персептрон
|
||||
|
||||
### Как запустить лабораторную работу
|
||||
Для запуска программы необходимо с помощью командной строки в корневой директории файлов прокета прописать:
|
||||
```
|
||||
python main.py
|
||||
```
|
||||
### Какие технологии использовали
|
||||
- Библиотека *numpy* для работы с массивами.
|
||||
- Библиотека *matplotlib pyplot* - для визуализации данных.
|
||||
- Библиотека *sklearn*:
|
||||
- *make_classification* для создания синтетических наборов данных.
|
||||
- *LinearRegression* для создания и работы с моделью Линейной регрессии.
|
||||
- *Perceptron* для создания и работы с Персептроном
|
||||
- *accuracy_score* для использования функции, используемая для вычисления точности классификации.
|
||||
- *train_test_split* для разделения набора данных на обучающую и тестовую выборки.
|
||||
- *PolynomialFeatures* для создания преобразователя, который генерирует полиномиальные признаки из исходных признаков
|
||||
|
||||
### Описание лабораторной работы
|
||||
#### Генерация данных
|
||||
Программа создает синтетический набор данных, где переменная `X` будет содержать матрицу признаков размером `(n_samples, n_features)`, а переменная `y` будет содержать вектор целевых переменных размером `(n_samples,)`.
|
||||
```
|
||||
X, y = make_classification(n_samples=500, n_features=2, n_redundant=0,
|
||||
n_informative=2, random_state=None,
|
||||
n_clusters_per_class=1)
|
||||
```
|
||||
Добавляет шум к данным путем увеличения значений матрицы признаков `X` на случайные значения из равномерного распределения, умноженные на 2. Затем создает переменную, которая содержит кортеж из матрицы признаков `X` и вектора целевых переменных `y`. И разделяет данные на обучающий набор `(X_train, y_train)` и тестовый набор `(X_test, y_test)` с помощью функции `train_test_split`. Обучающий набор составляет 60% от исходных данных, а 40% от исходных данных используются для тестирования модели `(test_size=.4)`.
|
||||
```python
|
||||
rng = np.random.RandomState(2)
|
||||
X += 2 * rng.uniform(size=X.shape)
|
||||
linearly_dataset = (X, y)
|
||||
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=42)
|
||||
```
|
||||
#### Работа с моделью линейной регрессии
|
||||
Создаем экземпляр модели линейной регрессии с помощью класса `LinearRegression()`, которая будет использоваться для построения линейной регрессии. Обучаем модель на обучающем наборе данных `X_train` и `y_train` с помощью метода `fit()`. Затем используем обученную модель для прогнозирования целевых переменных на тестовом наборе данных `X_test` с помощью метода `predict()`. Полученные прогнозы сохраняются в переменную `y_pred`. И вычисляем коэффициент детерминации (R-квадрат) для для оценки качества модели регрессии на тестовом наборе данных с помощью метода `score()`.
|
||||
```python
|
||||
# Модель линейной регрессии
|
||||
model = LinearRegression()
|
||||
# Обучение на тренировочных данных
|
||||
model.fit(X_train, y_train)
|
||||
# Выполнение прогноза
|
||||
y_pred = model.predict(X_test)
|
||||
# Вычисление коэффициента детерминации
|
||||
r_sq = model.score(X_test, y_test)
|
||||
```
|
||||
Выполним построение графика:
|
||||
|
||||
|
||||
![График линейной регрессии](LinearRegressionChart.png)
|
||||
|
||||
#### Работа с моделью полиномиальной регрессии (со степенью 4)
|
||||
Создаем экземпляр класса `PolynomialFeatures` для генерации полиномиальных признаков со степень полинома 4 и параметр `include_bias=False`, чтобы исключить добавление дополнительного столбца с единицами (смещения). Преобразуем обучающий набор данных `X_train` и тестовый набор данных `X_test` в полиномиальные признаки с помощью метода `fit_transform()` и сохраняем в переменные `X_poly_train` и `X_poly_test` соотвественно. Создаем экземпляр модели линейной регрессии с помощью класса `LinearRegression()`. Обучаем модель линейной регрессии на обучающем наборе данных `X_poly_train` и `y_train` с помощью метода `fit()`. Используем обученную модель для прогнозирования целевых переменных на тестовом наборе данных `X_poly_test` с помощью метода `predict()`. И вычисляем коэффициент детерминации (R-квадрат) для модели на тестовом наборе данных с помощью метода `score()`.
|
||||
```python
|
||||
pf = PolynomialFeatures(degree=4, include_bias=False)
|
||||
# Преобразование исходного набора данных X_train в полиномиальные признаки
|
||||
X_poly_train = pf.fit_transform(X_train)
|
||||
# Преобразование исходного набора данных X_test в полиномиальные признаки
|
||||
X_poly_test = pf.fit_transform(X_test)
|
||||
# Модель линейной регрессии
|
||||
model = LinearRegression()
|
||||
# Обучение модели линейной регрессии на преобразованных полиномиальных признаках
|
||||
model.fit(X_poly_train, y_train)
|
||||
# Выполнение прогноза
|
||||
y_pred = model.predict(X_poly_test)
|
||||
# Вычисление коэффициента детерминации
|
||||
r_sq = model.score(X_poly_test, y_test)
|
||||
```
|
||||
Выполним построение графика:
|
||||
|
||||
|
||||
![График полиномиальной регрессии](PolynomialRegressionChart.png)
|
||||
|
||||
#### Работа с персептроном
|
||||
Создаем экземпляр модели персептрона `model = Perceptron()` и обучаем модель на тренировочных данных с помощью метода `fit()`. После обучения модели персептрона, выполняем прогноз на тестовых данных с помощью метода `predict()`. Для оценки точности работы персептрона используем функцию `accuracy_score`, которая сравнивает предсказанные классы `y_pred` с истинными классами `y_test` и возвращает долю правильно классифицированных примеров.
|
||||
```python
|
||||
# Модель персептрона
|
||||
model = Perceptron()
|
||||
# Обучение на тренировочных данных
|
||||
model.fit(X_train, y_train)
|
||||
# Выполнение прогноза
|
||||
y_pred = model.predict(X_test)
|
||||
# Вычисление точности работы персептрона
|
||||
accuracy = accuracy_score(y_test, y_pred)
|
||||
```
|
||||
Выполним построение графика:
|
||||
|
||||
|
||||
![График персептрона](PerceptronChart.png)
|
||||
|
||||
### Вывод
|
||||
|
||||
Исходя из построенных графиков можно сделать следующий вывод:
|
||||
|
||||
1. Коэффициент детерминации для полиномиальной регрессии (0,56) выше, чем для линейной регрессии (0,52). Это означает, что полиномиальная модель лучше объясняет изменчивость в данных, чем линейная модель. Однако значение 0.56 указывает на некоторую связь между предсказываемой переменной и независимыми переменными, но остается возможность для дальнейшего улучшения модели.
|
||||
|
||||
2. Доля правильно классифицированных примеров персептроном (0,845) также высокая. Это говорит о том, что персептрон успешно выполнил задачу классификации и хорошо разделил примеры на правильные классы.
|
||||
|
||||
В целом, можно сделать вывод, что и полиномиальная регрессия и персептрон проявляют лучшую производительность и демонстрируют лучшие результаты в анализе сгенерированных нами данных, чем линейная регрессия.
|
102
kochkareva_elizaveta_lab_1/main.py
Normal file
102
kochkareva_elizaveta_lab_1/main.py
Normal file
@ -0,0 +1,102 @@
|
||||
import os.path
|
||||
import numpy as np
|
||||
from matplotlib import pyplot as plt
|
||||
from sklearn.datasets import make_classification
|
||||
from sklearn.linear_model import LinearRegression, Perceptron
|
||||
from sklearn.metrics import accuracy_score
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.preprocessing import PolynomialFeatures
|
||||
|
||||
picfld = os.path.join('static', 'charts')
|
||||
|
||||
X, y = make_classification(n_samples=500, n_features=2, n_redundant=0,
|
||||
n_informative=2, random_state=None,
|
||||
n_clusters_per_class=1)
|
||||
# sklearn.datasets.samples_generator.make_classification - используется для создания случайных задач классификации N.
|
||||
# n_samples - Количество случайных чисел
|
||||
# n_features - количество признаков (измерений) для каждого числа.
|
||||
# n_informative - Количество информативных характеристик
|
||||
# n_redundant -количество избыточных признаков, которые не вносят дополнительной информации.
|
||||
# random_state - опциональный параметр для установки начального состояния генератора случайных чисел.
|
||||
# n_clusters_per_class - Количество кластера в каждой категории
|
||||
# Функция возвращает два значения:
|
||||
# X: массив размера [n_samples, n_features], содержащий сгенерированные признаки.
|
||||
# y: массив размера [n_samples], содержащий сгенерированные целевые переменные (классы).
|
||||
|
||||
rng = np.random.RandomState(2)
|
||||
# добавление шума к данным
|
||||
X += 2 * rng.uniform(size=X.shape)
|
||||
linearly_dataset = (X, y)
|
||||
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=42)
|
||||
|
||||
# Модель: линейная регрессия
|
||||
def linear_regression():
|
||||
# Модель линейной регрессии
|
||||
model = LinearRegression()
|
||||
# Обучение на тренировочных данных
|
||||
model.fit(X_train, y_train)
|
||||
# Выполнение прогноза
|
||||
y_pred = model.predict(X_test)
|
||||
# Вычисление коэффициента детерминации
|
||||
r_sq = model.score(X_test, y_test)
|
||||
# Создание графика
|
||||
plt.plot(y_test, c="#bd0000", label="\"y\" исходная")
|
||||
plt.plot(y_pred, c="#00BFFF", label="\"y\" предсказанная \n" "Кд = " + str(r_sq))
|
||||
plt.title("Линейная регрессия")
|
||||
plt.legend(loc='lower left')
|
||||
plt.savefig('static/charts/LinearRegressionChart.png')
|
||||
plt.close()
|
||||
|
||||
|
||||
# Модель: полиномиальная регрессия (со степенью 4)
|
||||
def polynomial_regression():
|
||||
# Генерирование объекта полинома,
|
||||
# где degree - степень полинома,
|
||||
# include_bias - установка вектора смещения в полиномиальные признаки
|
||||
pf = PolynomialFeatures(degree=4, include_bias=False)
|
||||
# Преобразование исходного набора данных X_train в полиномиальные признаки
|
||||
X_poly_train = pf.fit_transform(X_train)
|
||||
# Преобразование исходного набора данных X_test в полиномиальные признаки
|
||||
X_poly_test = pf.fit_transform(X_test)
|
||||
# Модель линейной регрессии
|
||||
model = LinearRegression()
|
||||
# Обучение модели линейной регрессии на преобразованных полиномиальных признаках
|
||||
model.fit(X_poly_train, y_train)
|
||||
# Выполнение прогноза
|
||||
y_pred = model.predict(X_poly_test)
|
||||
# Вычисление коэффициента детерминации
|
||||
r_sq = model.score(X_poly_test, y_test)
|
||||
# Создание графика
|
||||
plt.plot(y_test, c="#bd0000", label="\"y\" исходная")
|
||||
plt.plot(y_pred, c="#00BFFF",
|
||||
label="\"y\" предсказанная \n" "Кд = " + str(r_sq))
|
||||
plt.legend(loc='lower left')
|
||||
plt.title("Полиномиальная регрессия")
|
||||
plt.savefig('static/charts/PolynomialRegressionChart.png')
|
||||
plt.close()
|
||||
|
||||
|
||||
# Модель: персептрон
|
||||
def perceptron():
|
||||
# Модель персептрона
|
||||
model = Perceptron()
|
||||
# Обучение на тренировочных данных
|
||||
model.fit(X_train, y_train)
|
||||
# Выполнение прогноза
|
||||
y_pred = model.predict(X_test)
|
||||
# Вычисление точности работы персептрона
|
||||
accuracy = accuracy_score(y_test, y_pred)
|
||||
# Создание графика
|
||||
plt.plot(y_test, c="#bd0000", label="\"y\" исходная")
|
||||
plt.plot(y_pred, c="#00BFFF",
|
||||
label="\"y\" предсказанная \n" "Точность = " + str(accuracy))
|
||||
plt.legend(loc='lower left')
|
||||
plt.title("Персептрон")
|
||||
plt.savefig('static/charts/PerceptronChart.png')
|
||||
plt.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
linear_regression()
|
||||
polynomial_regression()
|
||||
perceptron()
|
Binary file not shown.
After Width: | Height: | Size: 92 KiB |
BIN
kochkareva_elizaveta_lab_1/static/charts/PerceptronChart.png
Normal file
BIN
kochkareva_elizaveta_lab_1/static/charts/PerceptronChart.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 106 KiB |
Binary file not shown.
After Width: | Height: | Size: 93 KiB |
Loading…
Reference in New Issue
Block a user