from sklearn import
svm, datasets, metrics
digits = datasets.load_digits()
n = len(
digits.data) * 2 // 3
#学習用データ(2/3を取得)
train_data =
digits.data[:n]
#教師データ
train_ans =
digits.target[:n]
#テスト用データ(残りの1/3)
test_data =
digits.data[n:]
#テスト用答えデータ
test_ans =
digits.target[n:]
#学習器生成
clf =
svm.
SVC(gamma=0.001)
#学習させる
clf.fit(train_data, train_ans)
#テスト実施
pre =
clf.
predict(test_data)
#間違いの総数を確認
print((test_ans !=
pre).sum())
#metrics メソッドで結果の詳細を確認できる
print(metrics.classification_report(test_ans,
pre))
【メモ】
datasets メソッドや predict メソッドから取得できる配列は全て numpy 形式となっています。
なので、(test_ans != pre).sum() の様な計算もできます。
また、SVC メソッドの指定できる引数はここで確認できます。
【便利メソッド】
from sklearn import
model_selection
data_train, data_test, label_train, label_test =
model_selection.train_test_split(data, label,
test_size=0.2)
上記の設定で、「学習データ」「学習の回答」「テストデータ」「テストの解答」の4つの変数にデータを振り分けてくれます。
第1引数 学習総データ(2次元配列)
第2引数 答えデータ(1次元配列)
第3引数 テストの割合。上記の例だ他20%をテスト用データに振り分けます。
※昔は、cross_validation メソッドらしかったが、model_selection に変更になったらしい。。
XOR 演算を学習させる
XOR 演算とは比較する値が共に True または、False の場合は False となり、その他の場合は True となるものです。
総組み合わせ)
| 比較1 |
比較2 |
結果 |
| True |
True |
False |
| True |
False |
True |
| False |
True |
True |
| False |
False |
False |
○ 最初なので通常の配列でやってみる
from sklearn import svm, metrics
#学習させる内容(0列、1列がデータ、2列が答え)
xor_input = [
[0, 0, 0]
,[0, 1, 1]
,[1, 0, 1]
,[1, 1, 0]
]
data = []
label = []
for row in xor_input:
p = row[0]
q = row[1]
r = row[2]
#data にデータを格納
data.append([p, q])
#label に答えを格納
label.append(r)
#学習器を初期化
clf = svm.SVC()
#fit メソッドで学習させる。第1:データ、第2:答え
clf.fit(data, label)
#predict メソッドで学習した学習器に対して、新たな問題を与え答えを予測させる(データの数だけ答えを返却する)
pre = clf.predict(data)
print('予測結果', pre)
for idx, ans in enumerate(label):
#答え合わせ
if pre[idx] == ans:
#答えが正解ならこっちを処理する
print(' 詳細:', pre[idx], ans, '○')
else:
print(' 詳細:', pre[idx], ans, '×')
○ numpy ライブラリを使ってソースを簡略化する
import numpy as np
from sklearn import svm, metrics
d = [
[0, 0, 0]
,[0, 1, 1]
,[1, 0, 1]
,[1, 1, 0]
]
#numpy 配列へ変換
xor_input = np.array(d)
#data にデータを格納
data = xor_input[0:4,0:2]
#label に答えを格納(1次元配列にするため ravel メソッド使用)
label = xor_input[0:4,2:3].ravel()
clf = svm.SVC()
clf.fit(data, label)
pre = clf.predict(data)
print('予測結果', pre)
for idx, ans in enumerate(label):
if pre[idx] == ans:
print(' 詳細:', pre[idx], ans, '○')
else:
print(' 詳細:', pre[idx], ans, '×')