Ранее мы получили более иль менее подготовленные данные и мы можем начать обучение модели.
Но в первую очередь мы должны определиться с тем как мы будем проверять, что модель обучилась хорошо и её результатам можно верить. А что такое хорошо? Для определённости неплохо было бы оперировать числовыми метриками, а не описательными. И естественно такие есть у каждой модели. Какие из этих метрик качества общие для ряда моделей, какие-то специфичные для конкретной модели.
Как правило используют сразу несколько метрик для анализа качества модели. Каждая метрика раскрывает это самое качество со своей стороны.
Самое простое, что можно придумать в плане метрик - это процент угаданных классов - так называемая точность или accuracy. Для этой метрики нам нужны "правильные ответы". Берут их как правильно из тех же данных, что заготовлены для обучения модели. Но если мы возьмём прямо те же данные, на которых модель обучалась, она очевидно покажет лучший результат, чем на данных, которые она не видела. Такая метрика нам ни о чём не скажет. Более того чем лучше эта метрика на тренировочных данных, тем больше вероятность того, что модель переобучилась (overfitting). То есть "зазубрила" тренировочные данные в ущерб "понимания" данных. Я думаю мы подробнее об этом ещё поговорим.
Но как же быть в таком случае? А очень просто. Данные до обучения делят на тренировочные и тестовые. Модель обучается на тренировочном подмножестве, а проверяется на тестовом.
В sklearn входит утилита по разделению DataFrame'а в нужном соотношении (по-умолчанию это 75% тренировочных и 25% тестовых):
Вот теперь мы готовы обучать модель:
Функция score модели считает как раз accuracy по фичам первого аргумента и сравнивает с эталоном во втором аргументе функции.
Точность очень большая, как раз потому что мы проверили её на тех же данных, что и скармливали модели. Но не 1, что в целом хороший знак, но в данном случае очень близко к единице. Похоже модель мы всё-таки переобучили.
Самое время вызвать функцию predict на тестовых данных:
Pandas DataFrame позволяет удобно фильтровать данные используя синтаксис df[df.field_name == 'value']. Оператор может быть любым логическим выражением, а value должно соответствовать типу поля.
Видно, что результат вроде неплохой. Неидеальный (неправильно угадал сервис для первого сообщения), но вроде приемлемый, что вроде также подтверждает оптимистичный accuracy.
Давайте посмотрим accuracy на всём объеме тестовых данных.
Вместе с accuracy я так же вывел и precision в разрезе по классам. Эта метрика отражает отношение количества TruePositives к сумме TruePositives и FalsePositives.
TruePositive - модель угадала конкретный класс как и должна
FalsePositive - модель не угадала конкретный класс, хотя должна была
TrueNegative - модель вывела конкретный класс, хотя его не было там
FalseNegative - модель не вывела конкретный класс, но и не должна была
Precision - ожидаемо тоже очень низкий для всех классов. Видно, что два класса вообще не были угаданы ни разу.
Причиной такой плохой модели может быть многое, например плохо подготовленные данные или данных слишком мало, может быть слишком много или мало было признаков, а может быть модели были плохо настроены. Всегда остаётся вероятность того, что мы выбрали просто неподходящую модель классификации - для этого нужно было бы побольше времени уделить на анализ данных.
В любом случае, как уже упоминалось ранее, настоящий Data Science только начинается после получения первых результатов.