scikit-learn (sklearn) による学習 (SVM)

scikit-learn (sklearn) による学習を行う。ここではサポートベクトルマシンを用いる。

In [1]:
import csv
import random
from matplotlib import pyplot as plt
%matplotlib inline

from sklearn import svm

モジュールのインポート。

In [2]:
reader = csv.reader(open('data.csv', 'r'))

next(reader)
data = [r for r in reader]

n = len(data)

min1 = min([float(d[1]) for d in data])
max1 = max([float(d[1]) for d in data])
min2 = min([float(d[2]) for d in data])
max2 = max([float(d[2]) for d in data])

input_data = []
output_data = []

for i in xrange(n):
    a = (float(data[i][1]) - min1)/(max1 - min1)
    b = (float(data[i][2]) - min2)/(max2 - min2)
    input_data.append([a, b])
    output_data.append(float(data[i][0]))

データの用意。

In [3]:
c = svm.SVC()
c.fit(input_data, output_data);

学習。

In [4]:
result = [c.predict([input_data[i]]) for i in xrange(n)]

予測データの取得。

In [5]:
count = 0
for i in xrange(n):
    if result[i] >= 0.5:
        v = 1
    else:
        v = 0
    
    if output_data[i] == v:
        count += 1

print 'n = ', n, 'right = ', count, '(%.2f %%)' % (100.*count/n)
n =  200 right =  183 (91.50 %)

成績。そこそこの予測精度である。

In [6]:
data0_a = [input_data[i][0]*(max1 - min1) + min1 for i in xrange(n) if result[i] < 0.5]
data0_b = [input_data[i][1]*(max2 - min2) + min2 for i in xrange(n) if result[i] < 0.5]
data1_a = [input_data[i][0]*(max1 - min1) + min1 for i in xrange(n) if result[i] >= 0.5]
data1_b = [input_data[i][1]*(max2 - min2) + min2 for i in xrange(n) if result[i] >= 0.5]

plt.plot(data0_a, data0_b, '+')
plt.plot(data1_a, data1_b, 'r+');

学習結果。

In [7]:
random.seed(2)

data0_a = []
data0_b = []
data1_a = []
data1_b = []

for i in xrange(n):
    a = random.random()
    b = random.random()

    r = c.predict([[a, b]])
    
    if r < 0.5:
        data0_a.append(a*(max1 - min1) + min1)
        data0_b.append(b*(max2 - min2) + min2)
    else:
        data1_a.append(a*(max1 - min1) + min1)
        data1_b.append(b*(max2 - min2) + min2)

plt.plot(data0_a, data0_b, '+')
plt.plot(data1_a, data1_b, 'r+');

ランダムに選んだ点における予測結果。結果が PyBrain のものに似ている。