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% という値が出ているからよしとしよう。