scikit-learn

【scikit-learn】LogisticRegressionでロジスティック回帰をする方法

【scikit-learn】LogisticRegressionでロジスティック回帰をする方法

Pythonの機械学習ライブラリであるscikit-learnのLogisticRegressionを使ってロジスティック回帰によるデータ分類を行う方法を解説します。

ロジスティック回帰

ロジスティック回帰とは、線形分離可能なデータに対して境界線を学習により見つけてデータ分類を行う手法の事です。名前に「回帰」とついているわけですが、実際には「分類」のための手法ですので間違えないように注意しましょう。

特徴としては、境界線が直線になることが挙げられます。そのため、2つのクラスに分類する二項分類等によく用いられます。例えば、品質データとして取得された特徴群から製品の「合格品」「不良品」を分類するというようなときです。

ロジスティック回帰は、Pythonの機械学習ライブラリであるscikit-learnにて、LogisticRegressionで実装がされています。本記事では、scikit-learnのLogisticRegressionでデータを分類する方法を紹介します。

scikit-learnのLogisticRegressionでロジスティック回帰をする方法

以降では、scikit-learnを使用します。インストールされていない場合はpipでインストールしておいてください。

pip install scikit-learn

ロジスティック回帰の使い方(sklearn.linear_model.LogisticRegression)

実装例

scikit-learnのmake_blobsで分類用のデータを用意し、LogisticRegressionを使ってロジスティック回帰による分類をする方法について紹介します。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.linear_model import LogisticRegression


def main():
    """メイン関数"""
    np.random.seed(0)

    # ===== データの生成
    data, label = make_blobs(n_samples=1000, centers=2, cluster_std=0.5)
    plt.scatter(data[label == 0, 0], data[label == 0, 1], marker="o")
    plt.scatter(data[label == 1, 0], data[label == 1, 1], marker="^")

    # ===== ロジスティック回帰を用いた学習
    model = LogisticRegression()
    model.fit(data, label)

    # ===== 分類結果の可視化
    xmin, xmax = data[:, 0].min() - 1, data[:, 0].max() + 1
    ymin, ymax = data[:, 1].min() - 1, data[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(xmin, xmax, 0.01), np.arange(ymin, ymax, 0.01))
    zz = model.predict(np.array([xx.ravel(), yy.ravel()]).T).reshape(xx.shape)
    plt.contourf(xx, yy, zz, alpha=0.5)
    plt.title("Logistic Regression")
    plt.grid(True)
    plt.show()


if __name__ == "__main__":
    main()
scikit-learn LogisticRegression ロジスティック回帰

実装内容の解説

上記で紹介した実装例の各部分ごとに内容を紹介していきます。

必要モジュールのインポート

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.linear_model import LogisticRegression

まずは、必要なモジュール類をインポートします。今回はscikit-learnのLogisticRegressionを使用するので、sklearn.linear_modelからインポートします。また、データ生成用にmake_blobsをインポートし、numpyとmatplotlibはデータ操作や可視化用でインポートします。

データセットの準備

    np.random.seed(0)

    # ===== データの生成
    data, label = make_blobs(n_samples=1000, centers=2, cluster_std=0.5)
    plt.scatter(data[label == 0, 0], data[label == 0, 1], marker="o")
    plt.scatter(data[label == 1, 0], data[label == 1, 1], marker="^")

データはmake_blobsを使って生成します。指定しているパラメータとしては以下のような項目です。今回は2クラスのデータを作成して分類器を学習させます。

  • n_samples:データ点数
  • centers:データのクラス数
  • cluster_std:各クラスのデータの標準偏差

乱数シードはnp.random.seedで設定していますが、make_blobsのrandom_state引数で指定することも可能です。

Note

make_blobsの公式ドキュメントはこちらを参照してください。

モデルの学習

    # ===== ロジスティック回帰を用いた学習
    model = LogisticRegression()
    model.fit(data, label)

ロジスティック回帰のモデルを作成しているのが上記の部分です。使い方は簡単で、生成したデータと正解ラベルを渡すだけでデータに対してロジスティック回帰のモデルを作成できます。

結果の可視化

    # ===== 分類結果の可視化
    xmin, xmax = data[:, 0].min() - 1, data[:, 0].max() + 1
    ymin, ymax = data[:, 1].min() - 1, data[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(xmin, xmax, 0.01), np.arange(ymin, ymax, 0.01))
    zz = model.predict(np.array([xx.ravel(), yy.ravel()]).T).reshape(xx.shape)
    plt.contourf(xx, yy, zz, alpha=0.5)
    plt.title("Logistic Regression")
    plt.grid(True)
    plt.show()

学習で使ったデータではないデータを作成し、predictメソッドにより各点の分類結果を確認しています。具体的には、学習に使ったデータ範囲の±1のデータ範囲でメッシュグリッドを作成して、各点における分類結果を計算します。その結果をcontourfで可視化することで、どのデータ範囲がどちらに分類されるかを確認しています。

scikit-learn LogisticRegression ロジスティック回帰

結果を再掲しますが、各色で表現された範囲が各クラスに分類されることになります。冒頭でロジスティック回帰の特徴として説明した通り、境界面としては直線となっていることがよく分かるかと思います。

以上が、scikit-learnのLogisticRegressionを使ったロジスティック回帰の分類方法の紹介でした。

まとめ

Pythonの機械学習ライブラリであるscikit-learnのLogisticRegressionを使ってロジスティック回帰によるデータ分類を行う方法を解説しました。

ロジスティック回帰は、比較的シンプルでありながら色々な場面で活用を検討ができます。scikit-learnを用いると上記のように非常に簡単に実装して確認ができますので、是非使ってみてください。

Note

sklearn.linear_model.LogisticRegressionの公式ドキュメントはこちらを参照してください。