はじめに
分類問題を解く上で、もっとも基本かつ応用範囲の広いアルゴリズムの一つが「ロジスティック回帰(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
🔗 機械学習シリーズ 関連リンク
▶ 入門〜分類編
- 【入門】scikit-learnとは?機械学習の全体像と学習の流れ
- 【準備】sklearnのインストールとデータセットの扱い方
- 【分類①】K近傍法(KNN)を使ってシンプルな分類をしてみよう
- 【分類②】ロジスティック回帰でスパム判定をしてみよう
- 【分類③】決定木・ランダムフォレストの特徴と可視化方法
- 【分類④】混同行列・精度・再現率・F1スコアの正しい使い方
- 【モデル比較】SVM・決定木・ランダムフォレストの精度と解釈性の違い

コメント