В этом разделе мы узнаем, как Scikit изучает нелинейные процессы в Python.
В следующем коде мы импортируем несколько библиотек, из которых мы сможем создать учебный курс по изучению нелинейности.
- x = num.sort(5 * num.random.rand(42, 1), axis=0) используется для генерации тех же данных.
- y[::5] += 3 *(0,5 – num.random.rand(9)) используется для добавления шума к целям.
- svrrbf = SVR(kernel=»rbf», C=100, gamma=0,1, epsilon=0,1) используется в регрессионной модели.
- lw = 2 используется для просмотра результата.
- fig, axes =plot.subplots(nrows=1, ncols=3, figsize=(15, 10),sharey=True) используется для построения фигуры и оси на экране.
- axes[ix].plot(x,svr.fit(x,y).predict(x),color=model_color[ix],lw=lw,label{}model».format(kernel_label[ix]),) используется для построения оси на экране.
- axes[ix].scatter(x[svr.support_],y[svr.support_],facecolor=”none”,edgecolor=model_color[ix],s=50,label=”{} поддерживающие векторы”.format(kernel_label [ix]),) используется для построения диаграммы рассеяния на экране.
- fig.text(0.5, 0.04, «data», ha=»center», va=»center») используется для преобразования текста в рисунок.
import numpy as num from sklearn.svm import SVR import matplotlib.pyplot as plot x = num.sort(5 * num.random.rand(42, 1), axis=0) y = num.sin(x).ravel() y[::5] += 3 *(0.5 - num.random.rand(9)) svrrbf = SVR(kernel="rbf", C=100, gamma=0.1, epsilon=0.1) lw = 2 svrs = [svrrbf] kernel_label = ["RBF"] model_color = ["m"] fig, axes = plot.subplots(nrows=1, ncols=3, figsize=(15, 10), sharey=True) for ix, svr in enumerate(svrs): axes[ix].plot( x, svr.fit(x, y).predict(x), color=model_color[ix], lw=lw, label="{} model".format(kernel_label[ix]), ) axes[ix].scatter( x[svr.support_], y[svr.support_], facecolor="none", edgecolor=model_color[ix], s=50, label="{} support vectors".format(kernel_label[ix]), ) axes[ix].scatter( x[num.setdiff1d(num.arange(len(x)), svr.support_)], y[num.setdiff1d(num.arange(len(x)), svr.support_)], facecolor="none", edgecolor="r", s=50, label="other training data", ) fig.text(0.5, 0.04, "data", ha="center", va="center") fig.text(0.06, 0.5, "target", ha="center", va="center", rotation="vertical") plot.show()
Выход:
После запуска приведенного выше кода мы получаем следующий вывод, в котором видим, что нелинейные данные отображаются на экране.
- Как работатет
- Пример
- Нелинейный SVM
- Изучение нелинейной модели
- Нелинейный классификатор
- Нелинейное уменьшение размерности
- Нелинейный PCA
Как работатет
В этом разделе мы узнаем, как Scikit изучает работу нелинейной регрессии в Python.
- Регрессия определяется как метод контролируемого машинного обучения. Существует два типа алгоритмов регрессии: линейный и нелинейный.
- Здесь мы можем использовать технику нелинейной регрессии, которая используется для описания нелинейности и ее параметра в зависимости от одной или нескольких независимых переменных.
В следующем коде мы изучим некоторые библиотеки, из которых мы можем создать модель нелинейной регрессии.
- df = pds.read_csv(“reгрессияchina_gdp.csv”) используется для чтения файла, который мы импортируем.
- plot.figure(figsize=(8,5)) используется для построения фигуры.
- x_data, y_data =(df[“Год”].values, df[“Значение”].values) используется для описания значений и лет.
- plot.plot(x_data, y_data, ‘ro’) используется для построения данных x и y.
- plot.ylabel(‘GDP’) используется для построения метки y.
- plot.xlabel(‘Year’) используется для построения метки x.
import numpy as num import pandas as pds import matplotlib.pyplot as plot df = pds.read_csv("regressionchina_gdp.csv") df.head(10) plot.figure(figsize=(8,5)) x_data, y_data =(df["Year"].values, df["Value"].values) plot.plot(x_data, y_data, 'ro') plot.ylabel('GDP') plot.xlabel('Year') plot.show()
В следующем коде мы выбираем модель для рисования линейной регрессии на экране.
- plot.plot (x,y) используется для построения графика x и y на экране.
- plot.ylabel (‘Зависимая переменная’) используется для построения метки y на экране.
- plot.xlabel (‘Независимая переменная’) используется для построения метки x на экране.
x = np.arange(-5.0, 5.0, 0.1) y = 1.0 /(1.0 + np.exp(-x)) plot.plot(x,y) plot.ylabel('Dependent Variable') plot.xlabel('Indepdendent Variable') plot.show()
Здесь мы можем использовать логистическую функцию для построения нашей нелинейной модели.
Теперь plot.plot (x_data, Y_pred*15000000000000.) используется для построения графика начальной позиции относительно точек данных.
def sigmoid(x, Beta_1, Beta_2): y = 1 /(1 + np.exp(-Beta_1*(x-Beta_2))) return y beta1 = 0.10 beta2 = 1990.0 #logistic function Y_pred = sigmoid(x_data, beta1 , beta2) plot.plot(x_data, Y_pred*15000000000000.) plot.plot(x_data, y_data, 'ro')
Здесь мы можем нормализовать наши данные, чтобы наилучшим образом соответствовать кривой.
- plot.figure (figsize=(8,5)) используется для построения фигуры на экране.
- plot.plot (xdata, ydata, ‘ro’, label=’data’) используется для отображения ydata и xdata на экране.
- plot.plot (x,y, linewidth=3.0, label=’fit’) используется для построения линии соответствия на экране.
xdata =x_data/max(x_data) ydata =y_data/max(y_data) from scipy.optimize import curve_fit popt, pcov = curve_fit(sigmoid, xdata, ydata) # Now we plot our resulting regression model. x = np.linspace(1960, 2015, 55) x = x/max(x) plot.figure(figsize=(8,5)) y = sigmoid(x, *popt) plot.plot(xdata, ydata, 'ro', label='data') plot.plot(x,y, linewidth=3.0, label='fit') plot.legend(loc='best') plot.ylabel('GDP') plot.xlabel('Year') plot.show()
После запуска приведенного выше кода мы получаем следующий вывод, в котором видим, что на экране отображается нелинейная линия наилучшего соответствия.
Пример
В этом разделе мы узнаем о том, как Scikit изучает пример нелинейной регрессии, работающий в Python.
Нелинейная регрессия определяется как квадратичная регрессия, которая строит связь между зависимыми и независимыми переменными. Эти данные показаны кривой линией.
В следующем коде мы импортируем некоторые библиотеки, с помощью которых работает пример нелинейной регрессии.
- df = pds.read_csv (“reгрессияchina_gdp.csv”) используется для чтения CSV-файла, который мы загружаем.
- y = 1/(1 + np.exp(-Beta_1*(x-Beta_2))) используется для определения сигмовидной функции.
- ypred = sigmoid(x_data, beta1, beta2) используется как логистическая функция.
- plot.plot (x_data, ypred * 16000000000000.) используется для построения первоначального прогноза по точкам данных.
- plot.plot (x_data, y_data, ‘go’) используется для построения x_data и y_data на графике.
import numpy as num import pandas as pds import matplotlib.pyplot as plot df = pds.read_csv("regressionchina_gdp.csv") def sigmoid(x, Beta_1, Beta_2): y = 1 /(1 + np.exp(-Beta_1*(x-Beta_2))) return y beta1 = 0.10 beta2 = 1990.0 ypred = sigmoid(x_data, beta1, beta2) plot.plot(x_data, ypred * 16000000000000.) plot.plot(x_data, y_data, 'go')
Выход:
После запуска приведенного выше кода мы получаем следующий вывод, в котором видим, что кривая линия показывает нелинейность графика.
Нелинейный SVM
В этом разделе мы узнаем, как scikit Learn нелинейный SVM работает в Python.
- Нелинейный SVM означает машину опорных векторов, которая представляет собой алгоритм контролируемого машинного обучения, используемый как для классификации, так и для регрессии.
- Как мы знаем, нелинейность определяется как связь между зависимой и независимой переменной и образует кривую линию для описания модели.
В следующем коде мы импортируем несколько библиотек, из которых сможем создать нелинейную модель SVM.
- x = num.random.randn(350, 2) используется для генерации случайных чисел.
- classifier = svm.NuSVC() используется для создания классификатора svm
- classifier.fit(x, Y) используется для соответствия модели.
- Z = classifier.decision_function(np.c_[xx.ravel(), yy.ravel()]) используется для построения функции решения каждой точки данных в сетке.
- plot.imshow(Z, interpolation=’ближайший’,extent=(xx.min(), xx.max(), yy.min(), yy.max()), аспект=’auto’,origin=’нижний ‘, cmap=plot.cm.PuOr_r) используется для построения графика на экране.
- plot.scatter(x[:, 0], x[:, 1], s=35, c=Y, cmap=plot.cm.Paired) используется для построения точки разброса на сетке.
import numpy as num import matplotlib.pyplot as plot from sklearn import svm xx, yy = num.meshgrid(num.linspace(-3, 3, 500), num.linspace(-3, 3, 500)) num.random.seed(0) x = num.random.randn(350, 2) Y = num.logical_xor(x[:, 0] > 0, x[:, 1] > 0) classifier = svm.NuSVC() classifier.fit(x, Y) Z = classifier.decision_function(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) plot.imshow(Z, interpolation='nearest', extent=(xx.min(), xx.max(), yy.min(), yy.max()), aspect='auto', origin='lower', cmap=plot.cm.PuOr_r) contours = plot.contour(xx, yy, Z, levels=[0], linewidths=2, linetypes='--') plot.scatter(x[:, 0], x[:, 1], s=35, c=Y, cmap=plot.cm.Paired) plot.xticks(()) plot.yticks(()) plot.axis([-3, 3, -3, 3]) plot.show()
Выход:
После запуска приведенного выше кода мы получаем следующий вывод, в котором видим, что на экране отображается нелинейный график SVM обучения Scikit.
Изучение нелинейной модели
В этом разделе мы узнаем о том, как Scikit изучает нелинейную модель в Python.
- Нелинейная модель определяет нелинейную связь между данными и их параметром в зависимости от одной или нескольких независимых переменных.
- Нелинейность показана там, где точка данных образует кривую линию, что подтверждает нелинейность данных.
В следующем коде мы импортируем несколько библиотек, из которых увидим, что нелинейная модель работает.
- range = num.random.RandomState(0) используется для генерации случайного состояния.
- Lendata =(datamax – datamin) используется для получения длины данных.
- data = num.sort(range.rand(nsample) * лендата – лендата / 2) используется для сортировки данных и упрощения построения графиков.
- цель = данные ** 3 – 0,6 * данные ** 2 + шум используется для создания цели.
- full_data = pds.DataFrame({“входная функция”: данные, “цель”: цель}) используется для получения полных данных из фрейма данных.
- nonlineardata = sns.scatterplot(data=full_data, x=”входной объект”, y=”цель”, цвет=”синий”, альфа=0,5) используется для построения точек разброса на графике.
import numpy as num range = num.random.RandomState(0) nsample = 100 datamax, datamin = 1.5, -1.5 lendata =(datamax - datamin) data = num.sort(range.rand(nsample) * lendata - lendata / 2) noise = range.randn(nsample) * .3 target = data ** 3 - 0.6 * data ** 2 + noise import pandas as pds full_data = pds.DataFrame({"input feature": data, "target": target}) import seaborn as sns nonlineardata = sns.scatterplot(data=full_data, x="input feature", y="target", color="blue", alpha=0.5)
Выход:
После запуска приведенного выше кода мы получаем следующий вывод, в котором видим, что нелинейная модель обучения Scikit отображается на экране.
Нелинейный классификатор
В этом разделе мы узнаем о том, как нелинейный классификатор Scikit Learning работает в Python.
Нелинейный классификатор определяется как процесс классификации, который используется для описания нелинейности и ее параметра в зависимости от одной или нескольких независимых переменных.
В следующем коде мы импортируем несколько библиотек, из которых сможем создать нелинейный классификатор.
- x = x.copy() используется для копирования данных.
- x = num.random.normal(size=(n, 2)) используется для генерации случайных чисел.
- xtrain, xtest, ytrain, ytest = train_test_split(x, y, random_state=0, test_size=0,5) используется для разделения набора данных на данные поезда и тестовые данные.
- plot.figure(figsize=(5,5)) используется для построения фигуры на экране.
- plot.scatter(xtrain[:,0], xtrain[:,1], c=ytrain, Edgecolors=’r’); используется для построения диаграммы рассеяния на экране.
import numpy as num import matplotlib.pyplot as plot from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score %config InlineBackend.figure_format = 'svg' plot.style.use('bmh') plot.rcParams['image.cmap'] = 'Paired_r' num.random.seed(5) def f(x): x = x.copy() x[:,0] -= 0.4 x[:,1] += 0.2 return 1.1*x[:,0]**2 + 0.3*x[:,1]**2 - 0.6*x[:,0]*x[:,1] def makedata(): n = 800 x = num.random.normal(size=(n, 2)) y = f(x) < 0.5 x += num.random.normal(size=(n,2), scale=0.2) return x, y x, y = makedata() xtrain, xtest, ytrain, ytest = train_test_split(x, y, random_state=0, test_size=0.5) plot.figure(figsize=(5,5)) plot.scatter(xtrain[:,0], xtrain[:,1], c=ytrain, edgecolors='r');
В приведенном ниже коде мы построим границы классификатора.
- xx, yy = num.meshgrid(num.arange(x_min, x_max, h),num.arange(y_min, y_max, h)) используется для создания сетки на экране.
- Z = classifier.predict(num.c_[xx.ravel(), yy.ravel()]) используется для прогнозирования классификатора.
- plot.figure(figsize=(5,5)) используется для построения классификатора на экране.
- plot.scatter(X[:,0], X[:,1], c=Y,edgecolors=’r’); используется для построения диаграммы рассеяния на экране.
- plot_boundary(classifier, xtrain, ytrain) используется для построения границ классификатора.
- Precision_score(ytest, classifier.predict(xtest)) используется для прогнозирования показателя точности.
def plot_boundary(classifier, X, Y): h = 0.02 x_min, x_max = X[:,0].min() - 10*h, X[:,0].max() + 10*h y_min, y_max = X[:,1].min() - 10*h, X[:,1].max() + 10*h xx, yy = num.meshgrid(num.arange(x_min, x_max, h), num.arange(y_min, y_max, h)) Z = classifier.predict(num.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) plot.figure(figsize=(5,5)) plot.contourf(xx, yy, Z, alpha=0.25) plot.contour(xx, yy, Z, colors='r', linewidths=0.7) plot.scatter(X[:,0], X[:,1], c=Y, edgecolors='r'); from sklearn.linear_model import LogisticRegression classifier = LogisticRegression().fit(xtrain, ytrain) plot_boundary(classifier, xtrain, ytrain) accuracy_score(ytest, classifier.predict(xtest))
Нелинейное уменьшение размерности
В этом разделе мы узнаем о том, как Scikit изучает работу нелинейного уменьшения размерности в Python.
Нелинейное уменьшение размерности используется для уменьшения количества элементов в наборе данных без потери информации.
В следующем коде мы импортируем некоторые библиотеки, из которых мы сможем создать нелинейное уменьшение размерности для обучения scikit.
- alerts.filterwarnings(‘ignore’) используется для выдачи предупреждения фильтра.
- x, y = make_s_curve(n_samples=100) используется для построения кривой.
- digits = load_digits(n_class=6) используется для загрузки цифры.
- plot.figure(figsize=(12,8)) используется для построения фигуры на экране.
- axis =plot.axes(projection=’3d’) используется для построения осей на экране.
- axis.scatter3D(x[:, 0], x[:, 1], x[:, 2], c=y) используется для построения разброса на графике.
import sklearn import numpy as num import pandas as pds import matplotlib.pyplot as plot from mpl_toolkits.mplot3d import Axes3D import warnings import sys warnings.filterwarnings('ignore') %matplotlib inline from sklearn.datasets import make_s_curve x, y = make_s_curve(n_samples=100) from sklearn.datasets import load_digits digits = load_digits(n_class=6) x_digits, y_digits = digits.data, digits. target print('Dataset Size : ', x_digits.shape, y_digits.shape) plot.figure(figsize=(12,8)) axis = plot.axes(projection='3d') axis.scatter3D(x[:, 0], x[:, 1], x[:, 2], c=y) axis.view_init(10, -60);
Выход:
После запуска приведенного выше кода мы получаем следующий результат, в котором видим нелинейное уменьшение размерности.
Нелинейный PCA
В этом разделе мы узнаем о том, как Scikit изучает работу нелинейного PCA в Python. Где мы собираемся показать разницу между PCA и KernalPCA.
- При этом мы объясняем разницу на примере, где с одной стороны KernalPCA может найти проекцию данных, которая линейно разделяет их, а в случае PCA этого не происходит.
- PCA означает анализ основных компонентов. В этом процессе он используется в качестве основных компонентов. Это также метод уменьшения размерности, который помогает уменьшить размерность.
- Теперь мы объясняем пример нелинейного PCA, объясняя разницу между PCA и KernalPCA с использованием данных проецирования.
В следующем коде мы рассказываем о преимуществах использования ядра при проецировании данных с использованием PCA.
В этом блоке кода мы генерируем два вложенных набора данных.
from sklearn.datasets import make_circles from sklearn.model_selection import train_test_split x, y = make_circles(n_samples=1_000, factor=0.3, noise=0.05, random_state=0) x_train, x_test, y_train, y_test = train_test_split(x, y, stratify=y, random_state=0) import matplotlib.pyplot as plot _,(train_ax1, test_ax1) = plot.subplots(ncols=2, sharex=True, sharey=True, figsize=(8, 4)) train_ax1.scatter(x_train[:, 0], x_train[:, 1], c=y_train) train_ax1.set_ylabel("Feature 1") train_ax1.set_xlabel("Feature 0") train_ax1.set_title("Train data") test_ax1.scatter(x_test[:, 0], x_test[:, 1], c=y_test) test_ax1.set_xlabel("Feature 0") _ = test_ax1.set_title("Test data")
Выход:
После запуска следующего кода мы получаем следующий вывод, где мы можем быстро просмотреть два вложенных сгенерированных набора данных.
- Один из них — набор обучающих данных, а другой — набор тестовых данных.
- Выборки из каждого класса не могут быть линейно разделены, поскольку не существует линейно разделенной прямой линии, посредством которой можно было бы разделить внутренний набор данных с внешним набором данных.
В этом блоке кода мы используем PCA с ядрами и без них, чтобы увидеть, какие эффекты могут возникнуть при использовании ядер.
- Используемое здесь ядро — это ядро радиальной базисной функции(RBF).
- orig_data_ax1.set_ylabel() используется для присвоения метки оси Y для данных тестирования.
- orig_data_ax1.set_xlabel() используется для присвоения метки оси X для данных тестирования.
- orig_data_ax1.set_title() используется для присвоения метки заголовку графика для данных тестирования.
- pca_proj_ax1.set_ylabel() используется для присвоения метки оси Y для PCA.
- pca_proj_ax1.set_xlabel() используется для присвоения метки оси X для PCA.
- pca_proj_ax1.set_title() используется для указания заголовка графика для PCA.
from sklearn.decomposition import PCA, KernelPCA pca1 = PCA(n_components=2) kernel_pca1 = KernelPCA( n_components=None, kernel="rbf", gamma=10, fit_inverse_transform=True, alpha=0.1 ) x_test_pca1 = pca1.fit(x_train).transform(x_test) x_test_kernel_pca1 = kernel_pca1.fit(x_train).transform(x_test) fig,(orig_data_ax1, pca_proj_ax1, kernel_pca_proj_ax1) = plot.subplots( ncols=3, figsize=(14, 4) ) orig_data_ax1.scatter(x_test[:, 0], x_test[:, 1], c=y_test) orig_data_ax1.set_ylabel("Feature 1") orig_data_ax1.set_xlabel("Feature 0") orig_data_ax1.set_title("Testing data") pca_proj_ax1.scatter(x_test_pca1[:, 0], x_test_pca1[:, 1], c=y_test) pca_proj_ax1.set_ylabel("Principal component 1") pca_proj_ax1.set_xlabel("Principal component 0") pca_proj_ax1.set_title("projection of test data\n using PCA") kernel_pca_proj_ax1.scatter(x_test_kernel_pca1[:, 0], x_test_kernel_pca1[:, 1], c=y_test) kernel_pca_proj_ax1.set_ylabel("Principal component 1") kernel_pca_proj_ax1.set_xlabel("Principal component 0") _ = kernel_pca_proj_ax1.set_title("projection of test data using\n Kernel PCA")
Выход:
После запуска следующего кода мы получаем следующий вывод, где мы можем увидеть сравнение данных тестирования, проекцию данных тестирования с использованием PCA и проекцию данных тестирования с использованием KernelPCA.
- Давайте вспомним, что PCA преобразует данные линейно, что означает, что организованная система будет центрирована, масштабирована по всем компонентам с учетом ее дисперсии и, наконец, повернута.
- Глядя на приведенный ниже вывод, мы видим в средней структуре, что в структуре нет изменений, связанных с масштабированием.
- Ядро PCA позволяет создавать нелинейные проекции.
- Здесь, используя ядро RBF, мы ожидаем, что проекция откроет набор данных, заботясь о сохранении относительных расстояний пар точек данных, которые расположены близко друг к другу в исходном пространстве.
- Мы можем видеть и наблюдать такие различия в структуре KernelPCA, которая находится справа.