SVM を用いたアヤメの二値分類

Machine LearningMachine LearningBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

このチュートリアルでは、分類に異なる SVM カーネルを使用するプロセスを説明します。Iris データセットを使用します。このデータセットには、花の測定値が含まれています。このデータセットには 3 つのクラスがありますが、2 値分類には 2 つのクラスのみを使用します。

VM のヒント

VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替え、Jupyter Notebook を使用して練習します。

Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題が発生した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills ml/sklearn -.-> lab-49168{{"SVM を用いたアヤメの二値分類"}} end

データの読み込み

Iris データセットを読み込み、可視化の目的で最初の 2 つの特徴のみを選択して始めます。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets, svm

iris = datasets.load_iris()
X = iris.data
y = iris.target

X = X[y!= 0, :2]
y = y[y!= 0]

データの準備

次に、学習とテスト用にデータを準備します。データを 90% は学習用、10% はテスト用に分割します。

n_sample = len(X)

np.random.seed(0)
order = np.random.permutation(n_sample)
X = X[order]
y = y[order].astype(float)

X_train = X[: int(0.9 * n_sample)]
y_train = y[: int(0.9 * n_sample)]
X_test = X[int(0.9 * n_sample) :]
y_test = y[int(0.9 * n_sample) :]

異なるカーネルを使ってモデルを学習させる

ここでは、線形、RBF、多項式の 3 種類の異なるカーネルを使って SVM モデルを学習させます。各カーネルについて、学習データにモデルを適合させ、決定境界を描画し、テストデータでの精度を表示します。

## fit the model
for kernel in ("linear", "rbf", "poly"):
    clf = svm.SVC(kernel=kernel, gamma=10)
    clf.fit(X_train, y_train)

    plt.figure()
    plt.clf()
    plt.scatter(
        X[:, 0], X[:, 1], c=y, zorder=10, cmap=plt.cm.Paired, edgecolor="k", s=20
    )

    ## Circle out the test data
    plt.scatter(
        X_test[:, 0], X_test[:, 1], s=80, facecolors="none", zorder=10, edgecolor="k"
    )

    plt.axis("tight")
    x_min = X[:, 0].min()
    x_max = X[:, 0].max()
    y_min = X[:, 1].min()
    y_max = X[:, 1].max()

    XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
    Z = clf.decision_function(np.c_[XX.ravel(), YY.ravel()])

    ## Put the result into a color plot
    Z = Z.reshape(XX.shape)
    plt.pcolormesh(XX, YY, Z > 0, cmap=plt.cm.Paired)
    plt.contour(
        XX,
        YY,
        Z,
        colors=["k", "k", "k"],
        linestyles=["--", "-", "--"],
        levels=[-0.5, 0, 0.5],
    )

    plt.title(kernel)
    plt.show()

    print(f"Accuracy with {kernel} kernel: {clf.score(X_test, y_test)}")

結果の解釈

線形カーネルは線形の決定境界を生成するのに対し、RBF カーネルと多項式カーネルはより複雑な境界を生成することがわかります。テストデータでの精度は、RBF カーネルが最も高く、その次が多項式カーネル、そして線形カーネルです。

まとめ

このチュートリアルでは、分類に異なる SVM カーネルをどのように使用するかを学びました。3 種類の異なるカーネルを使って SVM モデルを学習させ、それぞれの決定境界を可視化しました。また、各カーネルについてテストデータでの精度を計算しました。Iris データセットに対しては、RBF カーネルが最良の結果をもたらすことがわかりました。