Концепции ИИ на Python

Основы классификации: softmax и k ближайших соседей на Python

Классификация - это выбор метки, например «кошка» или «собака». Модель может выдать оценку для каждого класса, а softmax превратит их в вероятности; или простой метод вроде k ближайших соседей позволит проголосовать ближайшим известным примерам.

Суть простыми словами

Классификация - это выбор метки, например «кошка» или «собака». Модель может выдать оценку для каждого класса, а softmax превратит их в вероятности; или простой метод вроде k ближайших соседей позволит проголосовать ближайшим известным примерам.

Превратите оценки в вероятности классов с помощью softmax, оцените их кросс-энтропией и классифицируйте точки методом k ближайших соседей.

Главные идеи

  • Softmax сохраняет порядок оценок и делает их сумму равной 1.
  • Категориальная кросс-энтропия сильнее всего наказывает уверенные неправильные ответы.
  • У k-NN нет этапа обучения: он сравнивает новую точку с сохранёнными примерами.
  • Наивный Байес и деревья решений (неоднородность Джини, прирост информации) - другие классические классификаторы.

Когда это использовать?

  • Понять, что происходит внутри нейронных сетей и библиотек ИИ.
  • Разобраться в идее до того, как реализовать её в соответствующих задачах.
  • Подготовиться к курсам по машинному обучению, собеседованиям и проектам.

Посмотрите в действии

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

Пример кода

Запустить код →
main.py
import math
from collections import Counter

# Softmax turns raw scores into probabilities that add up to 1.
def softmax(scores):
    exps = [math.exp(s - max(scores)) for s in scores]
    total = sum(exps)
    return [e / total for e in exps]

probs = softmax([2.0, 1.0, 0.1])
print("softmax:", [round(p, 3) for p in probs])
# Cross-entropy is small when the true class gets a high probability.
print("cross-entropy if class 0 is right:", round(-math.log(probs[0]), 3))

# k-nearest neighbours: label a point by a vote of the closest examples.
examples = [((1, 1), "cat"), ((1, 2), "cat"), ((5, 5), "dog"), ((6, 5), "dog"), ((5, 6), "dog")]
def knn(point, k=3):
    nearest = sorted(examples, key=lambda e: math.dist(point, e[0]))[:k]
    return Counter(label for _, label in nearest).most_common(1)[0][0]

print("(2, 1) ->", knn((2, 1)))
print("(5, 4) ->", knn((5, 4)))

Ожидаемый результат

softmax: [0.659, 0.242, 0.099]
cross-entropy if class 0 is right: 0.417
(2, 1) -> cat
(5, 4) -> dog

Как это работает

softmax() возводит экспоненту в степени оценок и делит на их сумму, поэтому три вероятности в сумме дают 1; вычитание максимума заранее защищает от переполнения. Кросс-энтропия - это −log вероятности правильного класса. knn() сортирует примеры по расстоянию и даёт проголосовать трём ближайшим.

Измените значения и запустите программу в онлайн-компиляторе Python CodeUtility без локальной установки Python.

Практические задания

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

  1. Измените входные данные или веса и предскажите результат до запуска.
  2. Выводите промежуточные значения, чтобы проследить каждый шаг вычислений.
  3. Решите задачи по ссылкам ниже, чтобы самостоятельно реализовать идею.
Запустить в Python IDE →

Попрактикуйтесь на задаче

Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.

Все задачи