SVM を使ったアイリスの分類

PythonBeginner
オンラインで実践に進む

はじめに

このプロジェクトでは、サポートベクトル分類器 (SVC) モデルを使用してアイリスデータセットを分類する方法を学びます。アイリスデータセットは、アイリスの異なる種に関する情報、つまり花弁の長さ、花弁の幅、花びらの長さ、花びらの幅を含む、古典的な機械学習データセットです。

🎯 タスク

このプロジェクトでは、以下を学びます。

  • 必要なライブラリをインポートしてアイリスデータセットを読み込む方法
  • データセットを訓練用とテスト用に分割する方法
  • サポートベクトル分類器モデルを作成して訓練する方法
  • 訓練済みモデルを使用して予測を行う方法
  • 正解率と分類レポートを使用してモデルの性能を評価する方法

🏆 成果

このプロジェクトを完了すると、以下のことができるようになります。

  • scikit-learn ライブラリを使用してアイリスデータセットを扱う
  • データセットを訓練用とテスト用に分割する
  • サポートベクトル分類器モデルを作成して訓練する
  • 訓練済みモデルを使用して予測を行う
  • 正解率と分類レポートを使用してモデルの性能を評価する

必要なライブラリをインポートしてデータセットを読み込む

このステップでは、必要なライブラリをインポートしてアイリスデータセットを読み込む方法を学びます。以下の手順に従ってこのステップを完了します。

iris_classification_svm.py で、データセットを読み込み、データを分割し、SVM モデルを作成し、その性能を評価するための必要なライブラリをインポートします。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report

sklearn.datasets からアイリスデータを読み込み、データセットを訓練用とテスト用に分割します。データセットは、訓練とテストに 80-20 の比率で分割され、再現性のために乱数シードは 42 となっています。

## 同じファイルで続けます
def load_and_split_data() -> tuple:
    """
    Returns:
        tuple: [X_train, X_test, y_train, y_test]
    """
    iris = load_iris()
    X, y = iris.data, iris.target
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=42
    )
    return X_train, X_test, y_train, y_test

このコードは、機械学習の目的でアイリスデータセットを読み込み、訓練用とテスト用に分割します。各部分の解説は以下の通りです。

  1. 必要なライブラリのインポート
    • sklearn.datasets は、アイリスデータセットを含むデータセットを読み込むために使用されます。
    • sklearn.model_selection は、データセットを訓練用とテスト用に分割するためのユーティリティを提供します。
    • sklearn.svm は、機械学習アルゴリズムの一種であるサポートベクトルマシン (SVM) のクラスを含んでいます。
    • sklearn.metrics は、正解率や分類レポートなど、モデルの性能を評価するためのツールを含んでいます。
  2. 関数定義load_and_split_data という関数が定義されています。この関数は以下のタスクを行います。
    • アイリスデータセットを読み込むload_iris() は、sklearn.datasets によって提供される関数で、アイリスの花のデータセットを読み込みます。これは分類タスクに人気のあるデータセットで、3 つの異なる種からの 150 個のアイリスの花の測定値を含んでいます。
    • データの分離:データセットは特徴量 (X) とターゲットラベル (y) に分離されます。この場合、X はアイリスの花の 4 次元の測定値で、y は対応する種のラベル (0、1、または 2) になります。
    • データの分割sklearn.model_selectiontrain_test_split を使用して、データを訓練用とテスト用のサブセットに分割します。test_size=0.2 パラメータは、データの 20% がテストに使用され、残りの 80% が訓練に使用されることを意味します。random_state=42 は分割の再現性を保証します。同じシード (ここでは 42) を使用すると、コードを実行するたびに同じ分割結果が得られます。
    • 返り値:関数は、X_trainX_testy_train、および y_test を含むタプルを返します。これらは訓練用とテスト用のデータの特徴量とターゲットセットです。
✨ 解答を確認して練習

SVM モデルを作成して訓練する

このステップでは、サポートベクトル分類器モデルを作成し、訓練データで訓練する方法を学びます。

## 同じファイルで続けます
def create_and_train_SVM(X_train: list, y_train: list) -> SVC:
    """
    Args:
        X_train: [訓練用の特徴量]
        y_train: [訓練用のラベル]

    Returns:
        SVC: [訓練済みのサポートベクトル分類器モデル]
    """
    svm = SVC()
    svm.fit(X_train, y_train)
    return svm

この関数 create_and_train_SVM は、sklearn.svm.SVC クラスを使用してサポートベクトル分類器 (SVM) モデルをインスタンス化し、その後、提供された訓練データで訓練するように設計されています。詳細な説明は以下の通りです。

  • 関数シグネチャ:この関数は 2 つの引数を取ります。
    • X_train:訓練用データセットの特徴量(入力変数)を含むリストまたは配列のようなオブジェクト。
    • y_train:訓練用データセットの対応するラベル(出力変数)を含むリストまたは配列のようなオブジェクト。
  • SVM モデルのインスタンス化:関数内で、SVC() がパラメータなしで呼び出されます。これにより、デフォルトのサポートベクトル分類器モデルが作成されます。scikit-learn の SVC クラスは、カーネルタイプ、正則化など、モデルをカスタマイズするためのさまざまなパラメータを提供しますが、この基本的な例ではデフォルト値が使用されます。
  • モデルの訓練svm オブジェクトの fit メソッドが X_trainy_train で呼び出されます。ここで実際の訓練が行われます。モデルは、それぞれのクラスラベル (y_train) に関連付けられた特徴量 (X_train) からパターンを学習します。
  • 訓練済みモデルの返却:訓練後、関数は訓練済みの SVC モデルを返します。このモデルは、新しい未見のデータに対する予測を行ったり、テスト用データセットを使用してその性能を評価するために使用できます。
✨ 解答を確認して練習

予測を行う

このステップでは、訓練済みの SVM モデルを使用して予測を行う方法を学びます。

## 同じファイルで続けます
def make_predictions(model: SVC, X_test: list) -> list:
    """
    Args:
        model: [訓練済みのサポートベクトル分類器モデル]
        X_test: [テスト用の特徴量]

    Returns:
        list: [予測結果]
    """
    predictions = model.predict(X_test)
    return predictions

関数 make_predictions は、訓練済みの SVM モデルと一連のテスト用特徴量を入力として受け取り、テストデータの予測されたラベルのリストを返します。以下に詳細を示します。

  • 関数の引数
    • model:データセットで既に訓練された SVC クラス(サポートベクトル分類器)のインスタンスです。訓練段階で学習したパターンに基づいて新しいインスタンスを分類する方法をモデルが知っていると仮定されます。
    • X_test:テスト用データセットの特徴量(入力変数)を含むリストまたは配列のようなオブジェクトです。これらは、モデルがラベルを予測する未見の例です。
  • 予測の実行:関数内で、modelpredict メソッドが X_test を引数として呼び出されます。predict メソッドは、学習済みのモデルをテストセットの各インスタンスに適用して、それらのクラスラベルを推定します。それは真のラベル (y_test) を必要とせず、入力特徴量のみを必要とします。
  • 予測結果の返却:その後、関数はこれらの推定されたラベルをリストとして返します。返されたリストの各要素は、X_test データセットのそれぞれのインスタンスの予測されたクラスラベルに対応します。
✨ 解答を確認して練習

モデルを評価する

正解率を計算し、分類レポートを表示することでモデルを評価します。

## 同じファイルで続けます
if __name__ == "__main__":
    ## データを読み込み、分割する
    X_train, X_test, y_train, y_test = load_and_split_data()

    ## SVM モデルを作成し、訓練する
    svm_model = create_and_train_SVM(X_train, y_train)

    ## 予測を行う
    predictions = make_predictions(svm_model, X_test)

    ## モデルを評価する
    accuracy = accuracy_score(y_test, predictions)
    print(f"正解率:{accuracy:.2f}")

    ## 分類レポートを表示する
    print("分類レポート:")
    print(classification_report(y_test, predictions))

次に、ターミナルからスクリプトを実行します。

python iris_classification_svm.py

出力は以下のようになるはずです。

正解率: 1.00
分類レポート:
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        10
           1       1.00      1.00      1.00         9
           2       1.00      1.00      1.00        11

    accuracy                           1.00        30
   macro avg       1.00      1.00      1.00        30
weighted avg       1.00      1.00      1.00        30

これらの手順に従うことで、サポートベクトル分類器 (SVC) モデルを使用したアイリスデータセットの分類プロジェクトが完了しました。

✨ 解答を確認して練習

まとめ

おめでとうございます!このプロジェクトを完了しました。あなたは実験技術を向上させるために、LabEx でさらに多くの実験を行って練習することができます。