Pythonで学ぶ!初心者でもわかるロジスティック回帰10ステップ

Pythonを使ってロジスティック回帰を学ぶ初心者の人々Python
この記事は約12分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

ロジスティック回帰は、分類問題を解くための基本的なアルゴリズムで、これを理解することは、機械学習の理解の第一歩とも言えます。

本稿では、Pythonを用いてロジスティック回帰を学ぶ10ステップを詳しく解説します。

●Pythonとは

Pythonは、高レベルで多目的に使えるプログラミング言語で、データ分析や機械学習に広く使われています。

その理由は、簡潔な文法と豊富なライブラリがあり、初心者でも手軽に学びやすいからです。

●ロジスティック回帰とは

ロジスティック回帰は、ある事象が発生する確率を予測するための統計的手法で、機械学習の一部として広く使用されています。

名前に「回帰」と付いていますが、主に分類問題を解くために使用されます。

●Pythonでの開発環境設定

Pythonでロジスティック回帰を実装するためには、まず開発環境を整える必要があります。

Pythonのインストールは公式ウェブサイトから可能で、また必要なライブラリはpipコマンドを用いて簡単にインストールすることができます。

Pythonのバージョンは3系を推奨します。

●Python基礎

○変数とデータ型

Pythonでは、データを格納するために変数を使います。

整数(int)、浮動小数点数(float)、文字列(str)、真偽値(bool)などの基本的なデータ型があります。

このコードでは数字を使って整数と浮動小数点数を定義し、文字列を作成し、真偽値を表示しています。

この例では整数の1、浮動小数点数の1.0、文字列の’Python’、真偽値のTrueを作成し、それぞれを表示しています。

int_var = 1
float_var = 1.0
str_var = 'Python'
bool_var = True

print(int_var, float_var, str_var, bool_var)

このコードを実行すると、1 1.0 Python Trueと表示されます。

○リストと辞書

リストと辞書は、複数のデータをまとめて管理するためのデータ型です。

リストは順序付けられたデータの集まりを表し、辞書はキーと値のペアを格納します。

このコードでは数字のリストを作成し、文字列をキーに持つ辞書を作成しています。

この例では1, 2, 3を要素に持つリストと、’one’をキーに1を値とする辞書を作成し、それぞれを表示しています。

list_var = [1, 2, 3]
dict_var = {'one': 1}

print(list_var, dict_var)

このコードを実行すると、[1, 2, 3] {'one': 1}と表示されます。

○制御構文

制御構文は、プログラムの流れを制御するための構文です。

if文、for文、while文などがあります。

このコードではif文を使って条件分岐をし、for文を使ってリストの要素を順に表示しています。

この例では変数が正の場合にメッセージを表示し、リストの要素を順に表示しています。

num = 1
if num > 0:
    print('Positive number')

numbers = [1, 2, 3]
for n in numbers:
    print(n)

このコードを実行すると、Positive number 1 2 3と表示されます。

●ロジスティック回帰のためのライブラリ

○NumPy

NumPyは、数値計算を効率的に行うためのライブラリで、多次元配列や行列計算などが可能です。

下記のコードでインストールできます。

!pip install numpy

○Pandas

Pandasは、データ分析を支援するライブラリで、表形式のデータを効率的に扱うことが可能です。

下記のコードでインストールできます。

!pip install pandas

○Matplotlib

Matplotlibは、データを可視化するためのライブラリで、折れ線グラフや棒グラフ、ヒストグラムなどを描くことができます。

下記のコードでインストールできます。

!pip install matplotlib

○Scikit-learn

Scikit-learnは、機械学習の各種アルゴリズムを提供するライブラリで、ロジスティック回帰もこれを用いて実装します。

下記のコードでインストールできます。

!pip install scikit-learn

以上でPythonとロジスティック回帰の基本、そして開発環境の設定について説明しました。

●ロジスティック回帰の基礎理論

ロジスティック回帰は、分類問題を解くための機械学習アルゴリズムの一つです。

特に、二項分類問題においては、出力として0または1の二つのクラスを予測します。

ロジスティック回帰の特徴は、線形回帰と同様に入力の特徴量の線形結合を用いる点ですが、その結果をシグモイド関数と呼ばれる関数に通すことで、出力を0から1の範囲に制約します。

シグモイド関数は次のような式で表されます。

import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

x = np.linspace(-10, 10, 100)
y = sigmoid(x)

plt.plot(x, y)
plt.title('シグモイド関数')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.show()

このコードでは、シグモイド関数を定義し、xが-10から10までの範囲でのシグモイド関数の振る舞いをプロットしています。

np.linspaceは等間隔に数値を生成する関数で、np.expはネイピア数(自然対数の底)の指数関数を計算する関数です。

実行結果としては、xが大きくなるとyが1に近づき、xが小さくなるとyが0に近づく、S字型の曲線が表示されます。

このように、シグモイド関数を通すことで、線形回帰の出力がどんな範囲の値を取る可能性があっても、ロジスティック回帰の出力は常に0と1の間の値になります。

そして、これをあるクラスに属する確率と解釈します。

●データセットの準備

ロジスティック回帰を学ぶためのデータセットとして、よく使われるのがアヤメのデータセットです。

これは、アヤメの種類(クラス)とその花弁やがく片の長さと幅(特徴量)の関係を示したデータセットで、Pythonの機械学習ライブラリであるscikit-learnから簡単に読み込むことができます。

アヤメのデータセットの読み込みと表示のコードを紹介します。

from sklearn.datasets import load_iris
import pandas as pd

iris = load_iris()
iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_df['class'] = iris.target

print(iris_df.head())

このコードでは、scikit-learnからアヤメのデータセットを読み込み、pandasのDataFrameに変換して表示しています。

DataFrameは表形式のデータを扱うためのクラスで、headメソッドはその先頭の部分を表示します。

実行結果としては、花弁やがく片の長さと幅、そしてクラスの情報が列として表示されます。

●ロジスティック回帰の実装

では、具体的にロジスティック回帰を実装していきましょう。

Pythonでは機械学習ライブラリの一つであるscikit-learnを使って、簡単にロジスティック回帰を行うことができます。

まずは、先程のアヤメのデータセットを訓練データとテストデータに分割します。

訓練データでモデルを学習させ、未知のデータであるテストデータでモデルの性能を評価します。

○データの前処理

データの前処理として、データセットを訓練データとテストデータに分割することを行います。

ここではscikit-learnのtrain_test_split関数を使用します。

この関数は引数としてデータセットを受け取り、訓練データとテストデータに分割して返します。

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

print(f'訓練データ: {X_train.shape}, {y_train.shape}')
print(f'テストデータ: {X_test.shape}, {y_test.shape}')

このコードでは、アヤメのデータセットを訓練データ(X_train, y_train)とテストデータ(X_test, y_test)に分割しています。

test_sizeパラメーターはテストデータの割合を指定します。

random_stateパラメーターはデータを分割する際のランダムシード(乱数の初期値)を指定します。

実行結果としては、訓練データとテストデータの形状が表示されます。

○モデルの訓練

次に、ロジスティック回帰のモデルを訓練データで学習させます。

from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
model.fit(X_train, y_train)

このコードでは、LogisticRegressionクラスのインスタンスを作成し、fitメソッドを使って訓練データでモデルを学習させています。

LogisticRegressionクラスはロジスティック回帰のモデルを表しています。

fitメソッドはモデルを学習させるメソッドで、引数に訓練データを指定します。

○予測と評価

モデルの学習が完了したら、テストデータを使って予測を行い、その性能を評価します。

from sklearn.metrics import accuracy_score

y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)

print(f'予測精度: {accuracy:.2f}')

このコードでは、predictメソッドを使ってテストデータの予測を行い、accuracy_score関数を使って予測精度を計算しています。

predictメソッドは引数にテストデータを指定し、その予測結果を返します。

accuracy_score関数は真のクラスと予測クラスを比較して予測精度を計算します。

実行結果としては、予測精度が表示されます。

●ロジスティック回帰の応用例

ロジスティック回帰は広範に応用可能なアルゴリズムで、特に二値分類問題の解決に効果的です。

具体的な応用例としては、医療の分野で疾患の有無を予測したり、金融の分野で顧客のクレジットリスクを評価したり、マーケティングで顧客が特定の商品を購入するかどうかを予測したりすることがあります。

ここでは、顧客の年収と年齢を基に、特定の商品を購入するかどうかを予測するシンプルな例を見てみましょう。

○サンプルコード

まずは、シンプルなデータセットを作成します。

このデータセットは、顧客の年収と年齢、そして商品を購入したかどうか(0=購入しない、1=購入する)を表しています。

import pandas as pd
from sklearn.linear_model import LogisticRegression

# データセットの作成
data = pd.DataFrame({
    '年収': [500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400],
    '年齢': [25, 26, 27, 28, 29, 30, 31, 32, 33, 34],
    '購入': [0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
})

# ロジスティック回帰の実行
model = LogisticRegression()
model.fit(data[['年収', '年齢']], data['購入'])

# 新しい顧客データ
new_customer = pd.DataFrame({
    '年収': [850],
    '年齢': [28]
})

# 予測
pred = model.predict(new_customer)
print('予測結果:', pred)

このコードでは、年収と年齢が与えられた顧客データを使ってロジスティック回帰のモデルを学習させています。

そして、新しい顧客データに対して、その顧客が商品を購入するかどうかを予測しています。

実行結果としては、新しい顧客が商品を購入すると予測される場合は1、購入しないと予測される場合は0が出力されます。

●注意点と対処法

ロジスティック回帰を使用する際の注意点としては、特徴量のスケーリングが挙げられます。

特徴量間でスケールが大きく異なると、モデルの学習が不安定になる可能性があります。

この問題は、StandardScalerなどのスケーリング手法を用いて、特徴量を正規化または標準化することで解決できます。

また、ロジスティック回帰は線形分類器であるため、非線形のデータに対しては適用が難しいことも覚えておきましょう。

この問題は、カーネル化したロジスティック回帰や、別の非線形分類器(例えば決定木やランダムフォレスト)を使用することで解決できます。

●カスタマイズの方法

ロジスティック回帰のモデルは、ハイパーパラメータを調整することで性能を改善することが可能です。

例えば、正則化の強度を調整するCパラメータ、正則化の種類を決定するpenaltyパラメータなどがあります。

これらのパラメータを適切に設定することで、モデルの予測性能を改善することができます。

ハイパーパラメータをカスタマイズしたロジスティック回帰のコードを紹介します。

○サンプルコード

from sklearn.linear_model import LogisticRegression

# ロジスティック回帰の実行(Cパラメータとpenaltyパラメータをカスタマイズ)
model = LogisticRegression(C=0.1, penalty='l1', solver='liblinear')
model.fit(data[['年収', '年齢']], data['購入'])

# 予測
pred = model.predict(new_customer)
print('予測結果:', pred)

このコードでは、Cパラメータを0.1に設定し、penaltyパラメータを’l1’(L1正則化)に設定しています。

これにより、特徴量の一部を0にすることでモデルの複雑さを抑制し、過学習を防ぐ効果が期待できます。

まとめ

以上、Pythonを用いたロジスティック回帰の基本的な使い方を紹介しました。

具体的な応用例としては、顧客の購入予測などに利用することができます。

また、注意点としては特徴量のスケーリングや、線形分類性質について理解しておくことが重要です。

最後に、ハイパーパラメータの調整によって、モデルの予測性能を改善することが可能です。

これらのステップを踏むことで、初心者でもロジスティック回帰を効果的に使用することができます。