Pythonによるサポートベクターマシンを実装してみた

スポンサーリンク

機械学習アルゴリズムの実装となると、線形回帰から決定木までがリストアップされる。

これらは様々なタイプがある。

主に線形軸に沿ったデータポイントの分離に関して、専門家からの推奨は以下の通りです。

  1. K-meansクラスタリング
  2. サポートベクターマシン

MLモデルには2つのタイプがあることはご存知の通りです.

  1. 教師あり学習.教師あり学習:プログラマが入力データを選択するためのガイドを必要とする.
  2. 教師なし学習(Unsupervised Learning).入力データの選択ガイドを必要としない。自ら学習するモデル。
スポンサーリンク

一般論

この記事の主な目的は、SVMという技術がどのように機能するかを読者に知ってもらうことです。

インターネット上では、データは生で入手できる。

そこで、データを構造化して可視化すると、結果は離散分布か連続分布のどちらかになる。

これによると、SVMは2つの目的で使われる。

  1. 分類のため。離散的なデータのパラメータに対して。
  2. 回帰(Regression): 連続的なデータパラメータを対象とします。

サポートベクターマシンが分類や回帰の目的で高度に利用される主な理由の1つはこれです。

定義によると、次のようになる。

サポートベクターマシンとは、データの性質を分類・分析するための学習アルゴリズムの一群です。

SVMの構成要素

  1. サポートベクトル。これらは主要な構成要素である.最大余白の両側にある単純なデータ点です。
  2. 最大マージン。データの分類が行われるまでの最大限界。
    1. 最大マージン超平面。正の超平面と負の超平面の間にある最大限の中間マージン。
  3. 正の超平面。マージン平面の右側。
    1. 負の超平面。マージン面の左側。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from warnings import filterwarnings
filterwarnings("ignore")

この図では、主なマージンが色によってすべての異なるデータポイントを分離していることがよくわかる。

我々は、それらの違いの性質を示すために、色を使用しています。

SVMの主な目的は、各ポイントの違いを示し、最適なマージン線で分類することです。

例と応用

あるクラスがあるとします。

Vehicle というクラスがあるとします。

私たちのタスクは、そのクラスからSUV(Sports Utility Vehicle)を取得することです。

さて、他にも様々な種類があります。

ここで、それらを手動で順番に並べようとすると、多くの時間がかかる可能性があります。

また、エラーも発生します。

そこで、分類をより安定させるために、親車両クラスからすべての車種を分類するサポートベクターマシンを作成することができます

これは以下のステップで動作します。

    1. モデルがサンプル画像を取得します。
    1. それを、すでに提供されている車種のテストデータと比較します。
    1. その後、その入力画像にどのような車種があるのかを教えてくれます。
  1. 4.SVMほどシンプルなアルゴリズムは他にない。

サポートベクターマシンの実装

この章では、サポートベクターマシンに必要な実装を全て実装します。

データフレームから2つのクラスを分離する

がん細胞の種類を分類するために、2種類の細胞を用意しました。

  1. 悪性:我々のデータセットでは値=4
  2. 良性: データセットでは値 = 2

同じ名前の2つのデータフレームを作成します。

そして、データ可視化技術を使って分類してみる。

コアデータセットから最初の50個の値だけを取り出します。

こうすることでプロットが容易になる。

cancer_data = pd.read_csv("Datasets/cell_samples.csv", sep = ",")
cancer_data.head()
cancer_Data.isna().sum()
print("The shape of the dataset is: ", cancer_data.shape)
print("The size of the dataset is: ", cancer_data.size, " bytes
"
)
print("The count of each attribute of the dataset is:
"
)
print(cancer_data.count())
print("
The datatype of each attribute is:
"
)
print(cancer_data.dtypes)

独立データ列と従属データ列のリストとその numpy 配列を作成します。

The shape of the dataset is:  (699, 11)
The size of the dataset is:  7689  bytes
 
The count of each attribute of the dataset is:
 
ID             699
Clump          699
UnifSize       699
UnifShape      699
MargAdh        699
SingEpiSize    699
BareNuc        699
BlandChrom     699
NormNucl       699
Mit            699
Class          699
dtype: int64
 
The datatype of each attribute is:
 
ID              int64
Clump           int64
UnifSize        int64
UnifShape       int64
MargAdh         int64
SingEpiSize     int64
BareNuc        object
BlandChrom      int64
NormNucl        int64
Mit             int64
Class           int64
dtype: object

結果は以下の通りです。

cancer_data = cancer_data[pd.to_numeric(cancer_data["BareNuc"], errors = "coerce").notnull()]
cancer_data["BareNuc"] = cancer_data["BareNuc"].astype("int")
cancer_data.dtypes

データをtrainとtestの変数に分割する

sklearn.model_selectionからtrain_test_split関数をインポートします。

これは、データを4つの配列に分割します。

  1. X_train
  2. X_test
    y.
    y. yxx_test

このうち、training 配列は tow dimensional で、testing 配列は one dimensional です。

モデルの精度をテストするために、全データセットの20%だけが必要なので、test_size = 0.2であることを忘れないでください。

ID             int64
Clump          int64
UnifSize       int64
UnifShape      int64
MargAdh        int64
SingEpiSize    int64
BareNuc        int32
BlandChrom     int64
NormNucl       int64
Mit            int64
Class          int64
dtype: object

結果は以下の通りです。

malignant = cancer_data[cancer_data["Class"] == 4][0:50]
benign = cancer_data[cancer_data["Class"] == 2][0:50]

sklearnからSVMをインポートして分類器のインスタンスを作成する

まずモデルをインポートし、次にSVCをインポートします。

これはサポートベクトルを分離するための分類器クラスです。

インスタンス “Classify “を作成します。

カーネルの値を “linear “とすると、サポートベクトルが線形に分離されます。

次に、X_trainデータとY_trainデータをfit()関数でモデル内にフィットさせます。

その後、すべての予測値を1次元配列で保持するインスタンス “yxx_predict “を作成します。

plt.figure(figsize = (10, 5))
ax = plt.axes()
ax.set_facecolor("white")
plt.title("Separating the data points - Clump and UniformShape")
plt.scatter(malignant["Clump"], malignant["UnifShape"] , color = "red", marker = "*")
plt.scatter(benign["Clump"], benign["UnifShape"], color = "green", marker = "+")
plt.legend(["Malignant cell class", "Benign cell class"])
plt.show()

結果は以下の通りです。

dependent_data = cancer_data[["ID", "Class"]]
independent_data = cancer_data[['Clump', 'UnifSize', 'UnifShape', 'MargAdh', 'SingEpiSize',
       'BareNuc', 'BlandChrom', 'NormNucl', 'Mit']]
 
X_data = np.array(independent_data)
X_data[0:5]
 
Y_data = np.array(dependent_data["Class"])
Y_data[0:5]

というわけで、がん患者と非がん患者の分離に成功しました。

値として4を持っている細胞は癌であり、それに対して2が非癌です。

さて、予測値が得られたので、このモデルをどの程度正確か確認するために、Yxxx_test 配列に対して予測値を実行することができます

そのために、分類レポートを作成します。

クラシフィケーションレポートの作成

このために、sklearn.metricsモジュールからclassification_report関数をインポートする必要があります。

そして、print()関数の中でそれを呼び出します。

私たちは、それを私たちのYanthus_test配列でテストし、結果は次のようになります。

array([[ 5,  1,  1,  1,  2,  1,  3,  1,  1],
       [ 5,  4,  4,  5,  7, 10,  3,  2,  1],
       [ 3,  1,  1,  1,  2,  2,  3,  1,  1],
       [ 6,  8,  8,  1,  3,  4,  3,  7,  1],
       [ 4,  1,  1,  3,  2,  1,  3,  1,  1]], dtype=int64)
 
array([2, 2, 2, 2, 2], dtype=int64)

結果は、以下の通りです。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_data, Y_data, test_size = 0.2, random_state = 4)
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)

この結果から、モデルの精度は非常に高いことがわかります。

悪性クラス(value = 4)の場合。

精度スコアは、100%です。

良性クラス(value = 2)については、精度スコアは: 90%です。

まとめ

このように、Pythonを使ってサポートベクターマシンを実装し、与えられた入力データから予測モデルを構築することに成功しました。

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