Навчання

Вбудована модель працює одразу. Модель, навчена на вашій власній пошті, працює краще, бо вивчає, як виглядає ваш hamБажана пошта: протилежність спаму. (бажані листи): ваші розсилки, стиль ваших колег, мови, якими ви отримуєте пошту.

Навчання моделі#

Вкажіть train теки зі спамом і ham:

Shell
spamscanner train --spam ~/Maildir/.Junk --ham ~/Maildir/cur --ham ~/Maildir/.Archive --out my-model.json

Джерелами можуть бути:

  • файли mbox, зокрема стиснені gzip (.mbox.gz),
  • каталог Maildir (читаються його теки cur і new, tmp пропускається),
  • тека з файлами .eml, яка читається рекурсивно,
  • набір даних: файл CSV або JSON Lines зі стовпцем тексту й стовпцем мітки (--dataset). Стовпці з назвами text, message, body, email або content і label, category, class, spam або is_spam знаходяться автоматично; інакше використовуйте --text-column і --label-column. Розпізнаються мітки на кшталт spam, 1, phishing і ham, 0, not_spam, legitimate.

Дублікати листів ураховуються один раз. Щоб розвивати вбудовану модель, а не починати з порожньої, додайте --merge.

Використання моделі:

Shell
spamscanner scan message.eml --model my-model.json
SPAMSCANNER_MODEL=/var/lib/spamscanner/model.json spamscanner milter
JavaScript
const scanner = new SpamScanner({classifier: '/var/lib/spamscanner/model.json'});

Скільки пошти достатньо: кілька сотень листів кожного типу дають корисну модель, кілька тисяч — добру. Тримайте обидва типи приблизно збалансованими й додавайте до ham пошту, яку не треба фільтрувати (скидання паролів, рахунки від ваших постачальників).

Вимірювання#

Залиште частину пошти поза навчанням і вимірюйте на ній:

Shell
spamscanner eval --model my-model.json --spam held-out/spam --ham held-out/ham

Вбудована модель на SMS-повідомленнях 21 мовою, яких вона ніколи не бачила, здебільшого мовами, які вона ледве знає:

Text
Messages: 13028 spam, 92406 ham
Precision: 89.72%   Recall: 11.18%   F1: 19.89%
False positives: 167 (0.18% of ham)   False negatives: 132
Unsure: 91247 (86.54%)

Точність (precision) показує, яка частка того, що модель називає спамом, справді є спамом; повнота (recall) — яку частку спаму вона виявляє. Невизначені листи тут зараховуються як пропущений спам, хоча під час перевірки їх ще можуть виявити інші перевірки та мовна модель. Стежити варто за хибнопозитивними результатами: ham, позначеним як спам. У наведеному запуску модель здебільшого не впевнена щодо цих листів, а не помиляється, і саме такої поведінки очікують для мов, у яких вона бачила мало пошти.

--json видає ті самі числа для скриптів.

Навчання за скаргами#

Коли користувачі переміщують пошту в теку Junk або з неї, навчайте модель по одному листу:

Shell
spamscanner learn spam message.eml --model /var/lib/spamscanner/model.json
spamscanner learn ham message.eml --model /var/lib/spamscanner/model.json

Перший learn створює файл із вбудованої моделі. Через HTTP те саме роблять POST /learn/spam і /learn/ham у HTTP API, а spamc -L spam працює із сервером spamd з --allow-tell. IMAPSieve у Dovecot може викликати будь-який із них, коли лист переміщують.

З Node.js:

JavaScript
await scanner.learn(raw, 'spam');
await scanner.unlearn(raw, 'spam'); // undo, before learning it as ham
scanner.saveModel('/var/lib/spamscanner/model.json');

Лист, про який повідомили як про неправильно класифікований, слід спершу вилучити з навчання в хибному класі, а потім навчити в правильному, якщо його вже вивчали раніше.

Вбудована модель#

model/classifier.json збирається командою npm run model:train з таких відкритих наборів даних на Hugging Face, усі з вільними ліцензіями:

Набір данихЛіцензіяВміст
FredZhang7/all-scam-spamApache-2.0Повідомлення й листи 43 мовами
SetFit/enron_spamВідкритий дослідницький корпусКорпус Enron-Spam
alt-gnome/telegram-spamCC0-1.0Російські повідомлення з Telegram
tanaos/synthetic-spam-detection-dataset-german, -italian, -spanishMITСинтетичні повідомлення

Вона навчалася на 62 480 листах зі спамом і 76 489 листах ham. Скрипт відкладає кожен десятий лист, навчається на решті й вимірює лише класифікатор, без інших перевірок:

Відкладений тестЛистиТочністьПовнотаХибні спрацюванняНевизначені
Англійська6564100,0 %97,0 %0,0 %2,4 %
Російська1682100,0 %97,4 %0,0 %2,2 %
Італійська138998,1 %85,3 %1,8 %10,9 %
Німецька130997,7 %76,1 %2,2 %20,7 %
Іспанська128197,5 %82,5 %2,6 %16,8 %
Enron-Spam2888100,0 %93,1 %0,0 %4,5 %
all-scam-spam4236100,0 %88,8 %0,0 %11,2 %
Усі13 84099,2 %85,1 %0,5 %12,4 %

Спамом тут вважається ймовірність за класифікатором 99 % або більше — точка, у якій сам класифікатор досягає порогу спаму. Під час перевірки спам, щодо якого він менш упевнений, усе одно отримує бали, а інші перевірки додають свої.

Результати для німецької, іспанської та італійської отримано із синтетичних наборів даних, які містять майже однакові листи з мітками і спаму, і ham: частина цієї помилки — у мітках, а не в моделі. Найкращий спосіб виправити це — пошта вашими власними мовами. Числа для кожної мови й набору даних містяться в metadata.metrics моделі.

Більше мов#

npm run model:train -- --with multilingual-sms додає SMS Spam Multilingual Collection: SMS Spam Collection, машинно перекладену 21 мовою. Її не включено до вбудованої моделі, бо в її картці вказано ліцензію GPL; перевірте, чи це підходить для того, як ви поширюєте модель. Після навчання з нею результати на відкладених даних для мов, які вбудована модель ледве знає, були такими:

МоваЛистиТочністьПовнотаХибні спрацювання
Китайська430100,0 %82,3 %0,0 %
Арабська430100,0 %84,6 %0,0 %
Корейська412100,0 %80,4 %0,0 %
Японська48696,0 %85,7 %0,5 %
Гінді412100,0 %63,9 %0,0 %
Французька48098,6 %94,2 %0,6 %
Турецька220100,0 %73,1 %0,0 %

Перенавчання#

Shell
npm run model:train                       # downloads the datasets into data/ the first time
npm run model:train -- --no-download      # reuse data/
npm run model:train -- --out /tmp/model.json --max-features 200000

Файл моделі#

Модель — це файл JSON: кількість вивчених листів зі спамом і з ham, а для кожної хешованої ознаки — скільки листів зі спамом і з ham її містили, у відсортованому вигляді й закодовано в base64. Він не містить ні слів, ні тексту листів. --max-features залишає лише найчастіші ознаки, а --min-count відкидає рідкісні, обмінюючи точність на розмір; вбудована модель зберігає 400 000 ознак приблизно в 6 МБ.

Моделі зі Spam Scanner 6 і раніших версій завантажити не можна: вони хешували інші ознаки. Навчіть нову на тій самій пошті.

Редагувати цю сторінку на GitHub · Markdown ·