前回のおさらいと今回のテーマ
こんにちは!前回は、機械学習における最も基本的なモデルである線形回帰モデルを実装し、データの傾向を予測する方法について学びました。線形回帰は、連続的な数値を予測するために用いられるモデルで、シンプルながら強力な手法です。
今回は、分類問題に対応するモデルであるロジスティック回帰について解説します。ロジスティック回帰は、データを分類するためのアルゴリズムで、二値分類(例:0と1、TrueとFalseなど)や多値分類にも対応しています。Scikit-learnを使ってロジスティック回帰モデルを実装し、その仕組みと活用方法を学びましょう。
ロジスティック回帰とは?
ロジスティック回帰(Logistic Regression)は、分類問題を解くための統計モデルです。名前に「回帰」とありますが、これは実際には分類タスクに使われます。線形回帰のように直線を使うのではなく、シグモイド関数と呼ばれるS字型の曲線を用いて、データを2つ以上のクラスに分類します。
ロジスティック回帰の数式は以下の通りです。
[
P(y=1|x) = \frac{1}{1 + e^{-(w_0 + w_1 \cdot x)}}
]
- ( P(y=1|x) ): 入力データ( x )がクラス1(例:True, 1)である確率
- ( w_0 ): バイアス項
- ( w_1 ): 特徴量に対する重み
- ( e ): 自然対数の底(約2.718)
この数式により、入力変数の値に基づいて出力がクラス1に分類される確率を求めます。
ロジスティック回帰モデルの実装
それでは、Scikit-learnを使ってロジスティック回帰モデルを実装していきます。以下のステップで進めます。
- データセットの準備
- データの前処理
- データの分割
- モデルの構築と訓練
- モデルの評価と予測
1. データセットの準備
まずは、Scikit-learnが提供するbreast_cancer
データセットを使用します。このデータセットは乳がんの診断に基づいたもので、診断結果を二値(0: 良性, 1: 悪性)で表しています。
import pandas as pd
from sklearn.datasets import load_breast_cancer
# データの読み込み
cancer = load_breast_cancer()
df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
df['target'] = cancer.target
# データの確認
print(df.head())
このデータセットには、30個の特徴量(例:腫瘍のサイズ、形状など)と、target
という目的変数(0: 良性, 1: 悪性)が含まれています。
2. データの前処理
データの前処理として、特徴量のスケーリングを行います。ロジスティック回帰はスケールに敏感なため、標準化を行うとモデルの精度が向上します。
from sklearn.preprocessing import StandardScaler
# 特徴量とターゲットの選択
X = df.drop('target', axis=1)
y = df['target']
# スケーリングの適用
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
3. データの分割
訓練データとテストデータに分割します。
from sklearn.model_selection import train_test_split
# データの分割
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
- train_test_split(): データを訓練用とテスト用に分割します。
test_size=0.2
はデータの20%をテスト用に使用することを意味します。
4. モデルの構築と訓練
次に、ロジスティック回帰モデルを作成し、訓練データで学習させます。
from sklearn.linear_model import LogisticRegression
# ロジスティック回帰モデルの作成と訓練
model = LogisticRegression()
model.fit(X_train, y_train)
- LogisticRegression(): ロジスティック回帰モデルを作成します。
- fit(): 訓練データとターゲットを使ってモデルを訓練します。
5. モデルの評価と予測
モデルの性能を評価するために、テストデータを使って予測を行い、正解率(Accuracy)を計算します。
# テストデータで予測
y_pred = model.predict(X_test)
# モデルの評価(正解率)
accuracy = model.score(X_test, y_test)
print(f"Accuracy: {accuracy}")
- predict(): テストデータを使ってクラスの予測を行います。
- score(): モデルの性能を正解率(Accuracy)で評価します。正解率は、全てのサンプルのうち、正しく分類されたサンプルの割合です。
モデルの可視化と解析
ロジスティック回帰モデルのパフォーマンスをより詳しく解析するために、混同行列とROC曲線を用います。
混同行列
混同行列を使うと、予測結果の詳細が分かります。例えば、良性(クラス0)と悪性(クラス1)をどれだけ正確に分類できているかが確認できます。
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
# 混同行列の計算
cm = confusion_matrix(y_test, y_pred)
# 混同行列の可視化
sns.heatmap(cm, annot=True, cmap='Blues', fmt='g')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.title('Confusion Matrix')
plt.show()
ROC曲線とAUCスコア
ROC曲線とAUCスコアを使って、モデルのパフォーマンスをさらに解析します。
from sklearn.metrics import roc_curve, roc_auc_score
# 予測確率の計算
y_prob = model.predict_proba(X_test)[:, 1]
# ROC曲線の描画
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
plt.plot(fpr, tpr, marker='.')
plt.title('ROC Curve')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.show()
# AUCスコアの計算
auc_score = roc_auc_score(y_test, y_prob)
print(f"AUC Score: {auc_score}")
- roc_curve(): ROC曲線を作成するための関数で、FPR(False Positive Rate)とTPR(True Positive Rate)を計算します。
- roc_auc_score(): AUC(Area Under the Curve)スコアを計算します。このスコアが1に近いほど、モデルの性能が高いことを示します。
まとめ
今回は、ロジスティック回帰モデルの基本的な実装方法について解説しました。ロジスティック回帰は、分類タスクの基本となるモデルで、二値分類や多値分類に広く使用されています。Scikit-learnを使うことで、データの前処理からモデルの訓練、評価まで一連の流れがシンプルに実装できます。今回の内容を基に、他のデータセットでも試してみて、分類タスクに対する理解を深めていきましょう。
次回予告
次回は、モデルの評価方法として、様々な評価指標を使って実装したモデルの性能を詳しく評価する方法を解説します。正解率だけでなく、精度や再現率、F1スコアなど、より深い分析ができるようになりましょう!
注釈
- 正解率(Accuracy): 全サンプルの中で正しく予測されたサンプ
ルの割合。
- ROC曲線: モデルの分類性能を視覚的に評価するための曲線。FPRとTPRの関係を示し、AUCスコアが高いほど性能が良い。
コメント