Полезно знать, прежде чем приступить к машинному обучению

Если вы читали некоторые из моих предыдущих статей о неконтролируемом машинном обучении и методах кластеризации, вы нашли что-то общее во всех этих статьях: во всех них упоминаются какие-то метрики расстояния между точками (или наблюдениями) в наборе данных.

Что такое метрика расстояния в машинном обучении?

Это мера расстояния, которая вычисляет числовую оценку, которая показывает, насколько похожи два элемента в определенной области или контексте. Как правило, эти элементы представлены в виде строк информации, описывающей конкретный предмет или событие.

Почему метрики расстояния важны в машинном обучении?

Потому что некоторые алгоритмы строятся на основе метрик расстояния. Метрики расстояния также используются для оценки производительности модели. Некоторые примеры:

→ Кластеризация. Целью кластеризации является объединение схожих точек данных в кластеры (или классы). Метрика расстояния, используемая в алгоритмах кластеризации, определяет, насколько похожи две точки данных. Например, если используется евклидово расстояние, две точки данных будут считаться похожими, если они находятся близко друг к другу в пространстве признаков. С другой стороны, если используется манхэттенское расстояние, две точки данных будут считаться похожими, если они имеют схожие значения признаков. Различные метрики расстояния могут привести к разным кластерам, поэтому важно выбрать правильную метрику расстояния для рассматриваемой проблемы.

→ Уменьшение размерности. Целью уменьшения размерности является выявление закономерностей в данных за счет уменьшения количества признаков. Метрики расстояния можно использовать для измерения сходства между точками данных в сокращенном пространстве признаков.

→ Оценка. В машинном обучении метрики на основе расстояния можно использовать для оценки производительности модели. В задачах классификации точность является широко используемой метрикой для оценки производительности, но она может быть чувствительна к дисбалансу классов. Метрики на основе расстояния, такие как F1-Score или AUC-ROC, могут обеспечить более полную оценку производительности модели.

→ Обнаружение аномалий. Целью обнаружения аномалий является выявление необычных или ненормальных наблюдений. Метрики расстояния можно использовать для определения того, насколько наблюдение отличается от остальных данных. Например, в алгоритме обнаружения выбросов, если точка данных находится дальше определенного порога от других точек данных, ее можно считать выбросом.

Теперь давайте посмотрим на некоторые примеры показателей расстояния и применим их в игрушечном наборе данных!

#Import libraries:
import pandas as pd
import numpy
from scipy.spatial.distance import pdist

#Create toy dataset with 5 observations and two features:
df = pd.DataFrame(np.random.randint(1,100,size=(5, 2)), columns=['feature_1','feature_2'])
print(df)

Небольшой и простой набор данных был создан для того, чтобы помочь вам лучше понять примеры без сложной визуализации, которая требовалась при использовании большого (реального) набора данных.

1. Евклидово расстояние
Евклидово расстояние — это мера расстояния между двумя точками в многомерном пространстве. Оно также известно как «прямолинейное» расстояние между двумя точками, потому что оно измеряет длину кратчайшего пути между двумя точками, предполагая, что этот путь является прямой линией. Евклидово расстояние между двумя точками в многомерном пространстве вычисляется как квадратный корень из суммы квадратов разностей между координатами двух точек. Из-за своей простоты это популярный выбор метрики расстояния, его легко понять и реализовать. Однако он предполагает, что все функции одинаково важны, и не принимает во внимание корреляцию между функциями, поэтому это не всегда может быть лучшим выбором в зависимости от проблемы, которую мы пытаемся решить.

#Euclidean Distance:
euc_dist = pdist(df, 'euclidean')
print(euc_dist)

2. Манхэттенское расстояние
Манхэттенское расстояние, также известное как расстояние "такси" или "городской квартал", представляет собой способ измерения расстояния между двумя точками в системе, подобной сетке, например на карте улиц города. . Он рассчитывается как сумма абсолютных разностей между координатами двух точек. Например, если точка A находится в координатах (1,2), а точка B — в координатах (4,6), манхэттенское расстояние будет следующим:
|4–1| + |6–2| = 3 + 4 = 7

#Manhattan distance
cityblock_dist = pdist(df, 'cityblock')
print(cityblock_dist)

3. Расстояние Минковского
Расстояние Минковского — это обобщение евклидова расстояния и манхэттенского расстояния. Он определяется как сумма абсолютных разностей координат, возведенных в степень параметра ‘p’. Когда 'p=1', это называется манхэттенским расстоянием, когда 'p=2' оно называется Евклидово расстояние. Чем больше значение ‘p’, тем больший вес придается большим различиям, и тем меньше вес придается небольшим различиям. Он часто используется в алгоритмах машинного обучения, таких как K-ближайшие соседи и иерархическая кластеризация.

#Minkowski distance 
minkowski_dist = pdist(df, 'minkowski', p=5)
print(minkowski_dist)

4. Стандартизированное евклидово расстояние
Стандартизированное евклидово расстояние — это разновидность евклидова расстояния, учитывающая масштаб различных объектов. Евклидово расстояние является мерой расстояния по прямой, и стандартизированное евклидово расстояние аналогично, но перед вычислением различий каждая координата стандартизируется (или нормализуется) путем вычитания среднего значения и деления на стандартное отклонение. Это гарантирует, что все переменные находятся в одном масштабе, и на расстояние не влияют единицы измерения переменных.

#Standardized Euclidean distance
std_euc_dist = pdist(df, 'seuclidean')
print(std_euc_dist) 

5. Квадрат евклидова расстояния
Квадрат евклидова расстояния между двумя точками равен квадрату евклидова расстояния. Это особенно полезно в многомерных пространствах, потому что его вычисление менее затратно, чем фактическое евклидово расстояние (квадратный корень не применяется).

#Squared Euclidean distance
sq_euc_dist = pdist(df, 'sqeuclidean')
print(sq_euc_dist)

6. Косинусное расстояние
Косинусное расстояние — это мера сходства между двумя ненулевыми векторами пространства скалярного произведения, которая измеряет косинус угла между ними. Косинусное расстояние находится в диапазоне от -1 до 1, при этом значения, близкие к 1, указывают на большее сходство, а значения, близкие к -1, указывают на большее различие. Чтобы вычислить косинусное расстояние, вы берете скалярное произведение двух векторов, делите его на произведение их модулей, а затем вычитаете результат из 1. Выражение:

Косинусное расстояние часто используется в задачах обработки естественного языка и поиска информации для измерения сходства между двумя документами или фрагментами текста. Он также используется в системах совместной фильтрации и рекомендаций для измерения сходства между пользователями или элементами.

#Cosine Distance:
cos_dist = pdist(df, 'cosine')
print(cos_dist)

7. Корреляционное расстояние
Корреляционное расстояние — это мера различия между двумя переменными, основанная на их коэффициенте корреляции. Коэффициент корреляции — это значение от -1 до 1, которое измеряет силу и направление линейных отношений между двумя переменными. Коэффициент корреляции 1 указывает на полную положительную корреляцию, корреляция -1 указывает на полную отрицательную корреляцию, а коэффициент корреляции 0 указывает на отсутствие корреляции.

#Correlation Distance
corr_dist = pdist(df, 'correlation')
print(corr_dist)

8. Расстояние Хэмминга
Расстояние Хэмминга — это мера разницы между двумя строками одинаковой длины. Он определяется как количество позиций, в которых соответствующие символы различны. Другими словами, это количество подстановок, необходимых для замены одной строки на другие. Расстояние Хэмминга можно использовать в различных областях, таких как обнаружение и исправление ошибок в вычислительной биологии и распознавание образов. Важно отметить, что расстояние Хэмминга определяется только для строк одинаковой длины, если строки имеют разную длину, его нельзя рассчитать.

#Create new dataframe with strings:
data = {'feature_1': ['a', 'b', 'c', 'd', 'e'],
        'feature_2': ['a', 'b', 'c', 'i', 'j']}

df_2 = pd.DataFrame(data)
print(df_2)

from scipy.spatial import distance

Hamm_D = distance.hamming(df_2['feature_1'], df_2['feature_2'])
print('Hamming distance is: ', Hamm_D)

Если мы попытаемся рассчитать расстояние Хэмминга с первым набором данных, наши числовые значения будут преобразованы в строки и сравнены:

Hamm_D = distance.hamming(df['feature_1'], df['feature_2'])
print('Hamming distance is: ', Hamm_D)

9. Расстояние Жаккара
Расстояние Жаккара (также известное как коэффициент подобия Жаккара) — это мера сходства между двумя наборами, основанная на индексе Жаккара. Индекс Жаккара рассчитывается как размер пересечения множеств, деленный на размер объединения множеств. Математически это представляется как:

Получив индекс Жаккара, вы можете вычислить расстояние Жаккара, вычитая индекс Жаккара из 1.

Расстояние Жаккара находится в диапазоне от 0 до 1, где значение 0 указывает на то, что наборы идентичны, а значение 1 указывает на то, что наборы не имеют общих элементов.

Jacc_D = distance.jaccard(df_2['feature_1'], df_2['feature_2'])
print('Jaccard distance for df_2 is: ', Jacc_D)

Jacc_D = distance.jaccard(df['feature_1'], df['feature_2'])
print('Jaccard distance for df is: ', Jacc_D)

10. Расстояние Дженсена-Шеннона
Чтобы понять расстояние Дженсена-Шеннона, нам сначала нужно понять дивергенцию Кульбака-Лейблера (KLD). Дивергенция KL между двумя распределениями вероятностей, P и Q, рассчитывается путем суммирования всех возможных исходов P, умноженных на логарифм отношения вероятности этого исхода при P и Q. Математическая формула:

Давайте посмотрим на пример:

# example of calculating the kl divergence between two mass functions
from math import log2, sqrt

# define distributions
p = [0.1, 0.2, 0.3, 0.4]
q = [0.2, 0.3, 0.2, 0.3]

# calculate the kl divergence
def kl_divergence(p, q):
 return sum(p[i] * log2(p[i]/q[i]) for i in range(len(p)))

KLD = kl_divergence(p,q)
print('KLD value is: ', KLD)

Расстояние Дженсена-Шеннона рассчитывается путем создания нового распределения вероятностей, которое представляет собой среднее значение двух сравниваемых распределений. Затем рассчитывается расхождение KL между каждым исходным распределением и усредненным распределением:

#Average of the two distributions:
z = np.mean([p, q], axis=0)
print(z)

# calculate the JS divergence
def js_divergence(a, z):
 return sum(a[i] * log2(a[i]/z[i]) for i in range(len(a)))

#JS divergence for p:
js_p = js_divergence(p,z)
print ('KLD for p and z is: ', js_p)

#JS divergence for q:
js_q = js_divergence(q,z)
print ('KLD for q and z is: ', js_q)

Затем эти два значения расхождения KL усредняются, и из них извлекается квадратный корень, чтобы получить окончательное значение Дженсена-Шеннона.

JS_div = sqrt((js_p + js_q)/2)
print('The Jason-Shannon distance is: ', JS_div)

Значение Дженсена-Шеннона находится в диапазоне от 0 до 1, где 0 указывает на то, что два распределения идентичны, а 1 указывает на то, что два распределения совершенно разные. Простой, быстрый и легкий способ рассчитать расстояние Дженсена-Шеннона:

distance.jensenshannon(p,q)

Найденные значения отличаются из-за операций округления.

11. Расстояние Чебышева
Расстояние Чебышева — это мера расстояния между двумя точками в многомерном пространстве. Он определяется как максимальная абсолютная разница между координатами двух точек в любом измерении.

#Chebyshev distance
cheb_dist = pdist(df, 'chebyshev')
print(cheb_dist)

12. Канберрское расстояние
Канберрское расстояние — это мера расстояния между двумя точками в многомерном пространстве. Он определяется как сумма абсолютных разностей между координатами двух точек, деленная на сумму координат (плюс небольшая константа, если необходимо избежать деления на 0). Он более устойчив к выбросам, чем другие метрики расстояния, такие как евклидово расстояние.

#Canberra distance
canberra_dist = pdist(df, 'canberra')
print(canberra_dist)

13. Расстояние Брея-Кертиса
Расстояние Брея-Кертиса — это мера расстояния между двумя точками в многомерном пространстве. Он определяется как сумма абсолютных разностей между координатами двух точек, деленная на сумму координат.

Он находится в диапазоне от 0 до 1, где 0 указывает на то, что два образца идентичны, а 1 указывает на то, что эти два образца не имеют ничего общего.

#Bray-Curtis distance
BC_dist = pdist(df, 'braycurtis')
print(BC_dist)

14. Расстояние Махаланобиса
Расстояние Махаланобиса — это мера расстояния между точкой и распределением. Это многомерное обобщение идеи измерения того, на сколько стандартных отклонений точка находится от среднего значения распределения.

#Mahalanobis distance
maha_dist = pdist(df, 'mahalanobis')
print(maha_dist)

15. Йольское расстояние
Йольское расстояние — это мера несходства между двумя вероятностными распределениями, основанная на их перекрытии. Расстояние Юла между двумя распределениями вероятностей, P и Q, определяется как:

Расстояние варьируется от 0 до 1, где 0 указывает, что два распределения идентичны, а 1 указывает, что они не перекрываются.

# define distributions
p = [0.1, 0.2, 0.3, 0.4]
q = [0.2, 0.3, 0.2, 0.3]
t = [0.1, 0.2, 0.35, 0.35]

yule_div = distance.yule(p,q)
print('Yule distance between p and q is: ', yule_div)

yule_div = distance.yule(p,t)
print('Yule distance between p and t is: ', yule_div)

Мы видим, что расстояние Йоля между p и q больше, чем p и t.

Заключение

В целом, метрики расстояния играют важную роль во многих алгоритмах машинного обучения. Важно выбрать правильную метрику расстояния для рассматриваемой проблемы, так как это может сильно повлиять на производительность алгоритма.

Спасибо за чтение! Дайте мне знать, если у вас есть предложения, которые можно добавить в этот урок, и не забудьте подписаться, чтобы получать уведомления о моих будущих публикациях.

Если: вам понравилась эта статья, не забудьте подписаться на меня и, таким образом, получать все обновления о новых публикациях.

Иначе Если: вы хотите больше узнать о Medium, вы можете подписаться на членство в Medium с помощью моя реферальная ссылка. Это не будет стоить вам больше, но вы заплатите мне за кофе.

Еще: Спасибо!