Перейти к содержимому

SilhouetteScore

Silhouette Score оценивает качество кластеризации, когда истинные метки объектов неизвестны.

Метрика учитывает одновременно две вещи:

  • насколько близко объект расположен к другим объектам своего кластера;
  • насколько далеко он находится от ближайшего другого кластера.

Чем компактнее кластеры внутри и чем лучше они отделены друг от друга, тем выше значение метрики.

Для каждого объекта считаются две величины:

  • aia_i — среднее расстояние до объектов своего кластера;
  • bib_i — минимальное среднее расстояние до объектов другого кластера.

Силуэт объекта вычисляется по формуле:

si=biaimax(ai,bi)s_i = \frac{b_i - a_i}{\max(a_i, b_i)}

Если объект хорошо попал в свой кластер, то aia_i маленькое, а bib_i большое. Тогда силуэт близок к 1.

Итоговый Silhouette Score — среднее значение силуэта по всем объектам:

SilhouetteScore=1ni=1nsiSilhouetteScore = \frac{1}{n} \sum_{i=1}^{n} s_i

Значение метрики находится в диапазоне от -1 до 1.

близко к 1 объект хорошо находится внутри своего кластера
около 0 объект находится между кластерами
меньше 0 объект, возможно, попал не в тот кластер

Значение 1 не означает просто правильное разбиение. Оно возможно только тогда, когда точки внутри каждого кластера расположены очень близко друг к другу, а разные кластеры находятся далеко друг от друга.

Поэтому даже полностью правильная кластеризация может иметь значение, например, 0.7.

uses MLABC, PlotML;
begin
var (X, trueLabels) := Datasets.MakeBlobs(
n := 300,
centers := 3,
clusterStd := 0.7,
seed := 8
);
var model := new KMeans(3, seed := 42);
var labels := model.FitPredict(X);
var (xs, ys) := X.Cols(0, 1);
Plot.Points(xs, ys, labels, size := 4);
Plot.Points(model.Centers, color := Colors.Black, size := 12, marker := MarkerType.Cross);
Plot.Title := 'KMeans: найденные кластеры';
Println('Silhouette:', Metrics.SilhouetteScore(X, labels):0:3);
end.

Результат:

Silhouette: 0.716

Значение 0.716 является хорошим результатом. Точки внутри каждого кластера расположены заметно ближе друг к другу, чем к точкам других кластеров.

При этом Silhouette Score не сравнивает найденные кластеры с trueLabels. Он оценивает только геометрическую структуру кластеров.

Если нужно проверить совпадение найденного разбиения с известными правильными метками, используется другая метрика, например Adjusted Rand Index.

Silhouette Score полезен, когда истинных меток нет, а нужно сравнить разные варианты кластеризации.

Например, можно запустить KMeans с разным числом кластеров и выбрать вариант с лучшим силуэтом.

Silhouette Score основан на расстояниях, поэтому результат зависит от масштаба признаков.

Метрика лучше подходит для компактных и хорошо разделённых кластеров. Для кластеров сложной формы её значение не всегда полностью отражает качество разбиения.

Перед вычислением метрики часто стоит выполнить масштабирование.