Implementation of Naive Bayes classificator to solve task of filtration spam. Решаем задачу классификации спама с помощью наивного Байеса. Первая проблема, с которой мы столкнулись - непонятно, как превратить текст в признаки, потому что с таким прежде не работали, непонятно, что делать. На помощь приходит TF-IDF-vectorizer, который работает по следующему принципу: TF (частота термина или term frequency):
считает сколько слово появляется в данном документе, таким образом, измеряем важность слова в контексте каждого документа. IDF (Обратная частота документа): считает насколько часто слово появляется в каждом документе и берет обратную от него величину, чтобы понять насколько слово уникально для того, чтобы описывать каждый отдельный документ TF-IDF: TF-IDF(t, d) = TF(t,d) * IDF(t) Плюсы:
- Можем хоть как-то пытаться учитывать слова по их важности во всех документах
- Слова, которые встречаются во всех документах, например, слово the на английском, имеют очень низкое значение TF-IDF Минусы:
- Непонятно, как нормально оценивать предложения и вообще их склеивать
- Чувствительность к длине документа, поскольку нет нормировки на длину документа в TF, то более длинный документ по закону больших чисел может иметь больше вхождений t в d
- Воспользовались предположением о независимости наших признаков, хотя очевидно, что слова в предложении зависимы и нельзя просто напросто говорить о независимости признаков
- Признаков более тысячи, поэтому отсматривать точность в соответствии с нормальным распределением для каждого признака, для которого мы "набрасывали" равномерное распределение - не представляется возможным, поэтому считаем что все признаки распределены равномерно
- У нас очень несбалансированная выборка, один класс больше другого почти в 10 раз
- Нужно следить за тем, чтобы как можно больше спама попадало в нужную корзину
- При этом очень важно следить за тем, чтобы как можно меньше не спама попадало в спам Откуда напрашивается следить за метрикой:
- Precision/Recall и AUC-RPC (метрика AUC-RPC устойчива к дисбалансу классов) Где precision = (TP) / (TP + FP) (насколько точно мы угадываем первый класс), а Recall = (TP)/(TP + FN) - (насколько полно мы покрыли первый класс)

Наивный Байес показал довольно хорошие результаты для такой наивной имплементации, поэтому стоит отметить, что модель довольно хорошо решает нашу задачу, а точнее:
- Модель много лишних писем отправляет в спам (все равно приемлемо т.к значение 0.53 - хорошо)
- Однако, очень хорошо определяет где спам, а где нет Поэтому можем сделать вывод, что модель отлично справилась с задачей.
Однако, можем заметить, что линейная модель, а также нейронная сеть справились гораздо лучше с задачей(фотографии ниже соответственно):

Линейная модель меньше лишних писем отправляет в спам, приэтом ловит меньше спама, но именно потому, что меньше писем в спаме лишних - модель лучше справилась с задачей

Ну и по той же причине нейронная сеть справилась лучше обеих моделей, описанных вышею