mlpy (Machine Learning Python) の SVM を試す

mlpy : http://mlpy.sourceforge.net/

例題として,UCI Repository で提供されている "Breast Cancer Wisconsin (Original) Data Set" を用いる。
http://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+(Original)

  • サンプル数:683 (本来のサンプル数 699個から missing value をもつ 16個を除いた)
  • 次元数 : 9

最初に numpy を利用してデータを読み込む。

>>> import numpy as np
>>> f = np.loadtxt("breast-cancer-wisconsin.data",dtype='int',delimiter=',')
>>> print f
[[1000025       5       1 ...,       1       1       2]
 [1002945       5       4 ...,       2       1       2]
 [1015425       3       1 ...,       1       1       2]
 ..., 
 [ 888820       5      10 ...,      10       2       4]
 [ 897471       4       8 ...,       6       1       4]
 [ 897471       4       8 ...,       4       1       4]]
>>> print f.shape
(683, 11)

ラベルは "2" と "4" の二値。"-1" と "+1" でなくて大丈夫かという不安はあるが,(とりあえず)このまま突っ走る。

データ全体を眺めてみると,ラベルの値がランダムに並んでいるみたいだから,前半 343個を学習用,後半340個をテスト用とする。
1列目が ID number ゆえ不要。また,最終列がクラス番号ゆえ,以下のように学習用サンプル trainx, 学習用ラベル trainy,テスト用サンプル testx,テスト用ラベル testy を設定する。

>>> trainx = f[0:343,1:10]
>>> trainy = f[0:343,10]
>>> testx = f[343:,1:10]
>>> testy = f[343:,10]

>>> trainx.shape
(343, 9)
>>> testy.shape
(340,)

線形 SVM を設定し,学習および分類を行う。mlpy.LibSvm.learn と mlpy.LibSvm.pred を動かすだけのお手軽さ。

>>> svm = mlpy.LibSvm()
>>> svm.learn(trainx,trainy)
>>> result = svm.pred(testx)

分類結果とテストデータの正解ラベルとを比較する。

>>> rate = 0
>>> for i in range(340):
    if result[i] == testy[i]:
       rate = rate + 1

            
>>> print rate, rate / 340.0
335 0.985294117647

学習データが多すぎたためか分類精度は 98.5% と高い。
まぁ,でも
http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.names
に示されている "Past Usage" でも 93.5% や 95.9% という値が出ているからよしとしよう。