ロジスティック回帰は、バイナリ分類問題に適した統計学上の手法であり、データ分析において広く利用されています
本記事では、Pythonでロジスティック回帰を実装する方法や、活用事例について解説し、今回の記事を参考に、Pythonでロジスティック回帰を実装できるようになっていきましょう
ロジスティック回帰をマスターできれば、マーケティングや医療、金融などの分野でバイナリ分類問題に取り組むことができます
さらに、Pythonのデータ分析に関心がある方は、Pythonでデータ分析を始めよう!挫折しない実践ガイドでスキルアップを参考に、データ分析の理解を深めていきましょう
ロジスティック回帰の基本概念
ロジスティック回帰は、線形回帰と同様に、説明変数と目的変数の関係をモデル化する手法ですが、目的変数がカテゴリカルデータ(2値データ)である場合に特化しています
例えば、クリック率予測や病気の有無判定など、2つのカテゴリに分類する問題に適している分析方法です
バイナリ分類問題
バイナリ分類問題(二値分類問題とも呼ばれる)は、データ分析や機械学習において、与えられたデータを2つのクラス(カテゴリ)に分類するタイプの問題です
これは、データがある基準に基づいて、2つのグループに分けられる場合に適用されます
バイナリ分類問題の典型的な例としては、以下のようなものがあります
- スパムメールの検出:メールがスパム(不要なメール)か、そうでないかを判断する
- 顧客の離反予測:顧客が今後サービスを継続するか、離れていくかを予測する
- 病気の診断:患者がある病気にかかっているか、かかっていないかを判断する
バイナリ分類問題を解決するためには、様々な機械学習アルゴリズムが利用されます
主なアルゴリズムには、ロジスティック回帰、サポートベクターマシン(SVM)、決定木、ランダムフォレスト、ニューラルネットワークなどがあります
これらのアルゴリズムは、与えられたデータをもとに、最も適切なクラスに分類するためのモデルを学習します
シグモイド関数
ロジスティック回帰では、シグモイド関数(ロジスティック関数)を使用して、線形関数の結果を確率(0から1の範囲)に変換します
シグモイド関数は以下の式で表されます
f(x) = 1 / (1 + exp(-x))
ソフトマックス関数
ソフトマックス関数は、多クラス分類問題において、各クラスに属する確率を計算するために使用される関数です
ロジスティック回帰やニューラルネットワークなどの機械学習モデルの出力層でよく用いられます
ソフトマックス関数は、入力ベクトルの各要素に指数関数を適用し、正規化を行うことで、出力ベクトルの各要素が0から1の範囲の値を取り、その合計が1になるようにします
これにより、出力ベクトルは確率分布として解釈できます。
ソフトマックス関数は以下の式で表されます
softmax(x)_i = exp(x_i) / Σ exp(x_j)
Pythonでロジスティック回帰を実装する方法
では、実際にPythonでロジスティック回帰を実装していきたいと思います
Pythonでロジスティック回帰分析を実装する大まかな流れとしては、次のようになります
- データの前処理: データセットのクリーニング、欠損値の処理、カテゴリカル変数のエンコーディング、標準化や正規化などのスケーリングを行います
- モデルの訓練: 説明変数と目的変数を用いて、ロジスティック回帰モデルを訓練します。最尤法や勾配降下法などの最適化アルゴリズムを用いて、モデルのパラメータを推定します
- モデルの評価: 一般的に、正解率(accuracy)、適合率(precision)、再現率(recall)、F1スコア(F1 score)などの指標を用いて、モデルの性能を評価します
- 予測: 新しいデータに対して、モデルを使用してカテゴリの予測を行います。予測された確率が閾値(通常は0.5)を超える場合、正のクラスと予測されます
データの正規化や標準化、エンコーディングについては、Pythonデータ分析の強力な味方|scikit-learn入門ガイドで解説しているので、そちらも参考にしてください
ライブラリのインポート
まずはじめに、ロジスティック回帰分析を行うのに必要なライブラリをインポートします
今回は、pandas
、numpy
、matplotlib
、sklearn
を使用します
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
import matplotlib.pyplot
データセットの読み込みと前処理
次に、分析するデータセットを読み込み、前処理を行います
データセットは、CSVファイルやExcelファイルなど、様々な形式のものを使用することができます
# データセットの読み込み
data = pd.read_csv('data.csv')
# データセットの前処理(欠損値処理、カテゴリ変数のエンコーディングなど)
data = data.dropna()
data['category'] = data['category'].astype('category').cat.codes
csvファイルがない場合には、Numpyを使って、サンプルデータを作成しましょう
# サンプルデータセットを作成します(ここでは、2つの特徴量と2つのクラスを持つデータセットを使用しています)。
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9]])
y = np.array([0, 0, 1, 1, 0, 1, 1, 1])
生成されたデータは、線形回帰やロジスティック回帰の例に使用できます
特徴量の数やサンプル数を変更して、検証に適したデータを作成できます
Numpyについて、理解を深めたい場合には、データ分析に必須のNumPy入門から活用までの完全ガイドも参考にしてください
訓練データとテストデータの分割
データセットを訓練データとテストデータに分割します
これにより、モデルの性能を正確に評価することができます
train_test_split
関数を使用して、データを分割していきます
# データを訓練データとテストデータに分割します(この例では、訓練データが75%、テストデータが25%です)。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
ロジスティック回帰モデルの構築と学習
LogisticRegression
クラスを使用して、ロジスティック回帰モデルを構築し、学習させます
# ロジスティック回帰モデルをインスタンス化します。
logreg = LogisticRegression()
# 訓練データを使ってモデルを学習させます。
logreg.fit(X_train, y_train)
モデルの評価
モデルの性能を評価するために、classification_report
とconfusion_matrix
を使用して、精度、適合率、再現率、F1スコア、混同行列を表示します
# テストデータを使って予測を行います。
y_pred = logreg.predict(X_test)
# モデルの精度を評価します。
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: {:.2f}".format(accuracy * 100))
# 詳細な分類レポートを表示します。
report = classification_report(y_test, y_pred)
print("\nClassification Report:\n", report)
# 訓練データの予測結果を取得
y_train_pred = logreg.predict(X_train)
# テストデータの予測結果を取得
y_test_pred = logreg.predict(X_test)
# 訓練データの精度、適合率、再現率、F1スコアを計算
train_accuracy = accuracy_score(y_train, y_train_pred)
train_precision = precision_score(y_train, y_train_pred)
train_recall = recall_score(y_train, y_train_pred)
train_f1 = f1_score(y_train, y_train_pred)
# テストデータの精度、適合率、再現率、F1スコアを計算
test_accuracy = accuracy_score(y_test, y_test_pred)
test_precision = precision_score(y_test, y_test_pred)
test_recall = recall_score(y_test, y_test_pred)
test_f1 = f1_score(y_test, y_test_pred)
# 混同行列を計算
cm_train = confusion_matrix(y_train, y_train_pred)
cm_test = confusion_matrix(y_test, y_test_pred)
# 結果を表示
print("Train Accuracy: {:.3f}".format(train_accuracy))
print("Train Precision: {:.3f}".format(train_precision))
print("Train Recall: {:.3f}".format(train_recall))
print("Train F1-score: {:.3f}".format(train_f1))
print("Train Confusion Matrix:\n", cm_train)
print("\nTest Accuracy: {:.3f}".format(test_accuracy))
print("Test Precision: {:.3f}".format(test_precision))
print("Test Recall: {:.3f}".format(test_recall))
print("Test F1-score: {:.3f}".format(test_f1))
print("Test Confusion Matrix:\n", cm_test)
可視化
# 可視化
# 訓練データとテストデータをプロットします。
plt.scatter(X_train[y_train == 0][:, 0], X_train[y_train == 0][:, 1], color='red', marker='o', label='Train Class 0')
plt.scatter(X_train[y_train == 1][:, 0], X_train[y_train == 1][:, 1], color='blue', marker='^', label='Train Class 1')
plt.scatter(X_test[y_test == 0][:, 0], X_test[y_test == 0][:, 1], color='red', marker='o', facecolors='none', s=100, label='Test Class 0')
plt.scatter(X_test[y_test == 1][:, 0], X_test[y_test == 1][:, 1], color='blue', marker='^', facecolors='none', s=100, label='Test Class 1')
# ロジスティック回帰の境界線をプロットします。
x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max, 100),
np.linspace(x2_min, x2_max, 100))
Z = logreg.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
Z = Z.reshape(xx1.shape)
#境界線をプロットします。
plt.contour(xx1, xx2, Z, colors='green', linewidths=0.5)
#グラフの見た目を整え、凡例を追加します。
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Logistic Regression Classifier')
plt.legend(loc='upper left')
#グラフを表示します。
plt.show()
ハイパーパラメータチューニング
これでPythonを使って、ロジスティック回帰分析を実装することができました
ロジスティック回帰モデルの性能を向上させる方法の1つに、ハイパーパラメータチューニングがあります
ハイパーパラメータは、学習プロセスに影響を与えるが、データから直接学習されないパラメータです
scikit-learnのGridSearchCV
を用いて、最適なハイパーパラメータの組み合わせを見つけましょう
ハイパーパラメータの候補の設定
まず、調整したいハイパーパラメータとその候補の範囲を設定します
# ハイパーパラメータの候補
param_grid = {
'penalty': ['l1', 'l2', 'elasticnet', 'none'],
'C': [0.001, 0.01, 0.1, 1, 10, 100],
'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'],
'max_iter': [100, 200, 300, 400, 500]
}
グリッドサーチの実行
GridSearchCV
を使用して、設定したハイパーパラメータの候補に対してグリッドサーチを実行します
# グリッドサーチの実行
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid_search.fit(X_train, y_train)
最適なハイパーパラメータの取得とモデルの再学習
最適なハイパーパラメータを取得し、そのパラメータを使用してモデルを再学習します
# 最適なハイパーパラメータの取得
best_params = grid_search.best_params_
print("Best parameters: ", best_params)
# 最適なハイパーパラメータでモデルを再学習
best_model = LogisticRegression(**best_params)
best_model.fit(X_train, y_train)
チューニング後のモデルの評価
ハイパーパラメータチューニング後のモデルの性能を評価します
# テストデータに対する予測
y_pred_tuned = best_model.predict(X_test)
# 評価指標の表示
print(classification_report(y_test, y_pred_tuned))
print(confusion_matrix(y_test, y_pred_tuned))
ハイパーパラメータチューニングにより、モデルの性能が向上するとも限りませんが、より適切なハイパーパラメータの選択により、より良い予測結果が得られる可能性があります
ロジスティック回帰を活用したマーケティング戦略
ここからはロジスティック回帰を活用して、マーケティング戦略に役立てる方法を紹介します
マーケティング分野に活用することができる、データ分析手法は、Pythonでマーケティングに活用できるデータ分析手法を公開【サンプルコードあり】で詳細に解説をしています
顧客セグメンテーション
顧客データを使用して、ロジスティック回帰モデルを構築し、顧客が特定の製品やサービスを購入する確率を予測します
予測された確率に基づいて、顧客をセグメント化し、異なるマーケティング戦略を適用することができます
顧客セグメンテーションをロジスティック回帰分析で実装する際の、サンプルコードです
この例では、顧客の年齢と収入を特徴量として、顧客が特定の商品を購入するかどうか(購入する=1、購入しない=0)を予測しています
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
# データの作成 (年齢, 収入, 商品購入フラグ)
data = pd.DataFrame({
'Age': [25, 30, 35, 40, 45, 50, 55, 60, 65, 70],
'Income': [30000, 35000, 40000, 45000, 50000, 55000, 60000, 65000, 70000, 75000],
'Purchased': [0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
})
# 特徴量と目的変数に分割
X = data[['Age', 'Income']]
y = data['Purchased']
# データをトレーニングセットとテストセットに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# ロジスティック回帰モデルのインスタンスを作成し、トレーニングデータで学習
lr_model = LogisticRegression()
lr_model.fit(X_train, y_train)
# テストデータで予測
y_pred = lr_model.predict(X_test)
# 結果の評価
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))
print("\nClassification Report:\n", classification_report(y_test, y_pred))
# 可視化
plt.scatter(data['Age'][data['Purchased'] == 0], data['Income'][data['Purchased'] == 0], c='blue', label='Not Purchased')
plt.scatter(data['Age'][data['Purchased'] == 1], data['Income'][data['Purchased'] == 1], c='red', label='Purchased')
plt.xlabel('Age')
plt.ylabel('Income')
plt.legend()
plt.show()
マーケティングキャンペーンの効果測定
過去のマーケティングキャンペーンのデータを使用して、ロジスティック回帰モデルを構築し、キャンペーンの効果を測定することができます
これにより、効果的なキャンペーンを特定し、今後のマーケティング戦略に活かすことができます
クロスセル・アップセルの最適化
ロジスティック回帰を使用して、顧客が特定の製品に対してクロスセル(関連商品の提案)やアップセル(高価なバージョンの提案)に興味を持つ可能性を予測します
これにより、個々の顧客に適切な商品を提案し、売上の向上を図ることができます
顧客離反の予測
ロジスティック回帰を用いて、顧客が離反する(サービスの利用を停止する)確率を予測することができます
離反の予測が高い顧客に対しては、特別なプロモーションやサポートを提供することで、顧客を維持する努力を行います
まとめ
本記事では、Pythonでロジスティック回帰分析を実装するために、ロジスティック回帰の概要やハイパーパラメータチューニング、マーケティングへの応用について解説しました
ロジスティック回帰は、データ分析を始める上で手軽に試すことができる手法であり、多くの分野で活用されています
今回の記事を参考に、Pythonでロジスティック回帰分析を実装してみてください