</>
Topic 3 of 6

Course materials are currently available in Russian only.

Классификация

Классификация — задача, где ответ — одна из заранее известных категорий: спам или нет, какой сорт растения, вернёт ли клиент кредит. Это самый частый вид задач машинного обучения.

Хорошая новость: в scikit-learn классификаторы устроены так же, как регрессоры, — fit, predict. Только y теперь — метки классов (строки или числа).

Метод ближайших соседей

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

from sklearn.neighbors import KNeighborsClassifier

X = [[150, 45], [160, 55], [165, 50], [180, 80], [185, 90], [175, 85]]   # рост, вес
y = ["лёгкий", "лёгкий", "лёгкий", "тяжёлый", "тяжёлый", "тяжёлый"]

model = KNeighborsClassifier(n_neighbors=3)
model.fit(X, y)
print(model.predict([[170, 60], [182, 83]]))

Близость — обычное расстояние между точками: √{(x1 - x2)2 + (y1 - y2)2}.

Выбор k важен:

  • маленькое k (1–2) — модель чувствительна к шуму и случайным выбросам, легко переобучается;
  • большое k — модель слишком «сглаживает» и игнорирует мелкие группы.

Обычно перебирают несколько значений k и выбирают лучшее по качеству на отложенной выборке.

Важно: если признаки в разных масштабах (рост в сантиметрах, доход в рублях), признак с большими числами будет «перевешивать» в расстоянии. Как это исправлять — в теме про подготовку признаков.

Логистическая регрессия

Несмотря на название, это модель классификации. Она считает взвешенную сумму признаков (как линейная регрессия) и превращает её в вероятность от 0 до 1:

from sklearn.linear_model import LogisticRegression

X = [[1, 2], [2, 1], [3, 3], [10, 12], [12, 9], [15, 14]]   # страницы, минуты
y = [0, 0, 0, 1, 1, 1]                                      # купил или нет

model = LogisticRegression().fit(X, y)
print(model.predict([[5, 5]]))          # класс
print(model.predict_proba([[5, 5]]))    # вероятности каждого класса

Вероятности: predict_proba

predict_proba возвращает таблицу: строка — объект, столбец — класс, значения — вероятности, в сумме 1. Порядок столбцов — как в model.classes_ (классы по возрастанию):

print(model.classes_)                      # [0 1]
print(model.predict_proba([[5, 5]])[:, 1]) # вероятность класса 1

Вероятность полезнее «голого» класса: можно выбрать свой порог («звонить клиенту, если вероятность покупки больше 30 %»), а можно ранжировать объекты.

Доля верных ответов

Простейшая метрика классификации — accuracy, доля правильных ответов:

from sklearn.metrics import accuracy_score

print(accuracy_score(y_test, model.predict(X_test)))

У классификаторов model.score(X_test, y_test) возвращает то же самое. Другие метрики и их подводные камни — в следующей теме.

Итог

  • классификация — предсказание категории; y — метки классов;
  • KNeighborsClassifier(n_neighbors=k) — голосование k ближайших соседей;
  • LogisticRegression() — линейная модель с вероятностями классов;
  • predict — класс, predict_proba — вероятности (столбцы в порядке classes_);
  • accuracy_score(y_true, y_pred) — доля верных ответов.