vault backup: 2026-05-07 15:57:15

This commit is contained in:
Dmitry
2026-05-07 15:57:15 +03:00
parent 8ab1121ffc
commit fed94882bb
4 changed files with 29 additions and 21 deletions
@@ -1906,7 +1906,7 @@ $$\{(x_i, y_i)\}_{i=1}^n = \{(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\}$$
* $n$ - размер выборки
* $k$ - количество классов
Необходимо построить модель, восстанавливающую зависить $y$ от $x$: $$y=f(x)$$
Необходимо построить модель, восстанавливающую зависимость $y$ от $x$: $$y=f(x)$$
Для упрощения задачи мы с вами сначала рассмотрим задачу бинарной классификации, а затем обобщим результат на мультиклассовую.
@@ -1987,7 +1987,7 @@ $$\beta = (\beta_0, \beta_1, \beta_2, ..., \beta_m)^T$$
Гипотетически, ничего не мешаем нам воспользоваться линейной регрессии для случая классификации.
Если целевая переменная перекодирована в числа, например $Y = \{0, 1\}$, то ничто нам не мешает построить регрессию и восставить зависить между $x$ и $y$.
Если целевая переменная перекодирована в числа, например $Y = \{0, 1\}$, то ничто нам не мешает построить регрессию и восстановить зависимость между $x$ и $y$.
Мы будем оптимизировать все тот же метод наименьших квадратов, оптимизируя квадратичную функцию потерь:
@@ -2290,7 +2290,7 @@ $$L(\beta) = - \frac{1}{n} \sum_{i=1}^n log(1 + e^{-y_i \cdot x_i \cdot \beta})$
**Пример**
Рассмотрим пример рассчета функции log loss.
Рассмотрим пример расчёта функции log loss.
Пусть у нас есть выборка из четырёх объектов (опухолей) с двумя признаками: $x_{1}$ и $x_{2}$.
@@ -1,16 +1,20 @@
---
status: seed
status: processing
type: concept
tags:
- ml
- machine-learning
- metric-methods
- knn
- classification
- regression
created: 2026-02-26
updated: 2026-04-21
title: Метрические Алгоритмы
updated: 2026-05-07
title: Метрические алгоритмы
---
# Метрические Алгоритмы
# Метрические алгоритмы
## Краткая Справка О Библиотеке Scikit-learn
## Краткая справка о библиотеке Scikit-learn
> [**Scikit-learn**](https://scikit-learn.org/stable/index.html) - это библиотека машинного обучения с открытым исходным кодом для языка программирования Python. Она предоставляет простые и эффективные инструменты для предобработки данных, машинного обучения и анализа данных.
@@ -22,7 +26,7 @@ title: Метрические Алгоритмы
* В библиотеку также включены функции для предобработки данных, необходимой перед подачей данных в модель
* Scikit-learn в основном направлен на работу именно с классическим ML, хотя в ней поддерживается и создание простейших нейронных сетей. Однако использование ее для задач глубокого обучения не рекомендуется, для этого есть специализированные инструменты (Tensorflow и PyTorch)
## Идея Метрических Алгоритмов
## Идея метрических алгоритмов
Идею метрических алгоритмов можно сравнить с простой философской идеей "мы - это наше окружение" или "скажи мне, кто твой друг, и я скажу, кто ты".
@@ -40,7 +44,7 @@ title: Метрические Алгоритмы
Особенность метрических алгоритмов заключается в том, что они не строят явную модель на основе данных, а основываются на хранении и использовании обучающих примеров для принятия решений. Как такого обучения в алгоритмах не предполагается. Такой подход еще часто называется **"ленивым обучением" (lazy learning)**.
## Расстояние Между Объектами
## Расстояние между объектами
Ключевая идея методов - использование близости между объектами для принятия решения. Как выразить близость в численном эквиваленте?
@@ -99,7 +103,7 @@ pairwise_distances(x, y, metric='cosine')
Качество модели сильно зависит от выбора метрики. Поэтому способ измерения расстояния может использоваться в качестве внешнего параметра алгоритма (гиперпараметра), управляя которым, исследователь может модифицировать работу алгоритма и улучшать качество получаемого решения.
## Алгоритм kNN Для Классификации
## Алгоритм kNN для классификации
В данном уроке мы будем рассматривать самого популярного представителя метрических алгоритмов - метод k-ближайших соседей (k-nearest neighbors, kNN).
@@ -464,7 +468,7 @@ print('Accuracy: {:.2f}'.format(accuracy_score(y, y_pred)))
Метрические алгоритмы являются **чувствительным к масштабу признаков**.
Это означает, что если один признак имеет значительно больший масштаб, чем другой, то он будет доминировать в вычислении расстояния между объектами, и алгоритм будет искать соседей только на основе доминирующего признака, не общая внимания на вклад других, что приведет к некорректной классификации.
Это означает, что если один признак имеет значительно больший масштаб, чем другой, то он будет доминировать в вычислении расстояния между объектами, и алгоритм будет искать соседей только на основе доминирующего признака, не обращая внимания на вклад других, что приведет к некорректной классификации.
Рассмотрим простой пример. Пусть есть датасет из 5-ти наблюдений:
@@ -600,7 +604,7 @@ $$\rho(x_1, x_5) = \sqrt{(0 - 0.55)^2 + (0 - 0)^2} = \sqrt{0.3}$$
Теперь картина получается максимально противоположная: объект $x_4$ оказывается самым удаленным объектом от $x_1$, а ближайшими к $x_1$ оказываются объекты $x_3$ и $x_5$, как и должно быть.
**Важный вывод:** для корректного рассчета расстояния между объекта и, как следствие, корректной работы kNN все признаки в датасете должны быть приведены к единому масштабу.
**Важный вывод:** для корректного расчёта расстояния между объектами и, как следствие, корректной работы kNN все признаки в датасете должны быть приведены к единому масштабу.
В scikit-learn методы масштабирования реализованы в модуле `preprocessing` виде следующих классов:
@@ -612,7 +616,7 @@ $$\rho(x_1, x_5) = \sqrt{(0 - 0.55)^2 + (0 - 0)^2} = \sqrt{0.3}$$
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler
```
* С помощью метода `fit()` происходит рассчет параметров масштабирования.
* С помощью метода `fit()` происходит расчёт параметров масштабирования.
* С помощью метода `transform()` выполняется трансформация (масштабирование) данных.
@@ -1508,7 +1512,7 @@ $$\omega_i = \frac{1}{\rho}$$
Указать способ инициализации весов можно с помощью параметра `weights`.
* По умолчанию значение параметра выставлено как 'uniform', что сооветствует равномерному распределению весов соседей, то есть все соседи имеют одинаковый и прогноз алгоритма выполняется путем мажоритарного голосования (в случае классификации) или усреднения таргета (для регрессии)
* По умолчанию значение параметра выставлено как `'uniform'`, что соответствует равномерному распределению весов соседей: все соседи имеют одинаковый вес, и прогноз алгоритма выполняется путём мажоритарного голосования (в случае классификации) или усреднения таргета (для регрессии).
* Если выставить значение данного параметра как 'distance', то веса распределяются обратно пропорционально расстоянию (по формуле $\omega_i = \frac{1}{\rho}$)
@@ -1578,7 +1582,7 @@ $$K(\rho) = \frac{1}{\sqrt{2\pi}}e^{-\frac{\rho^2}{2}}$$
Тогда с учетом ядерной функции, используемой для вычисления весов конечный вид формулы рассчета предсказания по найденным $k$ соседям будет иметь вид:
Тогда с учётом ядерной функции, используемой для вычисления весов, конечный вид формулы расчёта предсказания по найденным $k$ соседям будет иметь вид:
* **Для классификации:**
$$\hat{y}(x_t) = \arg \max_{y \in Y} \sum_{i=1}^{k} K(\frac{\rho_i}{h}) \mathbb{I}[y_i = y]$$
@@ -1597,13 +1601,13 @@ $$\hat{y_t}(x_t) = \frac{1}{\sum_{i=1}^k K\frac{\rho_i}{h}} \sum_{i=1}^k K(\frac
От выбора ядра зависит гладкость аппроксимации, но на её качество этот выбор почти не влияет.
На практике чаще всего используют либо единообразное (uniform) для простоты, либо гауссовское (gaussian), в случае когда важна гладкость модели (а она важна в случаерегрессии).
На практике чаще всего используют либо единообразное ядро (*uniform*) для простоты, либо гауссовское (*gaussian*), когда важна гладкость модели, например в случае регрессии.
Ширина окна же $h$ существенно влияет на качество модели и может быть использована в качестве гиперпараметра алгоритма и ее можно подбирать, также как и количество соседей.
При слишком маленькой ширине модель сильно подстраивается под обучающую выборку,теряет свою обобщающую способность и рисует переобучиться. При слишком большой ширине, наблюдается обратная ситуация - модель рискует недообучиться. Универсальной ширины окна не существует, поэтому для каждой задачи её приходится подбирать отдельно.
При слишком маленькой ширине модель сильно подстраивается под обучающую выборку, теряет свою обобщающую способность и рискует переобучиться. При слишком большой ширине наблюдается обратная ситуация - модель рискует недообучиться. Универсальной ширины окна не существует, поэтому для каждой задачи её приходится подбирать отдельно.
На рисунке ниже приведены [примеры](https://education.yandex.ru/handbook/ml/article/metricheskiye-metody) того как ядерная функция и ширина окна влияют на результаты регрессии:
@@ -1622,7 +1626,7 @@ $$\hat{y_t}(x_t) = \frac{1}{\sum_{i=1}^k K\frac{\rho_i}{h}} \sum_{i=1}^k K(\frac
Например, гаусовское ядро с шириной окна $h$ можно задать следующий образом:
Например, гауссовское ядро с шириной окна $h$ можно задать следующим образом:
```python
import numpy as np
@@ -1644,7 +1648,7 @@ knn_reg = KNeighborsRegressor(n_neighbors=5, weights=gaussian_kernel)
Вторая модификация классического алгоритма kNN связана с необходимостью оптимизации поиска соседей.
В классическом алгоритме предлагается предполагается, что для того, чтобы найти ближайших соседей для объекта $x_t$ нам нужно вычислить расстояние между этим объектом и всеми объектами из обучающей выборки $(x_i)_{i=1}^n$.
В классическом алгоритме предполагается, что для того, чтобы найти ближайших соседей для объекта $x_t$, нужно вычислить расстояние между этим объектом и всеми объектами из обучающей выборки $(x_i)_{i=1}^n$.
То есть нам нужно перебрать $n$ объектов. Такой "топорный" перебор называется методом грубой силы (brute force).
@@ -1682,6 +1686,8 @@ knn_reg = KNeighborsRegressor(n_neighbors=5, weights=gaussian_kernel)
* [Статья с примерами применения K-d- и Ball- деревьев](https://www.geeksforgeeks.org/ball-tree-and-kd-tree-algorithms/)
## Связанные заметки
- [[Линейные модели]] — контраст с параметрическими моделями: kNN хранит обучающие примеры и не строит явную линейную функцию
- [[Нейронные сети]] — другой класс моделей ML; в отличие от kNN, нейросети обучают веса и строят параметрическое отображение $Y=F(X)$
- [[Расстояние между объектами]] — формулы метрик (Евклид, Манхэттен, Минковский, Махаланобис) идентичны тем, что реализованы в sklearn; Math-нота даёт строгие определения
- [[Итерационная классификация. Метод K-средних (K-means)]] — K-means тоже классифицирует по минимальному расстоянию $\min \rho_{il}$; unsupervised-аналог kNN
- [[Наивный Байесовский алгоритм]] — альтернативный метод классификации с учителем из той же обучающей выборки
@@ -243,5 +243,6 @@ $$
## Связанные заметки
- [[Обратное распространение ошибки]]
- [[Обратное распространение ошибки для произвольного числа слоев НС]]
- [[Нейронные сети]]
- [[Линейные модели]]
@@ -143,5 +143,6 @@ Backpropagation - это не отдельный способ оптимизац
## Связанные заметки
- [[Обратное распространение ошибки - вывод]]
- [[Обратное распространение ошибки для произвольного числа слоев НС]]
- [[Нейронные сети]]
- [[Линейные модели]]