Scikit-learnのLogisticRegressionで始める機械学習!分類モデル構築の全手順

Python

機械学習を始めてみたいけど、何から手をつければいいかわからない…」 そんなふうに感じている方も多いのではないでしょうか。機械学習には様々な手法がありますが、その中でも「分類」は非常に基本的かつ重要なタスクです。

この記事では、数ある分類アルゴリズムの中からロジスティック回帰(LogisticRegression)を取り上げ、PythonライブラリのScikit-learnを使って分類モデルを構築する全手順を、ステップ・バイ・ステップ形式で丁寧に解説します。

この記事を最後まで読めば、機械学習モデル開発の基本的な流れを理解し、あなた自身の手で最初の分類モデルを完成させることができます。

はじめに:なぜ最初の分類モデルにLogisticRegressionがおすすめなのか?

まずは、なぜロジスティック回帰が機械学習の第一歩として最適なのか、その理由を簡単に解説します。

機械学習における「分類問題」とは

分類問題とは、データをいくつかのカテゴリ(クラス)に分ける問題のことです。身の回りには分類問題がたくさんあります。

  • メールが「迷惑メール」か「通常メール」か
  • 画像に写っている動物が「犬」か「猫」か
  • 顧客が商品を「購入する」か「購入しない」か

ロジスティック回帰は、こうした問題を見事に解決してくれるアルゴリズムの一つです。

シンプルで解釈しやすく、応用範囲が広い

ロジスティック回帰が初学者におすすめな理由は以下の通りです。

  • アルゴリズムが比較的シンプル: 内部の計算が分かりやすく、結果の解釈がしやすいです。
  • 高速に動作する: 大規模なデータセットに対しても、比較的短い時間で学習が完了します。
  • ベースラインとして優秀: まずはロジスティック回帰で性能を試し、そこからより複雑なモデルと比較検討する、という開発の進め方が一般的です。

それでは、実際にモデルを構築する手順を見ていきましょう。

Step 1:環境準備とデータの読み込み

まずは、モデル構築に必要な道具(ライブラリ)と材料(データ)を揃えます。

必要なライブラリをインポートする

Pythonで機械学習を行うには、いくつかのライブラリが必要です。今回はscikit-learnを中心に使います。

# scikit-learnから必要な機能をインポート
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix

# 数値計算やデータ操作のためのライブラリ
import numpy as np
import pandas as pd

今回使用する「Irisデータセット」を準備する

今回は、機械学習の練習用として非常に有名な「Iris(アヤメ)データセット」を使います。このデータには、3種類のアヤメの花びらとがく片のサイズが記録されており、この情報から品種を予測します。

# Irisデータセットをロード
iris = load_iris()
X = iris.data # 特徴量 (花びらやがく片のサイズ)
y = iris.target # 目的変数 (アヤメの品種)

# データの概要を確認
print(f'特徴量の形式: {X.shape}') # (サンプル数, 特徴量の数)
print(f'目的変数の形式: {y.shape}')
print(f'品種の名前: {iris.target_names}') # ['setosa' 'versicolor' 'virginica']

Step 2:モデルを学習させるためのデータ前処理

手に入れたデータを、そのまま全てモデルの学習に使うのは良い方法ではありません。モデルの真の実力を測るために、データを「学習用」と「テスト用」に分割します。

訓練データとテストデータに分割する重要性

モデルの性能を正しく評価するためには、モデルが一度も見たことのないデータでテストする必要があります。

学習に使ったデータでテストしてしまうと、モデルが答えを「暗記」しているだけかもしれないからです。これを**過学習(オーバーフィッティング)**と呼びます。

train_test_splitでデータを分割する

Scikit-learnのtrain_test_split関数を使えば、簡単にデータを分割できます。

# データを訓練用(70%)とテスト用(30%)に分割
# random_stateを指定すると、毎回同じように分割されるため結果を再現できます
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 分割後のデータサイズを確認
print(f'訓練データ (特徴量): {X_train.shape}')
print(f'テストデータ (特徴量): {X_test.shape}')

これでモデルを学習させる準備が整いました。

Step 3:LogisticRegressionモデルの学習と予測

いよいよモデルの構築です。Scikit-learnでは、たった数行のコードでモデルの学習と予測が完了します。

モデルをインスタンス化する

まず、LogisticRegressionクラスの設計図から、モデルのインスタンス(実体)を作成します。

# LogisticRegressionモデルのインスタンスを作成
# max_iterは学習の繰り返し回数の上限。収束しないという警告が出る場合に増やします。
model = LogisticRegression(max_iter=1000)

.fit()メソッドでモデルを学習させる

次に、訓練データ(X_train, y_train)を使ってモデルを学習させます。この操作を.fit()(フィットさせる)と呼びます。

# 訓練データを使ってモデルを学習
model.fit(X_train, y_train)

print("モデルの学習が完了しました。")

これだけで、モデルは花びらのサイズなどから品種を予測するためのパターンを学習しました。

.predict()で未知のデータを予測する

学習済みモデルを使って、取っておいたテストデータ(X_test)の品種を予測してみましょう。

# テストデータを使って予測を実行
y_pred = model.predict(X_test)

# 予測結果の一部を表示
print(f'予測された品種: {y_pred[:10]}')
print(f'実際の品種:   {y_test[:10]}')

予測結果と実際の答えがほとんど一致していることが確認できます。

Step 4:モデルの性能評価

モデルがどれくらい良い性能を持っているのかを、客観的な指標で評価します。

予測結果がどれくらい正しいか? – 正解率の計算

最も直感的な指標が**正解率(Accuracy)**です。全ての予測のうち、正解した割合を示します。

# 正解率を計算
accuracy = accuracy_score(y_test, y_pred)
print(f'正解率: {accuracy:.4f}') # 小数点以下4桁まで表示

この場合、100%の正解率となり、非常にうまく分類できていることがわかります。

予測の詳細を確認する – 混同行列の活用

正解率だけでは、どの品種を間違えやすいのかといった詳細までは分かりません。そこで**混同行列(Confusion Matrix)**を使います。

# 混同行列を計算
cm = confusion_matrix(y_test, y_pred)
print("混同行列:")
print(cm)

この行列は、対角線上が正解数、それ以外が不正解数を示します。今回は対角線以外がすべて0なので、間違いがなかったことが分かります。

各クラスへの所属確率を確認する .predict_proba()

.predict()が単一のクラスを返すのに対し、.predict_proba()は各クラスに所属する確率を返します。これにより、モデルがどれくらい予測に自信を持っているかを知ることができます。

# 各クラスに所属する確率を予測
probabilities = model.predict_proba(X_test)

# 最初の5サンプルの確率を表示
np.set_printoptions(precision=3, suppress=True)
print(probabilities[:5])

Step 5:さらなる精度向上のために(ハイパーパラメータ調整)

今回は非常に良い結果が出ましたが、より複雑な問題ではモデルの調整(チューニング)が必要になります。ここでは、調整すべき主要なパラメータを2つ紹介します。

過学習を防ぐ「正則化」とは (penalty, C)

正則化とは、モデルが訓練データに適合しすぎる「過学習」を防ぐためのテクニックです。

  • penalty: 正則化の種類 ('l1', 'l2') を選びます。通常は'l2'で問題ありません。
  • C: 正則化の強さを調整します。値が小さいほど正則化が強くなります(モデルがシンプルになる)。

最適化アルゴリズムの選択 (solver)

solverは、学習時の計算方法を指定します。データセットの特性によって最適なものが異なりますが、基本的にはデフォルトで問題ありません。

まとめ:分類モデル構築の流れをマスターしよう

今回は、Scikit-learnのLogisticRegressionを使い、機械学習の分類モデルを構築する全手順を解説しました。

  1. Step 1: 環境準備とデータ読み込み
  2. Step 2: データの前処理(訓練用とテスト用に分割)
  3. Step 3: モデルの学習(.fit)と予測(.predict)
  4. Step 4: モデルの性能評価(正解率や混同行列)
  5. Step 5: さらなる精度向上のための調整

この一連の流れは、ロジスティック回帰だけでなく、他の多くの機械学習アルゴリズムにも共通する基本的なプロセスです。ぜひこの流れをマスターして、様々なデータで分類モデルの構築にチャレンジしてみてください!

コメント

タイトルとURLをコピーしました