• 日本語
    • English (英語)
Avintonジャパン株式会社Avintonジャパン株式会社Avintonジャパン株式会社Avintonジャパン株式会社
  • サービス
    • Avinton Data Platform
    • エッジAIカメラ
    • プライベートクラウド
    • AIサービス開発
    • AI画像解析 – 無償PoC
  • 最新情報
    • ニュースリリース&イベント情報
    • 技術ブログ&インタビュー
  • アカデミー
    • Avintonアカデミー
    • Academy on Campus
  • 採用情報
    • Avintonで働く魅力
    • 新卒採用
    • プロジェクトコーディネーター職紹介
    • 求人
    • よくある質問
  • 企業情報
    • 会社概要
    • 代表からご挨拶
    • SDGsへの貢献
  • お問い合わせ

機械学習入門者向け Support Vector Machine (SVM) に触れてみる

  • Python3.8 と OpenCV のインストール (Ubuntu20.04LTS)
  • ルーティング
  • postgreSQLへのshp fileのimport
  • NAT
  • PostGIS exercise
  • 三目並べ – 2.〇×を交互にゲーム盤に入るようにしよう
  • Docker 概要とセットアップ
  • 三目並べ – 3.勝敗がつくようにしよう
  • Docker Engineのubuntu上へのinstall
  • EC2からS3へ自動でぽいぽいアップロードするスクリプトの作成
  • 三目並べ – 4.「スタート」「リセット」ボタンをつけよう
  • 三目並べ – 5.先攻後攻を決めて、コンピュータ対戦にしよう(前編)
  • Apache Zeppelin 基本機能
  • Ruby on Rails を MySQLでセットアップ
  • 機械学習入門者向け Support Vector Machine (SVM) に触れてみる
  • AWSアカウントの作成と必ずやるべきセキュリティ対策
  • Scala 基礎
  • VLAN
  • Apache Spark 基礎
  • 機械学習を用いた画像分類
  • Ruby on Railsによる簡単なウェブアプリケーション
  • 正規表現とパイプ
  • 機械学習エンジニアに必要なスキル
  • Docker, Kubernetesの学び方について
  • Ubuntuの基本設定
  • PostgreSQL Setup
  • REDIS
  • Amazon EC2 インスタンスの初期設定をしよう
  • 軽量版Kubernetesディストリビューション – k0s クラスターの構築
  • Pythonの設定
  • GNS3のセットアップ
  • viエディタ
  • AWSのEC2インスタンスでWordPressブログを公開してみよう
  • Pythonでデータベースを操作する
  • Python2.7とOpenCVのインストール
  • ファイル操作コマンド
  • OpenCVのテストプログラム
  • グループとユーザー
  • Pythonで画像を分類するプログラムを作成する
  • AWS CLIをインストールしてコマンド操作しよう
  • Virtualisation and Container (仮想化とコンテナ) – Ansible, Docker and Kubernetes
  • Windows Server 2012 R2 Hyper-V
  • 困った時に使うコマンド
  • SparkMLによるKaggle Titanic生存者予測
  • PacketTracerのセットアップ
  • 一般グループのユーザーとグループ
  • AWS Route 53を使って独自ドメインのWebページを表示させてみよう
  • Kubernetesクラスター上へのOpenVINOモデルサーバーを使用したサンプルアプリケーションのデプロイ
  • プライバシーポリシー
  • VMware ESXi サーバー構築
  • 三目並べ – 6.先攻後攻を決めて、コンピュータ対戦にしよう(後編)
  • フロントエンド開発のための環境構築
  • フロントエンドのデモンストレーション
  • APIのデモンストレーション
  • CISCO 1800ルータセットアップ
  • ファイル検索コマンド
  • ESXi – Switchの追加とVLAN
  • 質問
  • 仮想化環境のディスク容量を拡張する
  • ユーザー権限とアクセス権
  • 三目並べ – 0.導入
  • テキスト処理
  • ESXi – VyOS
  • データベースへのデータロード
  • 機械学習入門者向け Naive Bayes(単純ベイズ)アルゴリズムに触れてみる
  • CCNA
  • ESXi – 小規模ネットワーク 構築
  • ファイル管理
  • 機械学習入門者向け ChainerRLでブロック崩しの学習
  • AWS CLIを使ってEC2のファイルをS3へアップロードしよう
  • Apache NiFiの環境設定
  • CSV import & export – Node.js, mySQL – 1
  • 機械学習入門者向け ランダムフォレストによる Kaggle Titanic生存者予測
  • NodeJSでWebアプリケーション開発 – Socket.IO編
  • CSV import & export – Node.js, mySQL – 2
  • Apache NiFi データパイプライン基礎
  • PCからルータ、スイッチへのSSH接続設定
  • 【Python入門】Python Numpy チュートリアル
  • SQL 便利な関数
  • PostgreSQLによるデータ分析
  • Apache NiFi Exercise
  • 機械学習入門者向け 分類と回帰の違いをプログラムを書いて学ぼう
  • NodeJSでWebアプリケーション開発 – React編
  • Pythonによるマルチスレッドプログラミング実践
  • Apache SparkとApache Zeppelinの概要と環境構築
  • Certbotを使ってSSL証明書を発行し、HTTP通信を暗号化しよう
  • DockerとApacheを使ってWebサーバーを構築しよう
  • NodeJSでWebアプリケーション開発 – React編
  • AmazonEC2とVPCでネットワークとサーバーを構築しよう
  • AWS入門者向け 初心者が最初に理解すべきEC2とVPCの基本的な用語解説
  • Linuxとは
  • Pandasによる構造化データ分析
  • ダイナミックルーティング
  • PostgreSQL – Python – Apache – Bootstrap
  • 三目並べ – 1.ゲーム盤を作ろう
Home Avintonアカデミー 機械学習入門者向け Support Vector Machine (SVM) に触れてみる

SVM

 

SVMは教師ありの機械学習アルゴリズムです。基本的には分類と回帰のどちらのタスクにも利用可能ですが、実際のところは分類タスクにより多く利用されています。
高速で信頼性のある分類アルゴリズムで、少ないデータ量でもよい性能が期待できます。Example code付きですので、ぜひ自分でも実際にアルゴリズムを動かしてみて、理解を深めてみてください。

SVMとは

簡単のため、特徴量が2つしかない2次元データのデータセットを考えます。するとSVMでは、対象のデータセットをクラスの応じて最も適切に分割する直線を見つける、というのが基本となる考え方になります(下図は2クラス分類の場合)。

SVM What is SVM

Support vector
アルゴリズムの名前にも出てくるSupport Vectorとは、そのデータセットを分割する直線に最も近いデータ点のことを指します。SVMでは、このSupport Vectorがそのデータセットを分割する直線を決める際に大きな役割を果たします。詳しくは次のセクションで説明します。

この分割直線が決まれば、後は判別したいデータがこの直線のどちら側の領域にあるかでクラスの判別を行います。上のグラフで言えば、直線の左にデータがあればそれは黄緑のクラス、右にあれば青のクラス、ということになります。

SVMの仕組み

単純な例を用いて説明します。x, y2つの特徴量をもとに、データが青と黄緑のどちらのクラスかを分類する分類器をつくりたいとします。まずはx-y平面上に、すでにクラス分けされたトレーニングデータを考えます。

SVM How it works 1

先ほども述べたように、SVMでは、このトレーニングデータを、各データのクラスも考慮して1番適切に分離するような直線を見つけ出します。そしてこの直線を境に、一方のサイドに位置するデータを全て青、もう一方のサイドに位置するデータを全て黄緑と分類します。このことから、この直線のことを決定境界と呼ぶこともあります。

SVM How it works 3

ではその”最も適切に分離する直線”は具体的にどのように決められるのでしょうか。SVMでは、それぞれのクラスで、その直線に最も近いデータ点(Support Vector)を考え、そのデータ点と直線との距離(マージン)が、できるだけ大きくなるように直線を決定します。

SVM How it works 4

以上がSVMでの決定境界の決め方になります。

応用例

SVMはそのアルゴリズムの仕組みからも、主に分類タスクに用いられます。

テキスト分類

SVM text classification

 

文章をあらかじめ用意したカテゴリに分類することができます。
具体的には、スパムメールの検出に用いられています。

なお、文章を機械学習アルゴリズムで扱うときは、基本は文章を単語ごとなどに分割し、それぞれに数字を割り当て数データに変換してから扱います。

 

数字認識

SVM digit recognition

 

手書きの数字の画像のピクセル値をデータに、それを0~9などの数字カテゴリに分類することもできます。

郵便番号の認識などが具体的な利用例です。

 

顔検出

SVM face recognition

 

数字認識と同様、画像のピクセルの値から、その画像に顔が含まれているか否か、含まれていれば事前に設定したカテゴリの中で誰であるかを分類(カテゴリ分け)します。

画像引用元: Scikit-learn Faces recognition example using eigenfaces and SVMs

 

Example code

ここでは、実際にScikit learnで実装したコード例を載せておきます。内容は、自分で用意したトレーニングデータを元に、SVMに適切な決定境界を学習させるというものです。

実際の実行は他の機械学習Academy同様、こちらのJupyter Notebookをダウンロードしてその中で行ってください。

*Jupyter Notebook使用には、Anacondaがダウンロード済みである必要があります。
Anacondaダウンロード方法は機械学習を用いた画像分類体験をご覧ください。

1. ライブラリのインポートとデータセットの用意

まず、必要なライブラリをインポートします。

1
2
3
4
5
6
7
8
%matplotlib inline
 
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
 
# use seaborn plotting defaults
import seaborn as sns; sns.set()

次に、2クラスにクラス分けされたトレーニングデータセットを用意します。

1
2
3
4
from sklearn.datasets.samples_generator import make_blobs
X, y = make_blobs(n_samples=50, centers=2,
random_state=3, cluster_std=0.60)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='brg');

2. クラスによるデータの決定境界

この2つのクラスをうまく分割する直線(決定境界)を引くことを考えます。

1
2
3
4
5
6
7
8
9
10
xfit = np.linspace(-6.5, 2.5)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='brg')
plt.plot([-0.5], [0.8], 'x', color='red', markeredgewidth=2, markersize=10)
 
# draw several dividing lines that perfectly separate the two classes
for m, b in [(0.1, 2.3), (-0.6, 1), (-2, -1.4)]:
plt.plot(xfit, m * xfit + b, '-k')
 
plt.xlim(-6.5, 2.5)
plt.ylim(-2, 6);

するとこのように、クラス分けをする直線には通常、多数候補が考えられます。 そしてその中でどの直線を選ぶかによって、新しいデータ点をどのクラスと判定するかが変わってきてしまいます。

グラフ上で、赤のバツ印が新しいデータ点だとします。新しいデータのクラスは、そのデータが決定境界より上にあればクラス青、下にあればクラス黄緑と判別されます。つまりどの直線をクラス判別に採用するかによって、このデータのクラスは青と判別されたり黄緑と判別されたりと結果が変わってきてしまうのです。

3. マージンの導入

そこでどの直線をクラス判別に採用するかを決める基準となるのが、マージンと呼ばれる量です。以下で、先ほどの直線のマージンを書き加えたグラフを表示させてみます。

1
2
3
4
5
6
7
8
9
10
11
xfit = np.linspace(-6.5, 2.5)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='winter')
 
for m, b, d in [(0.1, 2.3, 0.2), (-0.6, 1, 1.8), (-2, -1.4, 4.5)]:
yfit = m * xfit + b
plt.plot(xfit, yfit, '-k')
plt.fill_between(xfit, yfit - d, yfit + d, edgecolor='none',
color='#AAAAAA', alpha=0.4)
 
plt.xlim(-6.5, 2.5)
plt.ylim(-2, 6)

各直線のまわりのグレーの幅がマージンです。 マージンとはこのように、その決定境界から各クラスの最も近いデータ点への距離となります。 SVMではこのマージンを最大化するような直線が、新しいデータのクラスの判別に最もよいものとして採用されます。これがSVMのアルゴリズムの中身になります。

実際このグラフ上でも、マージンの一番大きい直線が、どのような位置に新しいデータ点が来たとしても、クラスの判別には一番バランスがとれているであろうことが見てとれます。

4. SVMのフィッティングと学習した決定境界の表示

では実際に、このデータセットに対してSVMをフィッティングさせてみます。 その際指定するCパラメータは、採用する決定境界にどれぐらいの誤分類を許すかを表します。 Cパラメータの値は大きければ大きいほど、トレーニングデータの分類に忠実な、”厳しい”決定境界となります。

今回の例のように直線で分割する場合はイメージしづらいですが、曲線などで分割しようとする際は、Cパラメータの値を小さくして、トレーニングデータでの分類に多少の誤りを許した方がよい場合もあります。分割曲線があまり複雑になり過ぎず、新規のデータに対する最終的な判別性能が向上する場合もあるのです。

1
2
3
from sklearn.svm import SVC # "Support vector classifier"
model = SVC(kernel='linear', C=1E10)
model.fit(X, y)

可視化のために、フィッティングをかけたSVMの決定境界を表示する関数を用意します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def plot_svc_decision_function(model, ax=None, plot_support=True):
"""Plot the decision function for a 2D SVC"""
if ax is None:
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
 
# create grid to evaluate model
x = np.linspace(xlim[0], xlim[1], 30)
y = np.linspace(ylim[0], ylim[1], 30)
Y, X = np.meshgrid(y, x)
xy = np.vstack([X.ravel(), Y.ravel()]).T
P = model.decision_function(xy).reshape(X.shape)
 
# plot decision boundary and margins
ax.contour(X, Y, P, colors='k',
levels=[-1, 0, 1], alpha=0.5,
linestyles=['--', '-', '--'])
 
# plot support vectors
if plot_support:
ax.scatter(model.support_vectors_[:, 0],
model.support_vectors_[:, 1],
s=300, linewidth=1, facecolors='none');
ax.set_xlim(xlim)
ax.set_ylim(ylim)

それではSVMが学習した決定境界を表示してみます。

1
2
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='brg')
plot_svc_decision_function(model);

この実線が、SVMが学習した、このデータセットでのマージン(点線までの距離)を最大化する直線(決定境界)ということになります。 このようにして、SVMは学習を行います。

5. 異なるトレーニングデータ数での結果の比較

以下を実行することで、このSVMモデルを異なるトレーニングデータ数でフィッティングしたときの結果をインタラクティブに見ることができます。

最終行のN=[]の中の数字を変えることで、好きなデータ数での結果を見比べることができます。 ぜひいろいろと試してみて、決定境界の変化を追ってみてください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def plot_svm(N=N, ax=None):
X, y = make_blobs(n_samples=200, centers=2,
random_state=0, cluster_std=0.60)
X = X[:N]
y = y[:N]
model = SVC(kernel='linear', C=1E10)
model.fit(X, y)
 
ax = ax or plt.gca()
ax.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='brg')
ax.set_xlim(-1, 4)
ax.set_ylim(-1, 6)
plot_svc_decision_function(model, ax)
 
from ipywidgets import interact, fixed
interact(plot_svm, N=[10, 50, 100, 200], ax=fixed(None));

以上がExample codeの内容になります。ぜひJupyter notebook上で動かして見て、理解を深めてください。

まとめ

今回はSupport Vector Machine (SVM) というアルゴリズムについて、コードを動かしながらその仕組みを見てきました。
SVMは特に分類問題によく使われる強力なアルゴリズムです。高速で信頼性も高く、少ないデータでもよい結果が期待できるため、ニューラルネットワークが台頭してきた今も根強い人気があります。今後も覚えておいて損はないアルゴリズムです。

あなたも、Avintonでこのような最先端技術に日常的に
取り組んでみませんか?

優秀なエンジニアの成長を導きながら、AIやビッグデータなどの最先端技術を活用していくことが私たちのビジョンです。
Avintonの充実した技術研修でスキルアップを図り、あなたのキャリア目標を達成しませんか?

採用情報

採用情報

採用情報

Avinton SDGs

SDGsへの貢献

Search

タグ

AI AI Big Data Big Data ccna Digital Transformation DX IoT LPIC Python Ruby SDGs Webエンジニア イベント インタビュー インフラエンジニア エンジニア オンラインセミナー キャリアチェンジ サーバーエンジニア システム開発 セミナー データサイエンス データサイエンティス データベース データ分析 データ解析 ネットワークエンジニア ビックデータ ボランティア 人工知能 勉強会 営業 就職活動 技術インターン 採用 新卒 新卒採用 新規事業 機械学習 派遣 深層学習 社員インタビュー 経営者交流会 転職
© 2022 Avinton | All Rights Reserved | プライバシーポリシー
  • サービス
    • Avinton Data Platform
    • エッジAIカメラ
    • プライベートクラウド
    • AIサービス開発
    • AI画像解析 – 無償PoC
  • 最新情報
    • ニュースリリース&イベント情報
    • 技術ブログ&インタビュー
  • アカデミー
    • Avintonアカデミー
    • Academy on Campus
  • 採用情報
    • Avintonで働く魅力
    • 新卒採用
    • プロジェクトコーディネーター職紹介
    • 求人
    • よくある質問
  • 企業情報
    • 会社概要
    • 代表からご挨拶
    • SDGsへの貢献
  • お問い合わせ
  • 日本語
    • English (英語)
Avintonジャパン株式会社