Scikit-learnで機械学習(SVMで分類する方法)

Scikit-learnで機械学習(SVMで分類する方法)

scikit-learnのSVM(サポートベクターマシン)を使った分類方法です。データはIrisを利用しています。

前回:Scikit-learnで機械学習(決定木で分類する方法)

SVM(サポートベクターマシン)を使ったIrisデータの分類方法


Irisデータ

scikit-learnに付属のIris(アヤメの計測データ)を利用しています。

Irisデータは『setosa』、『versicolor』、『virginica』という3種類の品種のアヤメの”がく片 (Sepal)”と”花弁 (Petal)” の幅および長さを150点計測したデータです。

sepal length(cm)がく片の長さ
sepal width(cm)がく片の幅
petal length(cm)花弁の長さ
petal width(cm)花弁の幅

Scikit-learn SVMでIrisデータを識別(データを確認しながら実行)

  • データセットの読み込みとKeys確認 [1,2]
  • 特徴データをPandasデータフレームに格納して内容確認 [3,4]
  • ターゲット(正解ラベル)の確認 [5,6]
  • Matplotlibでデータ可視化(かく片と花びらの長さでプロット) [7]
  • 訓練データとテストデータに分割 、件数確認 [8,9]
  • モデルの作成と訓練データで学習 [10]
  • テストデータで予測 [11]
  • テストデータの分類結果と正解率の確認 [12,13]
  • テストデータの分類結果をMatplotlibで可視化 [14,15]
In [1]:
# irisデータ読み込み
from sklearn import datasets
iris = datasets.load_iris()
In [2]:
# irisデータ確認
iris.keys()
Out[2]:
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names'])
In [3]:
import pandas as pd
iris_data =  pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_data.head()
Out[3]:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
In [4]:
iris_data.describe()
Out[4]:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
count 150.000000 150.000000 150.000000 150.000000
mean 5.843333 3.054000 3.758667 1.198667
std 0.828066 0.433594 1.764420 0.763161
min 4.300000 2.000000 1.000000 0.100000
25% 5.100000 2.800000 1.600000 0.300000
50% 5.800000 3.000000 4.350000 1.300000
75% 6.400000 3.300000 5.100000 1.800000
max 7.900000 4.400000 6.900000 2.500000
In [5]:
iris.target
Out[5]:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
In [6]:
iris.target_names
Out[6]:
array(['setosa', 'versicolor', 'virginica'], 
      dtype='<U10')
In [7]:
# x=Sepal(がく片),y=Petal(花びら)の長さでプロット
%matplotlib inline
import matplotlib.pyplot as plt
plt.xkcd() # 手書き風グラフ
import matplotlib.pyplot as plt
features = iris.data[:, [0, 2]]
plt.figure(figsize=(5, 5))
plt.title('Iris length data (all:n=150)')
plt.xlabel('sepal length (cm)')
plt.ylabel('petal length (cm)')

plt.scatter(*features.T, 
            c=[['c', 'm', 'y'][x] for x in iris.target],
            alpha=0.6)
Out[7]:
<matplotlib.collections.PathCollection at 0xaaa0e4ac>
In [8]:
# 訓練用とテスト用データに分割
from sklearn import datasets, model_selection
X_train, X_test, label_train, label_test = model_selection.train_test_split(
    iris.data, iris.target, test_size=0.3, random_state=0)
In [9]:
# 分割後のデータ件数
print('train:', len(X_train))
print('test:', len(X_test))
train: 105
test: 45
In [10]:
# 訓練データで学習
from sklearn import svm
clf = svm.SVC() # 分類器svm
clf.fit(X_train, label_train) # 学習
Out[10]:
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)
In [11]:
# テストデータで予測
pre = clf.predict(X_test)
In [12]:
print('予測結果', pre)
print('正解ラベル', label_test)
予測結果 [2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
 2 1 1 2 0 2 0 0]
正解ラベル [2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
 1 1 1 2 0 2 0 0]
In [13]:
from sklearn import metrics
ac_score = metrics.accuracy_score(label_test, pre)
print('正解率{0:.1f}%'.format(ac_score * 100))
正解率97.8%
In [14]:
%matplotlib inline
plt.xkcd() # 手書き風グラフ
import matplotlib.pyplot as plt

plt.figure(figsize=(5, 5))
features = X_test[:, [0, 2]]
plt.title('Iris length data (test:n=38)')
plt.xlabel('sepal length (cm)')
plt.ylabel('petal length (cm)')

# 予測結果プロット(n=45)
plt.scatter(*features.T,
            c=[['c', 'm', 'y'][x] for x in pre],
            alpha=0.6)
Out[14]:
<matplotlib.collections.PathCollection at 0xaa2e36ec>
In [15]:
plt.figure(figsize=(5, 5))
features = X_test[:, [0, 2]]
plt.title('Iris length data (test:n=38)')
plt.xlabel('sepal length (cm)')
plt.ylabel('petal length (cm)')

# 予測不正解を赤でプロット(1/45)
plt.scatter(*features.T,
            c=[['c', 'm', 'y'][ans] if ans == x else 'r' for ans, x in zip(label_test, pre)],
            alpha=0.6) 
Out[15]:
<matplotlib.collections.PathCollection at 0xaa23c9cc>

Scikit-learn SVMでIrisデータを識別(処理まとめ)

In [1]:
from sklearn import datasets, model_selection , svm, metrics

# irisデータ読み込み
iris = datasets.load_iris()

# 訓練用とテスト用データに分割
X_train, X_test, label_train, label_test = model_selection.train_test_split(
    iris.data, iris.target, test_size=0.3, random_state=0)

# 訓練データで学習
clf = svm.SVC() # 分類器svm
clf.fit(X_train, label_train) # 学習

# テストデータで予測
pre = clf.predict(X_test)

# 予測結果の正解率
ac_score = metrics.accuracy_score(label_test, pre)
print('正解率{0:.1f}%'.format(ac_score * 100))
正解率97.8%


スポンサーリンク

0 件のコメント :

コメントを投稿