diff --git a/zhukova_alina_lab_1/flask-server.py b/zhukova_alina_lab_1/flask-server.py new file mode 100644 index 0000000..5ae9d12 --- /dev/null +++ b/zhukova_alina_lab_1/flask-server.py @@ -0,0 +1,194 @@ +import array +import math +import random + +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.colors import ListedColormap +from sklearn.model_selection import train_test_split +from sklearn.datasets import make_moons, make_circles, make_classification +from sklearn.neural_network import MLPClassifier +from sklearn.linear_model import LinearRegression, Lasso, Ridge, Perceptron +from sklearn.metrics import accuracy_score + +from flask import Flask + +app = Flask(__name__) + +@app.route("/") +def home(): + return "" \ + "

Жукова Алина ПИбд-41

" \ + "

Лабораторная работа №1

" \ + "" \ + "" \ + "
" \ + "
" \ + "" \ + "
" \ + "
" \ + "" + + +# Работа с типовыми наборами данных и различными моделями +# сгенерируйте определенный тип данных и сравните на нем 3 модели +# 10.Данные: make_moons (noise=0.3, random_state=rs) +# Модели: +# · Линейную регрессию +# · Многослойный персептрон с 10-ю нейронами в скрытом слое (alpha = 0.01) +# · Многослойный персептрон со 100-а нейронами в скрытом слое (alpha = 0.01) +@app.route("/k4_1_task_1", methods=['GET']) +def k4_1_task_1(): + X, y = make_classification(n_features=2, n_redundant=0, n_informative=2, + random_state=0, n_clusters_per_class=1) + rng = np.random.RandomState(2) + X += 2 + rng.uniform(size=X.shape) + linearly_dataset = (X, y) + cm_bright = ListedColormap(['#FF0000', '#0000FF']) + cm_bright2 = ListedColormap(['#FF000066', '#0000FF66']) + moon_dataset = make_moons(noise=0.3, random_state=0) + circles_dataset = make_circles(noise=0.2, factor=0.5, random_state=1) + datasets = [moon_dataset, circles_dataset, linearly_dataset] + + X, y = moon_dataset + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2, random_state=42) + + ridge_regression = Ridge(alpha=3, random_state=240) + ridge_regression.fit(X_train, y_train) + linear_accuracy = str(ridge_regression.score(X_test, y_test)) + + plt.subplot(1, 3, 1) + plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright) + plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright2) + + x_min = moon_dataset[0][:, 0].min() + g_min = None + y_min = None + x_max = moon_dataset[0][:, 0].max() + g_max = None + y_max = None + for k in range(-21, 50): + elem = np.array([[x_min, k / 20]]) + getted = ridge_regression.predict(elem) + if (g_min == None or math.fabs(0.5 - getted) < math.fabs(0.5 - g_min)): + g_min = getted + y_min = elem[0][1] + else: + if(math.fabs(0.5 - getted) > math.fabs(0.5 - g_min)): + break + + for k in range(-21, 50): + elem = np.array([[x_max, k / 20]]) + getted = ridge_regression.predict(elem) + if (g_max == None or math.fabs(0.5 - getted) < math.fabs(0.5 - g_max)): + g_max = getted + y_max = elem[0][1] + else: + if(math.fabs(0.5 - getted) > math.fabs(0.5 - g_max)): + break + + x = ridge_regression.predict(X_test) + plt.plot([x_min, x_max], [y_min, y_max], label="line", color="yellow") + # plt.show() + + # Перцептрон 10 скрытых слоев + perceptr = MLPClassifier(random_state=1, max_iter=2000, n_iter_no_change=20, activation="tanh", + alpha=0.01, hidden_layer_sizes=[10,], tol=0.00000001) + perceptr.fit(X_train, y_train) + prediction = perceptr.predict(X_test) + perceptron_accuracy = str(accuracy_score(y_test, prediction)) + prediction = perceptr.predict(moon_dataset[0]) + perceptron_accuracy_all = str(accuracy_score(moon_dataset[1], prediction)) + + params_set = [] + y_elem = None + g_elem = None + + for data_elem in moon_dataset[0]: + for k in range(-21, 50): + elem = np.array([[data_elem[0], k / 20]]) + getted = perceptr.predict(elem) + if (g_elem == None and getted == 0): + params_set.append([data_elem[0], -21 / 20]) + g_elem = None + else: + if(getted == 1 and (getted == g_elem or g_elem == None)): + g_elem = getted + y_elem = elem[0][1] + else: + params_set.append([data_elem[0], y_elem]) + g_elem = None + break + + if (g_elem != None): + params_set.append([data_elem[0], 50 / 20]) + g_elem = None + + + params_set.sort() + params_set = np.array(params_set) + plt.subplot(1, 3, 2) + plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright) + plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright2) + plt.plot(params_set[:, 0], params_set[:, 1], label="line", color="yellow") + # plt.show() + + # Перцептрон 100 скрытых слоев + perceptr100 = MLPClassifier(random_state=1, max_iter=2000, n_iter_no_change=20, activation="tanh", + alpha=0.01, hidden_layer_sizes=[100, ], tol=0.00000001) + perceptr100.fit(X_train, y_train) + prediction = perceptr100.predict(X_test) + perceptron100_accuracy = str(accuracy_score(y_test, prediction)) + prediction = perceptr100.predict(moon_dataset[0]) + perceptron100_accuracy_all = str(accuracy_score(moon_dataset[1], prediction)) + + params_set = [] + y_elem = None + g_elem = None + + for data_elem in moon_dataset[0]: + for k in range(-21, 30): + elem = np.array([[data_elem[0], k / 20]]) + getted = perceptr100.predict(elem) + if (g_elem == None and getted == 0): + params_set.append([data_elem[0], -21 / 20]) + g_elem = None + else: + if(getted == 1 and (getted == g_elem or g_elem == None)): + g_elem = getted + y_elem = elem[0][1] + else: + params_set.append([data_elem[0], y_elem]) + g_elem = None + break + + if (g_elem != None): + params_set.append([data_elem[0], 30 / 20]) + g_elem = None + + + params_set.sort() + params_set = np.array(params_set) + plt.subplot(1, 3, 3) + plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright) + plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright2) + plt.plot(params_set[:, 0], params_set[:, 1], label="line", color="yellow") + plt.show() + + + return "" \ + "

Работа с типовыми наборами данных и различными моделями

" \ + "

Вариант 10. Данные: make_moons (noise=0.3, random_state=rs)

" \ + "

Модели:\n 1) Линейная регрессия" \ + "\n 2) Многослойный персептрон с 10-ю нейронами в скрытом слое (alpha = 0.01)" \ + "\n 3) Многослойный персептрон со 100-а нейронами в скрытом слое (alpha = 0.01)

" \ + "

Оценка точности линейной регрессии: " + linear_accuracy + "

" \ + "

Оценка точности (тестовые данные) перцептрона 10 нейронов в скрытом слое: " + perceptron_accuracy + "

" \ + "

Оценка точности (тестовые данные) перцептрона 100 нейронов в скрытом слое: " + perceptron100_accuracy + "

" \ + "

Оценка точности (все точки) перцептрона 10 нейронов в скрытом слое: " + perceptron_accuracy_all + "

" \ + "

Оценка точности (все точки) перцептрона 100 нейронов в скрытом слое: " + perceptron100_accuracy_all + "

" \ + "" + + +if __name__ == "__main__": + app.run(debug=True) diff --git a/zhukova_alina_lab_1/img_screen_1.png b/zhukova_alina_lab_1/img_screen_1.png new file mode 100644 index 0000000..5a86420 Binary files /dev/null and b/zhukova_alina_lab_1/img_screen_1.png differ diff --git a/zhukova_alina_lab_1/img_screen_2.png b/zhukova_alina_lab_1/img_screen_2.png new file mode 100644 index 0000000..0659cbe Binary files /dev/null and b/zhukova_alina_lab_1/img_screen_2.png differ diff --git a/zhukova_alina_lab_1/img_screen_3.png b/zhukova_alina_lab_1/img_screen_3.png new file mode 100644 index 0000000..09595fd Binary files /dev/null and b/zhukova_alina_lab_1/img_screen_3.png differ diff --git a/zhukova_alina_lab_1/readme.md b/zhukova_alina_lab_1/readme.md new file mode 100644 index 0000000..1af0e4e --- /dev/null +++ b/zhukova_alina_lab_1/readme.md @@ -0,0 +1,60 @@ +## Задание +Работа с типовыми наборами данных и различными моделями. +Сгенерируйте определенный тип данных и сравните на нем 3 модели + +Вариант №10 + +Данные: make_moons (noise=0.3, random_state=rs) + +Модели: ++ Линейная регрессия ++ Многослойный персептрон с 10-ю нейронами в скрытом слое (alpha = 0.01) ++ Многослойный персептрон со 100-а нейронами в скрытом слое (alpha = 0.01) + +## Используемые технологии +В лабораторной были использованы библиотеки: ++ numpy - позволяет работать с массивами и матрицами ++ matplotlib - используется для создания графиков ++ sklearn - используется для работы с моделями машинного обучения ++ Flask - предоставляет способ быстрого создания веб-страниц для визуализации работы приложения + +## Как запустить +Запустить файл flask-server, который поднимет локальный сервер +и позволит обратиться к программе через браузер по ссылке [http://127.0.0.1:5000/](http://127.0.0.1:5000/) + +## Что делает программа +Генерирует набор данных типа луны (moons), делит его на обучающую и тестовую выборки. +По очереди обучает на данных обучающей выборки 3 модели: +модель линейной регрессии, модель многослойного перцептрона с 10 нейронами в скрытом слое и +модель многослойного перцептрона со 100 нейронами в скрытом слое. + +После обучения проверяются предсказания моделей на тестовых данных. Строится три графика, по одному для каждой модели, +где `#FF0000`, `#0000FF` - точки обучающей выборки первого и второго типа. + +`#FF000066`, `#0000FF66` - точки тестовой выборки первого и второго типа + +`#FFFF00` - линия по которой модель разделила данные на группы + +Далее программа выведет оценки точности моделей. Полученные оценки: ++ Линейная регрессия - 0.68 ++ Перцептрон с 10 нейронами в скрытом слое - 0.95 ++ Перцоптрон со 100 нейронами в скрытом слое - 0.95 + +Так как для двух последних моделей оценки оказались одинаковы, +я сравнила их точность на всех данных, а не только на тестовой выборке. + ++ Точность Перцептрона с 10 нейронами в скрытом слое - 0.91 ++ Точность Перцептрона со 100 нейронами в скрытом слое - 0.95 + +## Скриншоты работы программы +Главная страница в браузере (доступ по ссылке [http://127.0.0.1:5000/](http://127.0.0.1:5000/)) +![img.png](img_screen_1.png) + +Полученные графики разбиения точек на классы + +Линейная регрессия - Перцептрон 10 нейронов - Перцептрон 100 нейронов +![img.png](img_screen_2.png) + +Вывод анализа точности работы моделей +![img.png](img_screen_3.png) +