最終投稿日:2022年6月18日
ライブラリ(scikit learn)
機械学習
※Anaconda3 をインストールしてればあります
● 機械学習の分類
教師あり学習 データと共に正解が与えられる。未知のデータに対して予測を行う
教師なし学習 正解データは与えられない。未知のデータから規則性を発見する
強化学習 行動により部分的に正解が与えられる。データから最適な解をみつける
教師なし学習 正解データは与えられない。未知のデータから規則性を発見する
強化学習 行動により部分的に正解が与えられる。データから最適な解をみつける
● 機械学習でできる事
○ クラス分類(Classification)
与えられたデータに対してラベルを付けて分類する事ができる。(手書き文字の識別等)
○ グループ分け クラスタリング(Clustering)
値の類似性を元にしてデータを複数のグループに分ける事ができる。(ユーザーの分類等)
○ 推薦(Recommendation)
与えられたデータから異なる情報を推薦するもの。(ネットショップのレコメンド等)
○ 回帰(Rertession)
過去のデータから、未来の数値を予測するのに利用する。(株価の予想等)
○ 次元削減(Dimensionality Reduction)
データの特徴を維持しつつ、データ量を減らす事ができる。
● データセットの読込み
ライブラリ scikit learn には、あらかじめ登録されているデータセットがあります。
データセットは datasets メソッドから呼び出す事ができます。
例)
例)
print(digits.DESCR) ※説明をダンプできます。
読込んだデータの構造を調べる
target は、教師データなので data の行数分の1次元配列になっています data の1行目をダンプしてみる
print(digits.data[0]) 結果)
例)
print(digits.target[0:10]) 結果)
データセットは datasets メソッドから呼び出す事ができます。
例)
from sklearn import datasets
digits = datasets.load_digits() ※手書き文字データセット
print(dir(digits)) ※データセットの内容のインデックスが参照できる
結果)
['DESCR', 'data', 'images', 'target', 'target_names']
上記のインデックスは以下の様な内容となります。
digits = datasets.load_digits() ※手書き文字データセット
print(dir(digits)) ※データセットの内容のインデックスが参照できる
結果)
['DESCR', 'data', 'images', 'target', 'target_names']
| DESCR | データセットの説明文 |
| data | テストデータ |
| images | イメージデータ |
| target | イメージデータに対応する数字(教師データ) |
| target_names | target データの名前 |
print(digits.data.shape) ※(1797, 64)
print(digits.target.shape) ※(1797,)
data は、ダンプした説明にもあるように 8x8 のピクセルデータですprint(digits.target.shape) ※(1797,)
target は、教師データなので data の行数分の1次元配列になっています data の1行目をダンプしてみる
print(digits.data[0]) 結果)
[ 0. 0. 5. 13. 9. 1. 0. 0. 0. 0. 13. 15. 10. 15. 5. 0. 0. 3.
15. 2. 0. 11. 8. 0. 0. 4. 12. 0. 0. 8. 8. 0. 0. 5. 8. 0.
0. 9. 8. 0. 0. 4. 11. 0. 1. 12. 7. 0. 0. 2. 14. 5. 10. 12.
0. 0. 0. 0. 6. 13. 10. 0. 0. 0.]
target を10個をダンプしてみる15. 2. 0. 11. 8. 0. 0. 4. 12. 0. 0. 8. 8. 0. 0. 5. 8. 0.
0. 9. 8. 0. 0. 4. 11. 0. 1. 12. 7. 0. 0. 2. 14. 5. 10. 12.
0. 0. 0. 0. 6. 13. 10. 0. 0. 0.]
例)
print(digits.target[0:10]) 結果)
[0 1 2 3 4 5 6 7 8 9]
上記の様に、data の1行目が target(教師)の 0 に対応している事がわかります。
実際に画像で確認してみる
データセットには、images データもあるので、ライブラリ matplotlib を使い表示してみる
例)
上記を実行すると、1行目のデータの画像を確認する事ができます。
例)
from sklearn import datasets
import matplotlib.pyplot as plt
digits = datasets.load_digits()
plt.matshow(digits.images[0], cmap='Greys')
plt.show()
import matplotlib.pyplot as plt
digits = datasets.load_digits()
plt.matshow(digits.images[0], cmap='Greys')
plt.show()
学習させ、テストする
● 学習させ、テストする
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)) 【メモ】
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 メソッドの指定できる引数はここで確認できます。
【便利メソッド】
なので、(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 に変更になったらしい。。
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 に変更になったらしい。。
● 学習器(SVM)の種類について
ライブラリ scikit learn では、三種類の SVM に対応しています。
SVC 多分これが汎用的に使えるやつっぽい。。
NuSVC 基本的に SVC と同じ。エラー処理の仕方等が若干違うらしい
LinearSVC 線形カーネルに特化した SVM らしい。処理は速いが若干正解率が落ちるっぽい。。
NuSVC 基本的に SVC と同じ。エラー処理の仕方等が若干違うらしい
LinearSVC 線形カーネルに特化した SVM らしい。処理は速いが若干正解率が落ちるっぽい。。
● 自分でデータと答えを作る
XOR 演算を学習させる
XOR 演算とは比較する値が共に True または、False の場合は False となり、その他の場合は True となるものです。
総組み合わせ)
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, '×')
#学習させる内容(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, '×')
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, '×')



