【分類②】ロジスティック回帰でスパム判定をしてみよう

はじめに

分類問題を解く上で、もっとも基本かつ応用範囲の広いアルゴリズムの一つが「ロジスティック回帰(Logistic Regression)」です。

回帰という名前がついていますが、これは 分類 を行うためのモデルです。確率的に分類を行うため、「このデータがスパムである確率は80%」のように出力できるのが特徴です。

本記事では、ロジスティック回帰の考え方とscikit-learnでの使い方を、架空のスパム判定データを使って解説していきます。


ロジスティック回帰とは?

ポイント

  • 線形回帰の出力を「シグモイド関数」で0〜1の確率に変換するモデル
  • 出力された確率が0.5以上なら「クラス1」、未満なら「クラス0」に分類
  • 線形分離可能な問題に強く、直線的な境界を引けるモデル

数式のイメージ

ロジスティック関数(シグモイド関数):

σ(z) = 1/(1 + e^z) (z = w・x + b)

ここで得られる出力 は 0〜1 の範囲となり、「そのクラスに属する確率」を意味します。

z = 0の時 σ(0) = 1/2


データの準備

架空のスパム判定データを作成

ここでは簡単な例として、架空のメールデータを用いたスパム分類を行ってみます。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# ダミーデータ
data = pd.DataFrame({
    "contains_link": [1, 1, 0, 0, 1, 0, 1, 0, 1, 0],
    "contains_money": [1, 0, 1, 0, 1, 0, 0, 1, 1, 0],
    "is_spam": [1, 1, 1, 0, 1, 0, 1, 0, 1, 0]
})

X = data[["contains_link", "contains_money"]]
y = data["is_spam"]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

モデル作成と学習・予測

モデルの定義と学習

model = LogisticRegression()
model.fit(X_train, y_train)

予測と評価

y_pred = model.predict(X_test)
print("正解率:", accuracy_score(y_test, y_pred))

確率で出力する predict_proba()

ロジスティック回帰では、各クラスに属する「確率」を出すことも可能です。

print(model.predict_proba(X_test))
  • 第1列:クラス0(非スパム)である確率
  • 第2列:クラス1(スパム)である確率

この確率を使えば、たとえば「0.8以上でスパムと判断」などの柔軟なルールも作れます。


決定境界の可視化(2次元データの場合)

import matplotlib.pyplot as plt
import numpy as np

# 学習済みモデルとX_train, y_trainを使用
coef = model.coef_[0]
intercept = model.intercept_

x_vals = np.array(plt.gca().get_xlim())
y_vals = -(coef[0] * x_vals + intercept) / coef[1]

plt.scatter(X_train["contains_link"], X_train["contains_money"], c=y_train, cmap='bwr')
plt.plot(x_vals, y_vals, '--')
plt.xlabel("contains_link")
plt.ylabel("contains_money")
plt.title("ロジスティック回帰によるスパム分類")
plt.show()

おわりに

ロジスティック回帰は、分類問題の基礎を理解する上で非常に重要なモデルです。シンプルなデータに適用することで、分類のしくみや決定境界の概念が直感的に理解できます。

次回は、決定木とランダムフォレストを用いた分類に進み、より複雑な境界を扱えるモデルへと進化させていきます。


練習問題

Q1. ロジスティック回帰で使われる関数は?

  • A. シグモイド関数
  • B. ReLU関数
  • C. ソフトマックス関数

Q2. predict_proba() の結果 [0.2, 0.8] が意味するのは?

  • A. クラス0で80%の確率
  • B. クラス1で80%の確率
  • C. 分類不能

Q3. 出力確率が0.8のデータをスパムと判断するには、分類のしきい値を何にすればよいか?

  • A. 0.3
  • B. 0.5
  • C. 0.8

🔗 機械学習シリーズ 関連リンク

▶ 入門〜分類編

▶ 回帰編

▶ 応用編


コメント

タイトルとURLをコピーしました