Классификация
Классификация — задача, где ответ — одна из заранее известных категорий: спам или нет, какой сорт растения, вернёт ли клиент кредит. Это самый частый вид задач машинного обучения.
Хорошая новость: в 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)— доля верных ответов.