sa-learnの正しい使い方?

googleさんにsa-learnの使い方を聞いてみると、

  • SPAMを集めたフォルダをまとめてsa-learnしましょう
  • 1000通くらいやると効果があります
  • 5000通くらいで飽和します(それくらいまで頑張りましょう)
  • 他人宛のSPAMを学習させるのはあまりよくありません(だからメールボックス個別に学習させて方がいい)
  • 特に古いSPAMを学習させると「古いメールはSPAM」と判断されてしまう副作用が出てしまう可能性があります

とか教えてくれる。う〜ん。どうなんだろう。
自分としては、まずはきちんとしたフィルタがあって(たとえばTLECのやつ)、ベイジアンフィルタはまっさら状態から始めて、そしてそこからすり抜けるSPAMメールをどんどん追加してやるのが正攻法ではないかなぁ、と。
SPAMのトレンドは刻々と変化している訳だし、一ヶ月以上前のSPAMを学習させる意義は薄いのではないかなとも思う。
そして、既存のフィルタでSPAM判定されるメールについてsa-learnさせるのは、さて意味があるのか。
確かにSPAMSPAMとして学習させて何が悪い、効果はあれど逆効果ではないはず、とも思えるのだが、ちょっと考えてみる。

  • SPAM判定されているメールを学習させることで、メール全体のスコアを押し上げてしまう可能性はないか
  • そうすると、False-Positiveが発生し、HAM学習させる必要が発生してしまうことで、全体の効果を薄めてしまうのではないか

そう感じる訳で。
次に、サイト全体で共通のベイジアンフィルタを適用する意味について。

  • 大規模サイトにおいては、確かにSPAMの偏りが発生するかもしれないから、個別がいいのかもしれない
  • だけど、SPAMは相手を選んでいる訳ではなく、(何らかの方法で入手したメールアドレスに)無差別に送信しているのだから、対象となるメールが多いほうが学習効果も高いのでは

で、ある人にとってはSPAMだけど、別な人にとってはSPAMではないメールというのはそもそもあるのかという話になりそうだ。
自分のポリシーとしてはNOだろう。そして、「人は常に正しくSPAMを判定できる」と仮定できればユーザ別の学習フィルタなんて無意味。みんなでひとつのフィルタを学習させるほうが効果的だと思う。
ある意味で、RBLとかってそういうもんではないか。
だいぶ発散してしまったが、そういうわけで、うちのサイトは

  • サイト全体でひとつのデータベースに学習させる
  • SPAM判定にミスったものだけを学習させる
  • あと1ヶ月くらいはFalse-Negativeは我慢して辛抱強く学習をリアルタイムで続ける

という方針でいきます。
サイトワイドとするため、以下の設定は追加。
local.cf

bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status
bayes_ignore_header X-Spam-Report
bayes_ignore_header X-Spam-Checker-Version
bayes_ignore_header X-Becky-Status
bayes_ignore_header X-Virus-Scanned
bayes_ignore_header Delivered-To
bayes_ignore_header X-Original-To

Delivered-ToとかX-Original-Toあたり。効果があるのかは不明だけど、どのメールボックスに配信されたかという情報は学習の妨げになるのではとの考え。FromやToは詐称されている可能性があるから、学習の意味はありそうなので残しておく。こんな感じ。