Найти тему
Программист о Data Science

День 16: [Decision Tree #3] Обучаем модель и измеряем точность

Всё оказалось не так уж сложно в этих решающих деревьях
Всё оказалось не так уж сложно в этих решающих деревьях
Ранее мы получили более иль менее подготовленные данные и мы можем начать обучение модели.

Но в первую очередь мы должны определиться с тем как мы будем проверять, что модель обучилась хорошо и её результатам можно верить. А что такое хорошо? Для определённости неплохо было бы оперировать числовыми метриками, а не описательными. И естественно такие есть у каждой модели. Какие из этих метрик качества общие для ряда моделей, какие-то специфичные для конкретной модели.

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

Самое простое, что можно придумать в плане метрик - это процент угаданных классов - так называемая точность или accuracy. Для этой метрики нам нужны "правильные ответы". Берут их как правильно из тех же данных, что заготовлены для обучения модели. Но если мы возьмём прямо те же данные, на которых модель обучалась, она очевидно покажет лучший результат, чем на данных, которые она не видела. Такая метрика нам ни о чём не скажет. Более того чем лучше эта метрика на тренировочных данных, тем больше вероятность того, что модель переобучилась (overfitting). То есть "зазубрила" тренировочные данные в ущерб "понимания" данных. Я думаю мы подробнее об этом ещё поговорим.

Но как же быть в таком случае? А очень просто. Данные до обучения делят на тренировочные и тестовые. Модель обучается на тренировочном подмножестве, а проверяется на тестовом.

В sklearn входит утилита по разделению DataFrame'а в нужном соотношении (по-умолчанию это 75% тренировочных и 25% тестовых):

train и test в данном случае - это DataFrame'ы
train и test в данном случае - это DataFrame'ы

Вот теперь мы готовы обучать модель:

Обратите внимание, что features_encoded - массив. Нам нужно его трансформировать в DataFrame, где каждый элемент массива будет сохранён в колонке со своим индексом.
Обратите внимание, что features_encoded - массив. Нам нужно его трансформировать в DataFrame, где каждый элемент массива будет сохранён в колонке со своим индексом.

Функция score модели считает как раз accuracy по фичам первого аргумента и сравнивает с эталоном во втором аргументе функции.

Точность очень большая, как раз потому что мы проверили её на тех же данных, что и скармливали модели. Но не 1, что в целом хороший знак, но в данном случае очень близко к единице. Похоже модель мы всё-таки переобучили.

Самое время вызвать функцию predict на тестовых данных:

Результат предсказаний сервиса по сообщению сохранён в колонку "predicted_service".
Результат предсказаний сервиса по сообщению сохранён в колонку "predicted_service".
Pandas DataFrame позволяет удобно фильтровать данные используя синтаксис df[df.field_name == 'value']. Оператор может быть любым логическим выражением, а value должно соответствовать типу поля.

Видно, что результат вроде неплохой. Неидеальный (неправильно угадал сервис для первого сообщения), но вроде приемлемый, что вроде также подтверждает оптимистичный accuracy.

Давайте посмотрим accuracy на всём объеме тестовых данных.

Результат удручающий. Accuracy - очень маленький. То есть с вероятностью в 28% модель выдаст правильный результат.
Результат удручающий. Accuracy - очень маленький. То есть с вероятностью в 28% модель выдаст правильный результат.

Вместе с accuracy я так же вывел и precision в разрезе по классам. Эта метрика отражает отношение количества TruePositives к сумме TruePositives и FalsePositives.

TruePositive - модель угадала конкретный класс как и должна
FalsePositive - модель не угадала конкретный класс, хотя должна была
TrueNegative - модель вывела конкретный класс, хотя его не было там
FalseNegative - модель не вывела конкретный класс, но и не должна была

Precision - ожидаемо тоже очень низкий для всех классов. Видно, что два класса вообще не были угаданы ни разу.

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

В любом случае, как уже упоминалось ранее, настоящий Data Science только начинается после получения первых результатов.

Наука
7 млн интересуются