Scikit Learn - обучение KNN
k-NN (k-Nearest Neighbor), один из простейших алгоритмов машинного обучения, непараметрический и ленивый по своей природе. Непараметрический означает, что нет никаких предположений о базовом распределении данных, т.е. структура модели определяется на основе набора данных. Ленивое обучение или обучение на основе экземпляров означает, что для создания модели не требуются какие-либо обучающие данные, а на этапе тестирования используются все обучающие данные.
Алгоритм k-NN состоит из следующих двух шагов -
Шаг 1
На этом этапе он вычисляет и сохраняет k ближайших соседей для каждой выборки в обучающем наборе.
Шаг 2
На этом этапе для немаркированной выборки он извлекает k ближайших соседей из набора данных. Затем среди этих k-ближайших соседей он прогнозирует класс посредством голосования (класс с большинством голосов побеждает).
Модуль, sklearn.neighbors который реализует алгоритм k-ближайших соседей, обеспечивает функциональность для unsupervised так же как supervised методы обучения на основе соседей.
Неконтролируемые ближайшие соседи реализуют различные алгоритмы (BallTree, KDTree или Brute Force), чтобы найти ближайшего соседа (ей) для каждой выборки. Эта неконтролируемая версия - это, по сути, только шаг 1, который обсуждался выше, и основа многих алгоритмов (KNN и K-средство является известным), которые требуют поиска соседей. Проще говоря, это неконтролируемый обучающийся для выполнения поиска соседей.
С другой стороны, обучение на основе контролируемых соседей используется как для классификации, так и для регрессии.
Неконтролируемое обучение KNN
Как уже говорилось, существует множество алгоритмов, таких как KNN и K-Means, которые требуют поиска ближайшего соседа. Вот почему Scikit-learn решил реализовать часть поиска соседей как своего собственного «ученика». Причина, по которой поиск соседей выполняется в качестве отдельного ученика, заключается в том, что вычисление всего попарного расстояния для поиска ближайшего соседа, очевидно, не очень эффективно. Давайте посмотрим на модуль, используемый Sklearn для реализации обучения ближайшего соседа без учителя, вместе с примером.
Модуль Scikit-learn
sklearn.neighbors.NearestNeighborsэто модуль, используемый для реализации обучения ближайшего соседа без учителя. Он использует определенные алгоритмы ближайшего соседа с именами BallTree, KDTree или Brute Force. Другими словами, он действует как единый интерфейс для этих трех алгоритмов.
Параметры
В следующей таблице представлены параметры, используемые NearestNeighbors модуль -
Старший Нет | Параметр и описание |
---|---|
1 | n_neighbors - int, необязательно Количество соседей. Значение по умолчанию - 5. |
2 | radius - поплавок, необязательно Это ограничивает расстояние от соседей до возвратов. Значение по умолчанию - 1.0. |
3 | algorithm - {'auto', 'ball_tree', 'kd_tree', 'brute'}, необязательно Этот параметр примет алгоритм (BallTree, KDTree или Brute-force), который вы хотите использовать для вычисления ближайших соседей. Если вы укажете «авто», он попытается выбрать наиболее подходящий алгоритм на основе значений, переданных методу соответствия. |
4 | leaf_size - int, необязательно Это может повлиять на скорость построения и запроса, а также на объем памяти, необходимый для хранения дерева. Он передается в BallTree или KDTree. Хотя оптимальное значение зависит от характера проблемы, по умолчанию оно равно 30. |
5 | metric - строка или вызываемый Это метрика, используемая для вычисления расстояния между точками. Мы можем передать его как строку или вызываемую функцию. В случае вызываемой функции метрика вызывается для каждой пары строк и записывается полученное значение. Это менее эффективно, чем передача имени метрики в виде строки. Мы можем выбрать метрику из scikit-learn или scipy.spatial.distance. допустимые значения следующие - Scikit-learn - ['косинус', 'манхэттен', 'евклидово', 'l1', 'l2', 'cityblock'] Scipy.spatial.distance - ['braycurtis', 'canberra', 'chebyshev', 'dice', 'hamming', 'jaccard', 'корреляция', 'kulsinski', 'mahalanobis', 'minkowski', 'rogerstanimoto', 'russellrao', ' sokalmicheme »,« sokalsneath »,« seuclidean »,« sqeuclidean »,« yule »]. Метрика по умолчанию - «Минковский». |
6 | P - целое число, необязательно Это параметр для метрики Минковского. Значение по умолчанию - 2, что эквивалентно использованию Euclidean_distance (l2). |
7 | metric_params - dict, необязательно Это дополнительные аргументы ключевого слова для метрической функции. Значение по умолчанию - Нет. |
8 | N_jobs - int или None, необязательно Он повторно задает количество параллельных заданий, запускаемых для поиска соседей. Значение по умолчанию - Нет. |
Implementation Example
В приведенном ниже примере будут найдены ближайшие соседи между двумя наборами данных с помощью sklearn.neighbors.NearestNeighbors модуль.
Во-первых, нам нужно импортировать требуемый модуль и пакеты -
from sklearn.neighbors import NearestNeighbors
import numpy as np
Теперь, после импорта пакетов, определите наборы данных между ними, которые мы хотим найти ближайших соседей -
Input_data = np.array([[-1, 1], [-2, 2], [-3, 3], [1, 2], [2, 3], [3, 4],[4, 5]])
Затем примените алгоритм обучения без учителя следующим образом:
nrst_neigh = NearestNeighbors(n_neighbors = 3, algorithm = 'ball_tree')
Затем подгоните модель с набором входных данных.
nrst_neigh.fit(Input_data)
Теперь найдите K-соседей набора данных. Он вернет индексы и расстояния до соседей каждой точки.
distances, indices = nbrs.kneighbors(Input_data)
indices
Output
array(
[
[0, 1, 3],
[1, 2, 0],
[2, 1, 0],
[3, 4, 0],
[4, 5, 3],
[5, 6, 4],
[6, 5, 4]
], dtype = int64
)
distances
Output
array(
[
[0. , 1.41421356, 2.23606798],
[0. , 1.41421356, 1.41421356],
[0. , 1.41421356, 2.82842712],
[0. , 1.41421356, 2.23606798],
[0. , 1.41421356, 1.41421356],
[0. , 1.41421356, 1.41421356],
[0. , 1.41421356, 2.82842712]
]
)
Приведенный выше вывод показывает, что ближайший сосед каждой точки - это сама точка, т.е. в нуле. Это потому, что набор запросов соответствует обучающему набору.
Example
Мы также можем показать связь между соседними точками, создав разреженный граф следующим образом:
nrst_neigh.kneighbors_graph(Input_data).toarray()
Output
array(
[
[1., 1., 0., 1., 0., 0., 0.],
[1., 1., 1., 0., 0., 0., 0.],
[1., 1., 1., 0., 0., 0., 0.],
[1., 0., 0., 1., 1., 0., 0.],
[0., 0., 0., 1., 1., 1., 0.],
[0., 0., 0., 0., 1., 1., 1.],
[0., 0., 0., 0., 1., 1., 1.]
]
)
Как только мы подгоняем без присмотра NearestNeighbors модели, данные будут храниться в структуре данных на основе значения, установленного для аргумента ‘algorithm’. После этого мы можем использовать этот неконтролируемый ученикkneighbors в модели, которая требует поиска соседей.
Complete working/executable program
from sklearn.neighbors import NearestNeighbors
import numpy as np
Input_data = np.array([[-1, 1], [-2, 2], [-3, 3], [1, 2], [2, 3], [3, 4],[4, 5]])
nrst_neigh = NearestNeighbors(n_neighbors = 3, algorithm='ball_tree')
nrst_neigh.fit(Input_data)
distances, indices = nbrs.kneighbors(Input_data)
indices
distances
nrst_neigh.kneighbors_graph(Input_data).toarray()
Обучение KNN с учителем
Обучение на основе контролируемых соседей используется для следующего:
- Классификация для данных с дискретными метками
- Регрессия для данных с непрерывными метками.
Классификатор ближайшего соседа
Мы можем понять классификацию на основе соседей с помощью следующих двух характеристик:
- Он рассчитывается простым большинством голосов ближайших соседей каждой точки.
- Он просто хранит экземпляры обучающих данных, поэтому является типом необобщающего обучения.
Модули Scikit-learn
Ниже приведены два разных типа классификаторов ближайшего соседа, используемые scikit-learn.
S.No. | Классификаторы и описание |
---|---|
1. | KNeighborsClassifier K в имени этого классификатора представляет k ближайших соседей, где k - целочисленное значение, указанное пользователем. Следовательно, как следует из названия, этот классификатор реализует обучение на основе k ближайших соседей. Выбор значения k зависит от данных. |
2. | РадиусСоседиКлассификатор Радиус в имени этого классификатора представляет ближайших соседей в пределах указанного радиуса r, где r - значение с плавающей запятой, указанное пользователем. Следовательно, как следует из названия, этот классификатор реализует обучение на основе числа соседей в пределах фиксированного радиуса r каждой точки обучения. |
Регрессор ближайшего соседа
Он используется в тех случаях, когда метки данных носят непрерывный характер. Присвоенные метки данных вычисляются на основе среднего значения меток ближайших соседей.
Ниже приведены два разных типа регрессоров ближайшего соседа, используемые scikit-learn.
KNeighborsRegressor
K в имени этого регрессора представляет k ближайших соседей, где k является integer valueуказывается пользователем. Следовательно, как следует из названия, этот регрессор реализует обучение на основе k ближайших соседей. Выбор значения k зависит от данных. Давайте разберемся с этим подробнее на примере реализации.
Ниже приведены два разных типа регрессоров ближайшего соседа, используемые scikit-learn.
Пример реализации
В этом примере мы будем реализовывать KNN в наборе данных с именем Набор данных Iris Flower с помощью scikit-learn. KNeighborsRegressor.
Сначала импортируйте набор данных радужки следующим образом:
from sklearn.datasets import load_iris
iris = load_iris()
Теперь нам нужно разделить данные на данные для обучения и тестирования. Мы будем использовать Sklearntrain_test_split функция для разделения данных на соотношение 70 (данные обучения) и 20 (данные тестирования) -
X = iris.data[:, :4]
y = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20)
Далее мы будем выполнять масштабирование данных с помощью модуля предварительной обработки Sklearn следующим образом:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
Затем импортируйте KNeighborsRegressor class из Sklearn и укажите значение соседей следующим образом.
пример
import numpy as np
from sklearn.neighbors import KNeighborsRegressor
knnr = KNeighborsRegressor(n_neighbors = 8)
knnr.fit(X_train, y_train)
Вывод
KNeighborsRegressor(
algorithm = 'auto', leaf_size = 30, metric = 'minkowski',
metric_params = None, n_jobs = None, n_neighbors = 8, p = 2,
weights = 'uniform'
)
пример
Теперь мы можем найти MSE (среднеквадратичную ошибку) следующим образом:
print ("The MSE is:",format(np.power(y-knnr.predict(X),4).mean()))
Вывод
The MSE is: 4.4333349609375
пример
Теперь используйте его, чтобы предсказать значение следующим образом:
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
from sklearn.neighbors import KNeighborsRegressor
knnr = KNeighborsRegressor(n_neighbors = 3)
knnr.fit(X, y)
print(knnr.predict([[2.5]]))
Вывод
[0.66666667]
Полная рабочая / исполняемая программа
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data[:, :4]
y = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
import numpy as np
from sklearn.neighbors import KNeighborsRegressor
knnr = KNeighborsRegressor(n_neighbors=8)
knnr.fit(X_train, y_train)
print ("The MSE is:",format(np.power(y-knnr.predict(X),4).mean()))
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
from sklearn.neighbors import KNeighborsRegressor
knnr = KNeighborsRegressor(n_neighbors=3)
knnr.fit(X, y)
print(knnr.predict([[2.5]]))
RadiusNeighborsRegressor
Радиус в имени этого регрессора представляет ближайших соседей в пределах указанного радиуса r, где r - значение с плавающей запятой, указанное пользователем. Следовательно, как следует из названия, этот регрессор реализует обучение на основе числа соседей в пределах фиксированного радиуса r каждой обучающей точки. Давайте разберемся с этим подробнее с помощью примера реализации -
Пример реализации
В этом примере мы будем реализовывать KNN в наборе данных с именем Набор данных Iris Flower с помощью scikit-learn. RadiusNeighborsRegressor -
Сначала импортируйте набор данных радужки следующим образом:
from sklearn.datasets import load_iris
iris = load_iris()
Теперь нам нужно разделить данные на данные для обучения и тестирования. Мы будем использовать функцию Sklearn train_test_split, чтобы разделить данные на соотношение 70 (данные обучения) и 20 (данные тестирования) -
X = iris.data[:, :4]
y = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)
Далее мы будем выполнять масштабирование данных с помощью модуля предварительной обработки Sklearn следующим образом:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
Затем импортируйте RadiusneighborsRegressor class из Sklearn и укажите значение радиуса следующим образом:
import numpy as np
from sklearn.neighbors import RadiusNeighborsRegressor
knnr_r = RadiusNeighborsRegressor(radius=1)
knnr_r.fit(X_train, y_train)
пример
Теперь мы можем найти MSE (среднеквадратичную ошибку) следующим образом:
print ("The MSE is:",format(np.power(y-knnr_r.predict(X),4).mean()))
Вывод
The MSE is: The MSE is: 5.666666666666667
пример
Теперь используйте его, чтобы предсказать значение следующим образом:
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
from sklearn.neighbors import RadiusNeighborsRegressor
knnr_r = RadiusNeighborsRegressor(radius=1)
knnr_r.fit(X, y)
print(knnr_r.predict([[2.5]]))
Вывод
[1.]
Полная рабочая / исполняемая программа
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data[:, :4]
y = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
import numpy as np
from sklearn.neighbors import RadiusNeighborsRegressor
knnr_r = RadiusNeighborsRegressor(radius = 1)
knnr_r.fit(X_train, y_train)
print ("The MSE is:",format(np.power(y-knnr_r.predict(X),4).mean()))
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
from sklearn.neighbors import RadiusNeighborsRegressor
knnr_r = RadiusNeighborsRegressor(radius = 1)
knnr_r.fit(X, y)
print(knnr_r.predict([[2.5]]))