0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【続・スパムメール分類】魔法の呪文TfidfとNgramでSIGNATEスコアを爆上げさせよう!

Posted at

こんにちは、神楽 朔です!

前回の記事
【Python初心者向け】1時間でスパムメール分類モデルを作ってみた(SIGNATEチュートリアル徹底解説)
では、無事にスパムメール分類AIを完成させることができました。
しかし、提出したスコアを見て、こう思いませんでしたか?

「もっと上を目指したい!でも、何をすればいいんだ…?」

この記事は、そんなあなたのための**「ネクストステップ」**です。

チュートリアルで使ったCountVectorizerという基本技から、まるで魔法の呪文のようなTfidfVectorizerN-gramという2つの強力な技を繰り出すことで、AIを"覚醒"させ、スコアを劇的に向上させる方法を伝授します。

この記事を読み終える頃には、「なんとなくできた」状態から、「なぜ精度が上がるのか」を自分の言葉で語れるようになっているはずです。さあ、AIと一緒に成長する旅に出ましょう!


なぜスコアが伸び悩むのか?AIくんの"悩み"

前回のモデルで使ったCountVectorizerは、「単語の出現回数」だけを数える真面目な子でした。
例えば、こんなメールがあったとします。

メールA: 「The winner is you! Click the link!」
メールB: 「The meeting is scheduled.」

この2つのメールをCountVectorizerくんに見せると、彼はこう考えます。
「ふむふむ… "The" と "is" がどっちのメールにも1回ずつ出てくるな。これは共通の特徴に違いない!」

ここに落とし穴があります。
私たち人間なら、「Theisなんて、どんな文章にも出てくるから無視していい。重要なのは winnerClick の方だ!」と直感的にわかりますよね。

しかし、単純な回数しか見れないAIくんは、本当に重要な単語どうでもいい単語の区別がつきません。これが、チュートリアルモデルの限界でした。


技1:TfidfVectorizer - "レア度"で単語に重みをつける魔法

AIくんに「単語の重要度」を教える魔法、それが TfidfVectorizer です。
これは、2つの指標を掛け合わせることで、単語のスコアを計算します。

  • TF (Term Frequency - 単語の出現頻度)
    • 「そのメールの中で、その単語がたくさん出てくれば重要だろう」という考え方。
    • 例:「money money money」と連呼するメールは、moneyが重要。
  • IDF (Inverse Document Frequency - 逆文書頻度)
    • 色々なメールに頻繁に出てくる単語は、特徴としての価値が低い」という考え方。
    • 例:「the」「a」「is」のような単語は、どのメールにも出てくるので価値(スコア)が低くなります。
    • 逆に、「viagra」「winner」のような、特定のメールにしか出てこないレアな単語は、価値(スコア)が高くなります。

つまり、TF-IDFとは 「そのメールではよく見るけど、他のメールではあまり見ない、超個性的な単語」 ほど高いスコアを与える魔法なのです!

実装:呪文を唱えてみよう!

驚くべきことに、この強力な魔法は、チュートリアルのコードをほんの少し変えるだけで使えます。

# 前回使ったCountVectorizer
# from sklearn.feature_extraction.text import CountVectorizer

# 今回使うTfidfVectorizerにチェンジ!
from sklearn.feature_extraction.text import TfidfVectorizer

# ... (データの読み込みや前処理は前回と同じ) ...

# ----------------------------------------------------
# ★★★ここを変えるだけ!★★★
# ----------------------------------------------------
# vectorizer = CountVectorizer() # 以前のコード
vectorizer = TfidfVectorizer()  # 新しい魔法の呪文!
# ----------------------------------------------------

# これ以降の .fit_transform や .transform の使い方は全く同じ
X_train_array = vectorizer.fit_transform(X_train).toarray()
X_valid_array = vectorizer.transform(X_valid).toarray()

たったこれだけで、AIくんは単語のレア度を学習し、賢くなります。
ぜひ、この状態で一度スコアを提出してみてください。きっとスコアが上がっているはずです。


技2:N-gram - 単語の"コンボ"を認識させる合わせ技

TfidfVectorizerで賢くなったAIくんですが、まだ弱点があります。
彼は単語を一つ一つバラバラにしか見ていません。

メールC: 「Please click here for your prize.」
メールD: 「Here is the document. Please click to open.」

AIくんにとって、この2つのメールに出てくる clickhere は、どちらも同じ「ただの単語」です。
しかし、私たちは click hereというコンボ(組み合わせ)は、スパムメールでよく見る怪しいやつだ!」 と知っています。

この単語の"コンボ"をAIくんに教える技が、N-gram (エヌグラム) です。

N-gramは、隣り合ったN個の単語を一つのセットとして扱います。

  • 1-gram (unigram): いつもの。単語1つずつ。(Please, click, here, ...)
  • 2-gram (bigram): 隣り合った単語2つの組み合わせ。(Please click, click here, here for, ...)
  • 3-gram (trigram): 隣り合った単語3つの組み合わせ。(Please click here, click here for, ...)

TfidfVectorizerに「2-gramも特徴として使ってね!」と指示するだけで、AIくんは単語のコンボ攻撃も学習できるようになります。

実装:合わせ技を発動!

これも、TfidfVectorizerにオプションを追加するだけ。簡単です。

# TfidfVectorizerを呼び出すときに、オプションを追加する
vectorizer = TfidfVectorizer(
    ngram_range=(1, 2)  # ★★★この一行を追加!★★★
)

ngram_range=(1, 2) というのは、「1-gram(単語単体)と 2-gram(2単語コンボ)の両方を特徴として使ってください」という意味です。
これで、AIくんは「clickという単語」と「click hereというコンボ」の両方を武器として戦えるようになり、さらに強くなります。


最終決戦:最強の呪文をまとめた完全コード

それでは、これまでに学んだ2つの魔法を組み合わせ、さらに強力なAIモデルLogisticRegressionを使った最終コードをお見せします。
これを実行すれば、あなたのスパムメール分類AIは真の力を発揮するでしょう!

# ===================================================================
# 魔法の呪文をすべて盛り込んだ完全版コード
# ===================================================================

# 1. ライブラリのインポート(前回と同じ)
# ... (省略) ...

# 2. データの読み込みと前処理(前回と同じ)
# ... (省略) ...


# 3. AIを覚醒させる魔法の詠唱
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression

# 技1(Tfidf)と技2(N-gram)を同時に発動!
# max_features=5000: 武器(単語)を強力なもの5000個に厳選するオプション
vectorizer = TfidfVectorizer(
    ngram_range=(1, 2),
    max_features=5000
)

# 訓練データで魔法の辞書を作成し、数値化
X_train_array = vectorizer.fit_transform(X_train).toarray()
X_valid_array = vectorizer.transform(X_valid).toarray()
test_array = vectorizer.transform(test['text_processed']).toarray()


# 4. より強力なAIモデル(ロジスティック回帰)を召喚し、学習させる
model = LogisticRegression(random_state=42)
model.fit(X_train_array, y_train)


# 5. 性能評価と提出ファイルの作成
# ... (前回と同じ) ...

まとめ:AIは魔法で強くなる!

今回は、スパムメール分類AIのスコアを向上させるための2つの強力なテクニックを紹介しました。

  • TfidfVectorizer: 単純な回数ではなく、単語の 「レア度」 を考慮する魔法。
  • N-gram: バラバラの単語だけでなく、「単語のコンボ」 を認識させる合わせ技。

重要なのは、「なんとなくコードを変えたらスコアが上がった」ではなく、「AIが何を苦手としていて、それを解決するためにどんな魔法(手法)を使ったのか」 を理解することです。

この考え方は、スパムメール分類だけでなく、あらゆるデータ分析の冒険で役立つ最強の武器になります。
ぜひ、あなた自身の手でAIを覚醒させ、さらなる高みを目指してみてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?