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()