機械学習の具体的な問題にPythonを使って、機械学習もPythonも同時に学んでしまいましょう。今回は分類問題を機械学習を使って解く際によく使われるロジスティック回帰(Logistic Regression)についてまとめました。ロジスティック回帰は、0または1(Yes/Noなど)の2値分類に適しています。
この記事では scikit-learn(sklearn)ライブラリを用います。適宜
pip install scikit-learn
などによってダウンロード・インストールしてください。
ロジスティック回帰の実装
ロジスティック回帰では、次のシグモイド関数の出力を確率として解釈します。
この値が 0.5 未満の場合には0、0.5 以上の場合には1と分類します。問題としては、与えられたデータセットから、パラメタ と
の妥当な値を求めることです。実装は以下の通りです:
from sklearn.linear_model import LogisticRegression import numpy as np # サンプルデータ(特徴量Xとラベルy) X = np.array([[1], [2], [3], [4], [5]]) # 特徴量 y = np.array([0, 0, 0, 1, 1]) # クラス(0 or 1) # モデルの作成と学習 model = LogisticRegression() model.fit(X, y) # 予測 x_pred np.array([[2.5], [3.5], [4.5]]) y_pred = model.predict(x_pred) # 結果表示 print("予測結果:", y_pred) print("モデルの精度:", model.score(X, y))
予測結果: [0 0 1] モデルの精度: 1.0
ポイント
- model.fit(X, y) でモデルを学習
- model.predict(X) で分類結果を取得
- model.score(X, y) で精度を計算(1.0なら完璧な分類)
ロジスティック回帰の決定境界の可視化
上で扱ったデータセットと、そこから得られたロジスティック回帰モデルがどのような基準で分類しているのか、その境界をグラフで可視化してみます。
import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LogisticRegression # サンプルデータ(特徴量Xとラベルy) X = np.array([[1], [2], [3], [4], [5]]) # 特徴量 y = np.array([0, 0, 0, 1, 1]) # クラス(0 or 1) # モデルの作成と学習 model = LogisticRegression() model.fit(X, y) # 予測用データの作成(1~5の範囲で細かく分割) X_test = np.linspace(0, 6, 100).reshape(-1, 1) y_prob = model.predict_proba(X_test)[:, 1] # クラス1の確率 # グラフ描画 plt.scatter(X, y, color="blue", label="Data") # 実際のデータ plt.plot(X_test, y_prob, color="red", linewidth=2, label="Logistic Regression") # 確率曲線 # 決定境界(確率0.5の位置) plt.axhline(0.5, color="gray", linestyle="--", linewidth=1) plt.axvline(X_test[np.abs(y_prob - 0.5).argmin()], color="green", linestyle="--", linewidth=1, label="Decision Boundary") # タイトルとラベル plt.title("Plotting Decision Boundary") plt.xlabel("Feature") plt.ylabel("Probability") plt.legend() plt.show()
ポイント
- model.predict_proba(X_test)[:, 1] で クラス1の確率 を取得
- plt.plot(X_test, y_prob) で 確率曲線 を描画
- plt.axhline(0.5) と plt.axvline() で 決定境界(クラス0/1の分かれ目) を可視化