diff --git a/kurmyza_pavel_lab_1/README.md b/kurmyza_pavel_lab_1/README.md new file mode 100644 index 0000000..99889fc --- /dev/null +++ b/kurmyza_pavel_lab_1/README.md @@ -0,0 +1,41 @@ +# Лабораторная работа №1 + +## ПИбд-41, Курмыза Павел, Вариант 13 + +### Данные: + +- make_moons (noise=0.3, random_state=rs) + +### Модели: + +- Линейную регрессию +- Полиномиальную регрессию (со степенью 3) +- Многослойный персептрон со 100-а нейронами в скрытом слое (alpha = 0.01) + +## Как запустить ЛР + +- Запустить файл main.py + +## Используемые технологии + +- Язык программирования Python +- Библиотеки: sklearn, matplotlib, numpy + +## Что делает программа + +После генерации набора данных с помощью функции make_moons(), программа создает графики для моделей, которые указаны в +задании. Затем она выводит в консоль качество данных для этих моделей. + +## Тесты + +### Консоль + +![Консольный вывод](console_output.jpg) + +### Графики + +![Графики](plots.jpg) + +### Вывод + +Исходя из этого, можно сделать вывод: лучший результат показала модель многослойного персептрона на 100 нейронах. \ No newline at end of file diff --git a/kurmyza_pavel_lab_1/console_output.jpg b/kurmyza_pavel_lab_1/console_output.jpg new file mode 100644 index 0000000..a32fbfc Binary files /dev/null and b/kurmyza_pavel_lab_1/console_output.jpg differ diff --git a/kurmyza_pavel_lab_1/main.py b/kurmyza_pavel_lab_1/main.py new file mode 100644 index 0000000..ddfbbed --- /dev/null +++ b/kurmyza_pavel_lab_1/main.py @@ -0,0 +1,91 @@ +from random import randrange +import numpy as np +from sklearn.neural_network import MLPClassifier +from sklearn.metrics import accuracy_score, mean_squared_error +from matplotlib import pyplot as plt +from sklearn.linear_model import LinearRegression +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import PolynomialFeatures +from sklearn.datasets import make_moons +from sklearn.pipeline import make_pipeline + +RANDOM_STATE = randrange(50) + +# Генерация случайных данных на основе случайного состояния + +X, y = make_moons(noise=0.3, random_state=RANDOM_STATE) + +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=RANDOM_STATE) + +# Полиномиальная регрессия (3 степень) + +DEGREE = 3 + +poly_regression = make_pipeline(PolynomialFeatures(degree=DEGREE), LinearRegression()) # создание модели +poly_regression.fit(X_train, y_train) # обучение +y_pred_poly_regression = poly_regression.predict(X_test) # предсказание + +# Линейная регрессия + +linear_regression = LinearRegression() # создание модели +linear_regression.fit(X_train, y_train) # обучение +y_pred_linear_regression = linear_regression.predict(X_test) # предсказание + +# Многослойный персептрон (100 нейронов) + +HIDDEN_LAYER_SIZES = 100 +ALPHA = 0.01 + +perceptron_100 = MLPClassifier(hidden_layer_sizes=(HIDDEN_LAYER_SIZES,), alpha=ALPHA, + random_state=RANDOM_STATE) # создание модели +perceptron_100.fit(X_train, y_train) # обучение +y_pred_perceptron_100 = perceptron_100.predict(X_test) # предсказание + +# Оценка точности и вывод в консоль + +acc_linear_regression = mean_squared_error(y_test, y_pred_linear_regression) +acc_poly_regression = mean_squared_error(y_test, y_pred_poly_regression) +acc_perceptron_100 = accuracy_score(y_test, y_pred_perceptron_100) + +print(f"Оценка точности: " + f"\n Линейная регрессия: {acc_linear_regression}" + f"\n Полиномиальная регрессия (3 степень): {acc_poly_regression}" + f"\n Многослойный персептрон (100 нейронов): {acc_perceptron_100}") + +# Предсказание классов для точек графика для их визуализации + +x_min, y_min = X[:, 0].min() - 0.5, X[:, 1].min() - 0.5 +x_max, y_max = X[:, 0].max() + 0.5, X[:, 1].max() + 0.5 + +xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02)) + +prediction_data = np.c_[xx.ravel(), yy.ravel()] + +Z_poly_regression = poly_regression.predict(prediction_data) +Z_poly_regression = Z_poly_regression.reshape(xx.shape) + +Z_linear_regression = linear_regression.predict(prediction_data) +Z_linear_regression = Z_linear_regression.reshape(xx.shape) + +Z_perceptron_100 = perceptron_100.predict(prediction_data) +Z_perceptron_100 = Z_perceptron_100.reshape(xx.shape) + + +# Отрисовка графиков + +def draw_graphic(title, nrows, ncols, index, Z): + plt.subplot(nrows, ncols, index) + plt.contourf(xx, yy, Z, alpha=0.8) + plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, alpha=0.6) + plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train) + plt.title(title) + plt.xlabel('1 признак') + plt.ylabel('2 признак') + + +draw_graphic('Линейная регрессия', 1, 3, 1, Z_linear_regression) +draw_graphic('Полиномиальная регрессия', 1, 3, 2, Z_poly_regression) +draw_graphic('Персептрон', 1, 3, 3, Z_perceptron_100) + +plt.tight_layout() +plt.show() diff --git a/kurmyza_pavel_lab_1/plots.jpg b/kurmyza_pavel_lab_1/plots.jpg new file mode 100644 index 0000000..9904780 Binary files /dev/null and b/kurmyza_pavel_lab_1/plots.jpg differ