機械学習アルゴリズムの実装となると、線形回帰から決定木までがリストアップされる。
これらは様々なタイプがある。
主に線形軸に沿ったデータポイントの分離に関して、専門家からの推奨は以下の通りです。
- K-meansクラスタリング
- サポートベクターマシン
MLモデルには2つのタイプがあることはご存知の通りです.
- 教師あり学習.教師あり学習:プログラマが入力データを選択するためのガイドを必要とする.
- 教師なし学習(Unsupervised Learning).入力データの選択ガイドを必要としない。自ら学習するモデル。
この記事もチェック:知っておきたいPythonの機械学習アルゴリズムTOP5
一般論
この記事の主な目的は、SVMという技術がどのように機能するかを読者に知ってもらうことです。
インターネット上では、データは生で入手できる。
そこで、データを構造化して可視化すると、結果は離散分布か連続分布のどちらかになる。
これによると、SVMは2つの目的で使われる。
- 分類のため。離散的なデータのパラメータに対して。
- 回帰(Regression): 連続的なデータパラメータを対象とします。
サポートベクターマシンが分類や回帰の目的で高度に利用される主な理由の1つはこれです。
定義によると、次のようになる。
サポートベクターマシンとは、データの性質を分類・分析するための学習アルゴリズムの一群です。
SVMの構成要素
- サポートベクトル。これらは主要な構成要素である.最大余白の両側にある単純なデータ点です。
- 最大マージン。データの分類が行われるまでの最大限界。
-
- 最大マージン超平面。正の超平面と負の超平面の間にある最大限の中間マージン。
- 正の超平面。マージン平面の右側。
-
- 負の超平面。マージン面の左側。
図
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)を取得することです。
さて、他にも様々な種類があります。
ここで、それらを手動で順番に並べようとすると、多くの時間がかかる可能性があります。
また、エラーも発生します。
そこで、分類をより安定させるために、親車両クラスからすべての車種を分類するサポートベクターマシンを作成することができます。
これは以下のステップで動作します。
-
- モデルがサンプル画像を取得します。
-
- それを、すでに提供されている車種のテストデータと比較します。
-
- その後、その入力画像にどのような車種があるのかを教えてくれます。
- 4.SVMほどシンプルなアルゴリズムは他にない。
サポートベクターマシンの実装
この章では、サポートベクターマシンに必要な実装を全て実装します。
データフレームから2つのクラスを分離する
がん細胞の種類を分類するために、2種類の細胞を用意しました。
- 悪性:我々のデータセットでは値=4
- 良性: データセットでは値 = 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 ( " )
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つの配列に分割します。
- X_train
- 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でデータセットから別のデータセットへピボットテーブルを作成する
まとめ
このように、Pythonを使ってサポートベクターマシンを実装し、与えられた入力データから予測モデルを構築することに成功しました。