SVM のバイアス解消

Machine LearningMachine LearningBeginner
今すぐ練習

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

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

はじめに

この実験では、SVMのバイアス解消とその決定境界への影響について説明します。SVMにおいて、バイアス解消は、2つ以上のクラスの距離が等しい場合に、それらの間の衝突を解消するために使用されるメカニズムです。decision_function_shape='ovr'の場合、デフォルトでは有効になっておらず、コストがかかるためです。したがって、この実験では、多クラス分類問題とdecision_function_shape='ovr'に対するbreak_tiesパラメータの影響を示します。

VMのヒント

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

時々、Jupyter Notebookが読み込み完了するまで数秒待つ必要があります。Jupyter Notebookの制限により、操作の検証は自動化できません。

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49312{{"SVM のバイアス解消"}} sklearn/datasets -.-> lab-49312{{"SVM のバイアス解消"}} ml/sklearn -.-> lab-49312{{"SVM のバイアス解消"}} end

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

このステップでは、SVMと可視化に必要なライブラリをインポートします。

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

サンプルデータを作成する

このステップでは、scikit-learnのmake_blobs関数を使ってサンプルデータセットを作成します。このデータセットには3つのクラスと2つの特徴量が含まれています。

X, y = make_blobs(random_state=27)

バイアス解消を有効にした場合と無効にした場合のSVMモデルを作成する

このステップでは、2つのSVMモデルを作成します。1つはバイアス解消を無効にしたもので、もう1つはバイアス解消を有効にしたものです。これらのモデルを作成するために、scikit-learnのSVCクラスを使用します。2つのモデルに対して、それぞれbreak_tiesパラメータをFalseTrueに設定します。

for break_ties, title, ax in zip((False, True), titles, sub.flatten()):
    svm = SVC(
        kernel="linear", C=1, break_ties=break_ties, decision_function_shape="ovr"
    ).fit(X, y)

決定境界を作成する

このステップでは、2つのモデルの決定境界を作成します。サンプルデータポイントのクラスを予測するためにpredict関数を使用し、決定境界を描画します。

    xs = np.linspace(xlim[0], xlim[1], 1000)
    ys = np.linspace(ylim[0], ylim[1], 1000)
    xx, yy = np.meshgrid(xs, ys)

    pred = svm.predict(np.c_[xx.ravel(), yy.ravel()])

    colors = [plt.cm.Accent(i) for i in [0, 4, 7]]

    points = ax.scatter(X[:, 0], X[:, 1], c=y, cmap="Accent")
    classes = [(0, 1), (0, 2), (1, 2)]
    line = np.linspace(X[:, 1].min() - 5, X[:, 1].max() + 5)
    ax.imshow(
        -pred.reshape(xx.shape),
        cmap="Accent",
        alpha=0.2,
        extent=(xlim[0], xlim[1], ylim[1], ylim[0]),
    )

決定境界を描画する

このステップでは、前のステップで作成した決定境界を描画します。SVMモデルのcoef_intercept_属性を使って決定境界を描画します。

    for coef, intercept, col in zip(svm.coef_, svm.intercept_, classes):
        line2 = -(line * coef[1] + intercept) / coef[0]
        ax.plot(line2, line, "-", c=colors[col[0]])
        ax.plot(line2, line, "--", c=colors[col[1]])
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)
    ax.set_title(title)
    ax.set_aspect("equal")

グラフを表示する

このステップでは、両方のモデルの決定境界を含むグラフを表示します。

plt.show()

まとめ

この実験では、SVMのバイアス解消が決定境界に与える影響を示しました。バイアス解消を無効にしたSVMモデルと、バイアス解消を有効にしたSVMモデルの2つを作成しました。その後、両方のモデルの決定境界を描画しました。バイアス解消を有効にしたモデルの決定境界は、クラスが引き分けになっている領域で非凸になっていました。